123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290open!ImportincludeObj_intf.Definitionsexternal%templatemagic:('a:any)('b:any).('a[@local_opt])@copu->('b[@local_opt])@copu@@stateless="%obj_magic"[@@layout_poly][@@modec=(uncontended,shared,contended,read,immutable),o=(many,once),p=(nonportable,shareable,portable,reading,stateless),u=(aliased,unique)]external%templatemagic_portable:('a:any).('a[@local_opt])@cou->('a[@local_opt])@coportableu@@portable="%identity"[@@layout_poly][@@modec=(uncontended,shared,contended,read,immutable),o=(many,once),u=(aliased,unique)]external%templatemagic_uncontended:('a:any).('a[@local_opt])@contendedopu->('a[@local_opt])@opu@@portable="%identity"[@@layout_poly][@@modeo=(many,once),p=(nonportable,shareable,portable,reading,stateless),u=(aliased,unique)]external%templatemagic_many:('a:any).('a[@local_opt])@concepu->('a[@local_opt])@cpu@@portable="%identity"[@@layout_poly][@@modec=(uncontended,shared,contended),p=(nonportable,portable),u=(aliased,unique)]external%templatemagic_unyielding:('a:any).'a@clocalopuyielding->'a@clocalopuunyielding@@stateless="%identity"[@@layout_poly][@@modec=(uncontended,shared,contended),o=(many,once),p=(nonportable,portable),u=(aliased,unique)]external%templatemagic_unique:('a:any).('a[@local_opt])@cop->('a[@local_opt])@copunique@@stateless="%identity"[@@layout_poly][@@modec=(uncontended,shared,contended),o=(many,once),p=(nonportable,portable)]external%templatemagic_read_write_uncontended:('a:any).('a[@local_opt])@immutableopu->('a[@local_opt])@opu@@portable="%identity"[@@layout_poly][@@modeo=(many,once),p=(nonportable,portable),u=(aliased,unique)]module%template[@inline][@kind.explicitk=(value,value_or_null)]Make(T:sig@@portabletypet:kvalis_immediate:t@contendedlocalonce->bool[@@zero_alloc]end)=structopenTexternal%templaterepr:('a:k).('a[@local_opt])@copu->(t[@local_opt])@copu@@portable="%obj_magic"[@@modec=(uncontended,shared,contended,read,write,immutable),o=(many,once),p=(nonportable,portable),u=(aliased,unique)]externaldup:t->t@@portable="%obj_dup"externaltag:t@contendedlocalonce->int@@portable="caml_obj_tag"[@@noalloc]externalsize:t@contendedlocalonce->int@@portable="%obj_size"(** Flambda2 attempts to track whether a block is an array, and %obj_size and %obj_field
may only be used on unspecialized blocks. Hence we wrap them with [opaque_identity],
which makes Flambda2 forget any additional information about the block. *)let%template[@inlinealways]sizet=size((Sys.opaque_identity[@modecontendedoncenonportablealiased])t);;let[@inline]is_immediatet=is_immediatetlet[@inline]is_blockt=not(is_immediatet)externalis_stack:t@contendedlocalonce->bool@@portable="caml_obj_is_stack"[@@noalloc]let%templatestack_or_heaprepr:stack_or_heap=(* [is_immediate] and [is_stack] do not actually consume [repr]. *)letrepr=(magic_many[@modecontendednonportablealiased])reprinifis_immediatereprthenImmediateelse(matchSys.backend_typewith|Sys.Native->ifis_stackreprthenStackelseHeap|Sys.Bytecode->Heap|Sys.Other_->Heap);;externalreserved_header_bits:t@contendedlocalonce->int@@portable="caml_succ_scannable_prefix_len"[@@noalloc]let%templateuniform_or_mixedrepr:uniform_or_mixed=exclave_(* [is_immediate] and [reserved_header_bits] do not actually consume [repr]. *)letrepr=(magic_many[@modecontendednonportablealiased])reprinifis_immediatereprthenImmediateelse(matchSys.backend_typewith|Sys.Native->(matchreserved_header_bitsreprwith|0->Uniform|n->Mixed{scannable_prefix_len=n-1})|Sys.Bytecode->Uniform|Sys.Other_->Uniform);;externalreachable_words:t->int@@portable="caml_obj_reachable_words"moduleExpert=structexternal%templateobj:('a:k).(t[@local_opt])@copu->('a[@local_opt])@copu@@portable="%obj_magic"[@@modec=(uncontended,shared,contended),o=(many,once),p=(nonportable,portable),u=(aliased,unique)]externalfield:(t[@local_opt])->int->(t[@local_opt])@@portable="%obj_field"(* We have to write both implementations because it doesn't make sense to template
over an allocator, but the local version needs exclave. If [Sys.opaque_identity]
preserved the fact that [t] is regional rather than local to this function, we
could instead write
{[
let%template[@mode m = (global, local)] [@inline always] field t i =
let t = Sys.opaque_identity t in
field i [@exclave_if_local m]
;;
]} *)let[@inlinealways][@modelocal]fieldti=exclave_field(Sys.opaque_identityt)ilet[@inlinealways]fieldti=field(Sys.opaque_identityt)iexternalset_field:(t[@local_opt])->int->t->unit@@portable="%obj_set_field"let%template[@inlinealways]set_fieldtif=set_field(Sys.opaque_identityt)if[@@model=(local,global)];;externalraw_field:(t[@local_opt])->int->raw_data@@portable="caml_obj_raw_field"externalset_raw_field:(t[@local_opt])->int->raw_data->unit@@portable="caml_obj_set_raw_field"endendtypet=Stdlib.Obj.texternalis_int:t@contendedlocalonce->bool@@portable="%obj_is_int"include%templateMake[@kind.explicitvalue](structtypenonrect=tlet[@inline]is_immediatet=is_inttend)externaluniquely_reachable_words:tarray->intarray*int@@portable="caml_obj_uniquely_reachable_words"letfirst_non_constant_constructor_tag=Stdlib.Obj.first_non_constant_constructor_tagletlast_non_constant_constructor_tag=Stdlib.Obj.last_non_constant_constructor_tagletforcing_tag=Stdlib.Obj.forcing_tagletcont_tag=Stdlib.Obj.cont_tagletlazy_tag=Stdlib.Obj.lazy_tagletclosure_tag=Stdlib.Obj.closure_tagletobject_tag=Stdlib.Obj.object_tagletinfix_tag=Stdlib.Obj.infix_tagletforward_tag=Stdlib.Obj.forward_tagletno_scan_tag=Stdlib.Obj.no_scan_tagletabstract_tag=Stdlib.Obj.abstract_tagletstring_tag=Stdlib.Obj.string_tagletdouble_tag=Stdlib.Obj.double_tagletdouble_array_tag=Stdlib.Obj.double_array_tagletcustom_tag=Stdlib.Obj.custom_tagletint_tag=Stdlib.Obj.int_tagletout_of_heap_tag=Stdlib.Obj.out_of_heap_tagletunaligned_tag=Stdlib.Obj.unaligned_tagmoduleEphemeron=structincludeStdlib.EphemeronendmoduleExpert=structincludeStdlib.ObjincludeExpertexternalnew_mixed_block:tag:int->total_words:int->scannable_words:int->t@@portable="Base_obj_new_mixed_block"endmoduleNullable=structtypet:value_or_nullexternalis_int:t@contendedlocalonce->bool@@portable="%obj_is_int"externalis_null:t@immutablelocalonce->bool@@portable="%is_null"include%templateMake[@kind.explicitvalue_or_null](structtypenonrect=t[%%templateletis_immediatet=lett=(magic_many[@modecontendednonportablealiased])tinis_intt||is_nullt[@@inline];;]end)letnull_tag=1010externalof_or_null:(Stdlib.Obj.tor_null[@local_opt])->(t[@local_opt])@@portable="%identity"externalto_or_null:(t[@local_opt])->(Stdlib.Obj.tor_null[@local_opt])@@portable="%identity"endexternalnullable:(t[@local_opt])->(Nullable.t[@local_opt])@@portable="%obj_magic"