@@ -790,23 +790,29 @@ let int_array_ref arr ofs dbg =
790
790
let unboxed_float_array_ref arr ofs dbg =
791
791
Cop (Cload (Double , Mutable ),
792
792
[array_indexing log2_size_float arr ofs dbg], dbg)
793
- let float_array_ref arr ofs dbg =
794
- box_float dbg Lambda. alloc_heap (unboxed_float_array_ref arr ofs dbg)
793
+ let float_array_ref mode arr ofs dbg =
794
+ box_float dbg mode (unboxed_float_array_ref arr ofs dbg)
795
795
796
- let addr_array_set arr ofs newval dbg =
796
+ let addr_array_set_heap arr ofs newval dbg =
797
797
Cop (Cextcall (" caml_modify" , typ_void, [] , false ),
798
798
[array_indexing log2_size_addr arr ofs dbg; newval], dbg)
799
+
800
+ let addr_array_set_local arr ofs newval dbg =
801
+ Cop (Cextcall (" caml_modify_local" , typ_void, [] , false ),
802
+ [arr; untag_int ofs dbg; newval], dbg)
803
+
804
+ let addr_array_set (mode : Lambda.modify_mode ) arr ofs newval dbg =
805
+ match mode with
806
+ | Modify_heap -> addr_array_set_heap arr ofs newval dbg
807
+ | Modify_maybe_stack -> addr_array_set_local arr ofs newval dbg
808
+ (* int and float arrays can be written to uniformly regardless of their mode *)
799
809
let int_array_set arr ofs newval dbg =
800
810
Cop (Cstore (Word_int , Assignment ),
801
811
[array_indexing log2_size_addr arr ofs dbg; newval], dbg)
802
812
let float_array_set arr ofs newval dbg =
803
813
Cop (Cstore (Double , Assignment ),
804
814
[array_indexing log2_size_float arr ofs dbg; newval], dbg)
805
815
806
- let addr_array_set_local arr ofs newval dbg =
807
- Cop (Cextcall (" caml_modify_local" , typ_void, [] , false ),
808
- [arr; untag_int ofs dbg; newval], dbg)
809
-
810
816
let addr_array_initialize arr ofs newval dbg =
811
817
Cop (Cextcall (" caml_initialize" , typ_void, [] , false ),
812
818
[array_indexing log2_size_addr arr ofs dbg; newval], dbg)
@@ -2748,28 +2754,28 @@ let bigstring_load size unsafe mode arg1 arg2 dbg =
2748
2754
idx
2749
2755
(unaligned_load size ba_data idx dbg)))))
2750
2756
2751
- let arrayref_unsafe kind arg1 arg2 dbg =
2752
- match (kind : Lambda.array_kind ) with
2753
- | Pgenarray ->
2757
+ let arrayref_unsafe rkind arg1 arg2 dbg =
2758
+ match (rkind : Lambda.array_ref_kind ) with
2759
+ | Pgenarray_ref mode ->
2754
2760
bind " index" arg2 (fun idx ->
2755
2761
bind " arr" arg1 (fun arr ->
2756
2762
Cifthenelse (is_addr_array_ptr arr dbg,
2757
2763
dbg,
2758
2764
addr_array_ref arr idx dbg,
2759
2765
dbg,
2760
- float_array_ref arr idx dbg,
2766
+ float_array_ref mode arr idx dbg,
2761
2767
dbg, Any )))
2762
- | Paddrarray ->
2768
+ | Paddrarray_ref ->
2763
2769
addr_array_ref arg1 arg2 dbg
2764
- | Pintarray ->
2770
+ | Pintarray_ref ->
2765
2771
(* CR mshinwell: for int/addr_array_ref move "dbg" to first arg *)
2766
2772
int_array_ref arg1 arg2 dbg
2767
- | Pfloatarray ->
2768
- float_array_ref arg1 arg2 dbg
2773
+ | Pfloatarray_ref mode ->
2774
+ float_array_ref mode arg1 arg2 dbg
2769
2775
2770
- let arrayref_safe kind arg1 arg2 dbg =
2771
- match (kind : Lambda.array_kind ) with
2772
- | Pgenarray ->
2776
+ let arrayref_safe rkind arg1 arg2 dbg =
2777
+ match (rkind : Lambda.array_ref_kind ) with
2778
+ | Pgenarray_ref mode ->
2773
2779
bind " index" arg2 (fun idx ->
2774
2780
bind " arr" arg1 (fun arr ->
2775
2781
bind " header" (get_header_without_profinfo arr dbg) (fun hdr ->
@@ -2780,7 +2786,7 @@ let arrayref_safe kind arg1 arg2 dbg =
2780
2786
dbg,
2781
2787
addr_array_ref arr idx dbg,
2782
2788
dbg,
2783
- float_array_ref arr idx dbg,
2789
+ float_array_ref mode arr idx dbg,
2784
2790
dbg, Any ))
2785
2791
else
2786
2792
Cifthenelse (is_addr_array_hdr hdr dbg,
@@ -2791,42 +2797,42 @@ let arrayref_safe kind arg1 arg2 dbg =
2791
2797
dbg,
2792
2798
Csequence (
2793
2799
make_checkbound dbg [float_array_length_shifted hdr dbg; idx],
2794
- float_array_ref arr idx dbg),
2800
+ float_array_ref mode arr idx dbg),
2795
2801
dbg, Any ))))
2796
- | Paddrarray ->
2797
- bind " index" arg2 (fun idx ->
2798
- bind " arr" arg1 (fun arr ->
2799
- Csequence (
2800
- make_checkbound dbg [
2801
- addr_array_length_shifted
2802
- (get_header_without_profinfo arr dbg) dbg; idx],
2803
- addr_array_ref arr idx dbg)))
2804
- | Pintarray ->
2805
- bind " index" arg2 (fun idx ->
2806
- bind " arr" arg1 (fun arr ->
2807
- Csequence (
2808
- make_checkbound dbg [
2809
- addr_array_length_shifted
2810
- (get_header_without_profinfo arr dbg) dbg; idx],
2811
- int_array_ref arr idx dbg)))
2812
- | Pfloatarray ->
2813
- box_float dbg Lambda. alloc_heap (
2814
- bind " index" arg2 (fun idx ->
2815
- bind " arr" arg1 (fun arr ->
2816
- Csequence (
2817
- make_checkbound dbg [
2818
- float_array_length_shifted
2819
- (get_header_without_profinfo arr dbg) dbg;
2820
- idx],
2821
- unboxed_float_array_ref arr idx dbg))))
2802
+ | Paddrarray_ref ->
2803
+ bind " index" arg2 (fun idx ->
2804
+ bind " arr" arg1 (fun arr ->
2805
+ Csequence (
2806
+ make_checkbound dbg [
2807
+ addr_array_length_shifted
2808
+ (get_header_without_profinfo arr dbg) dbg; idx],
2809
+ addr_array_ref arr idx dbg)))
2810
+ | Pintarray_ref ->
2811
+ bind " index" arg2 (fun idx ->
2812
+ bind " arr" arg1 (fun arr ->
2813
+ Csequence (
2814
+ make_checkbound dbg [
2815
+ addr_array_length_shifted
2816
+ (get_header_without_profinfo arr dbg) dbg; idx],
2817
+ int_array_ref arr idx dbg)))
2818
+ | Pfloatarray_ref mode ->
2819
+ box_float dbg mode (
2820
+ bind " index" arg2 (fun idx ->
2821
+ bind " arr" arg1 (fun arr ->
2822
+ Csequence (
2823
+ make_checkbound dbg [
2824
+ float_array_length_shifted
2825
+ (get_header_without_profinfo arr dbg) dbg;
2826
+ idx],
2827
+ unboxed_float_array_ref arr idx dbg))))
2822
2828
2823
2829
type ternary_primitive =
2824
2830
expression -> expression -> expression -> Debuginfo .t -> expression
2825
2831
2826
2832
let setfield_computed ptr init arg1 arg2 arg3 dbg =
2827
2833
match assignment_kind ptr init with
2828
2834
| Caml_modify ->
2829
- return_unit dbg (addr_array_set arg1 arg2 arg3 dbg)
2835
+ return_unit dbg (addr_array_set_heap arg1 arg2 arg3 dbg)
2830
2836
| Caml_modify_local ->
2831
2837
return_unit dbg (addr_array_set_local arg1 arg2 arg3 dbg)
2832
2838
| Caml_initialize ->
@@ -2850,30 +2856,30 @@ let bytesset_safe arg1 arg2 arg3 dbg =
2850
2856
[add_int str idx dbg; newval],
2851
2857
dbg))))))
2852
2858
2853
- let arrayset_unsafe kind arg1 arg2 arg3 dbg =
2854
- return_unit dbg (match (kind : Lambda.array_kind ) with
2855
- | Pgenarray ->
2859
+ let arrayset_unsafe skind arg1 arg2 arg3 dbg =
2860
+ return_unit dbg (match (skind : Lambda.array_set_kind ) with
2861
+ | Pgenarray_set mode ->
2856
2862
bind " newval" arg3 (fun newval ->
2857
2863
bind " index" arg2 (fun index ->
2858
2864
bind " arr" arg1 (fun arr ->
2859
2865
Cifthenelse (is_addr_array_ptr arr dbg,
2860
2866
dbg,
2861
- addr_array_set arr index newval dbg,
2867
+ addr_array_set mode arr index newval dbg,
2862
2868
dbg,
2863
2869
float_array_set arr index (unbox_float dbg newval)
2864
2870
dbg,
2865
2871
dbg, Any ))))
2866
- | Paddrarray ->
2867
- addr_array_set arg1 arg2 arg3 dbg
2868
- | Pintarray ->
2872
+ | Paddrarray_set mode ->
2873
+ addr_array_set mode arg1 arg2 arg3 dbg
2874
+ | Pintarray_set ->
2869
2875
int_array_set arg1 arg2 arg3 dbg
2870
- | Pfloatarray ->
2876
+ | Pfloatarray_set ->
2871
2877
float_array_set arg1 arg2 arg3 dbg
2872
2878
)
2873
2879
2874
- let arrayset_safe kind arg1 arg2 arg3 dbg =
2875
- return_unit dbg (match (kind : Lambda.array_kind ) with
2876
- | Pgenarray ->
2880
+ let arrayset_safe skind arg1 arg2 arg3 dbg =
2881
+ return_unit dbg (match (skind : Lambda.array_set_kind ) with
2882
+ | Pgenarray_set mode ->
2877
2883
bind " newval" arg3 (fun newval ->
2878
2884
bind " index" arg2 (fun idx ->
2879
2885
bind " arr" arg1 (fun arr ->
@@ -2883,7 +2889,7 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
2883
2889
make_checkbound dbg [addr_array_length_shifted hdr dbg; idx],
2884
2890
Cifthenelse (is_addr_array_hdr hdr dbg,
2885
2891
dbg,
2886
- addr_array_set arr idx newval dbg,
2892
+ addr_array_set mode arr idx newval dbg,
2887
2893
dbg,
2888
2894
float_array_set arr idx
2889
2895
(unbox_float dbg newval)
@@ -2895,14 +2901,14 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
2895
2901
dbg,
2896
2902
Csequence (
2897
2903
make_checkbound dbg [addr_array_length_shifted hdr dbg; idx],
2898
- addr_array_set arr idx newval dbg),
2904
+ addr_array_set mode arr idx newval dbg),
2899
2905
dbg,
2900
2906
Csequence (
2901
2907
make_checkbound dbg [float_array_length_shifted hdr dbg; idx],
2902
2908
float_array_set arr idx
2903
2909
(unbox_float dbg newval) dbg),
2904
2910
dbg, Any )))))
2905
- | Paddrarray ->
2911
+ | Paddrarray_set mode ->
2906
2912
bind " newval" arg3 (fun newval ->
2907
2913
bind " index" arg2 (fun idx ->
2908
2914
bind " arr" arg1 (fun arr ->
@@ -2911,8 +2917,8 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
2911
2917
addr_array_length_shifted
2912
2918
(get_header_without_profinfo arr dbg) dbg;
2913
2919
idx],
2914
- addr_array_set arr idx newval dbg))))
2915
- | Pintarray ->
2920
+ addr_array_set mode arr idx newval dbg))))
2921
+ | Pintarray_set ->
2916
2922
bind " newval" arg3 (fun newval ->
2917
2923
bind " index" arg2 (fun idx ->
2918
2924
bind " arr" arg1 (fun arr ->
@@ -2922,7 +2928,7 @@ let arrayset_safe kind arg1 arg2 arg3 dbg =
2922
2928
(get_header_without_profinfo arr dbg) dbg;
2923
2929
idx],
2924
2930
int_array_set arr idx newval dbg))))
2925
- | Pfloatarray ->
2931
+ | Pfloatarray_set ->
2926
2932
bind_load " newval" arg3 (fun newval ->
2927
2933
bind " index" arg2 (fun idx ->
2928
2934
bind " arr" arg1 (fun arr ->
0 commit comments