2222 * along with this program; if not, write to the Free Software
2323 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *)
2424
25- open Caml_bytes_extern
25+
26+ external new_uninitialized : int -> bytes = " Array" [@@ bs.new ]
27+
28+ external (.! [] ) : bytes -> int -> char = " %bytes_unsafe_get"
29+ external (.! [] < - ) : bytes -> int -> char -> unit = " %bytes_unsafe_set"
30+ external length : bytes -> int = " %bytes_length"
31+
32+
33+ let set s i ch =
34+ if i < 0 || i > = length s then
35+ raise (Invalid_argument " index out of bounds" )
36+ else s.! [i] < - ch
2637
2738let get s i =
2839 if i < 0 || i > = length s then
2940 raise (Invalid_argument " index out of bounds" )
30- else unsafe_get s i
41+ else s. ! [i]
3142
3243let caml_fill_bytes (s : bytes ) i l (c : char ) =
3344 if l > 0 then
3445 for k = i to l + i - 1 do
35- unsafe_set s k c
46+ s. ! [k] < - c
3647 done
3748
3849let caml_create_bytes len : bytes =
@@ -41,7 +52,7 @@ let caml_create_bytes len : bytes =
4152 else
4253 let result = new_uninitialized len in
4354 for i = 0 to len - 1 do
44- unsafe_set result i '\000'
55+ result. ! [i] < - '\000'
4556 done ;
4657 result
4758
@@ -53,14 +64,14 @@ let copyWithin (s1 : bytes) i1 i2 len =
5364 let range_b = len - 1 in
5465 let range = if range_a > range_b then range_b else range_a in
5566 for j = range downto 0 do
56- unsafe_set s1 ( i2 + j) (unsafe_get s1 ( i1 + j))
67+ s1. ! [ i2 + j] < - s1. ! [ i1 + j]
5768 done
5869 else if i1 > i2 then
5970 let range_a = length s1 - i1 - 1 in
6071 let range_b = len - 1 in
6172 let range = if range_a > range_b then range_b else range_a in
6273 for k = 0 to range do
63- unsafe_set s1 ( i2 + k) (unsafe_get s1 ( i1 + k))
74+ s1. ! [ i2 + k] < - s1. ! [ i1 + k]
6475 done
6576
6677(* TODO: when the compiler could optimize small function calls,
@@ -74,20 +85,20 @@ let caml_blit_bytes (s1:bytes) i1 (s2:bytes) i2 len =
7485 let off1 = length s1 - i1 in
7586 if len < = off1 then
7687 for i = 0 to len - 1 do
77- unsafe_set s2 ( i2 + i) (unsafe_get s1 ( i1 + i))
88+ s2. ! [ i2 + i] < - s1. ! [ i1 + i]
7889 done
7990 else
8091 begin
8192 for i = 0 to off1 - 1 do
82- unsafe_set s2 ( i2 + i) (unsafe_get s1 ( i1 + i))
93+ s2. ! [ i2 + i] < - s1. ! [ i1 + i]
8394 done ;
8495 for i = off1 to len - 1 do
85- unsafe_set s2 ( i2 + i) '\000'
96+ s2. ! [ i2 + i] < - '\000'
8697 done
8798 end
8899
89100external to_int_array : bytes -> int array = " %identity"
90- let string_of_large_bytes bytes i len =
101+ let string_of_large_bytes ( bytes : bytes ) i len =
91102 let s = ref " " in
92103 let s_len = ref len in
93104 let seg = 1024 in
@@ -118,15 +129,15 @@ let caml_blit_string (s1 : string) i1 (s2 : bytes) i2 (len : int ) =
118129 let off1 = Caml_string_extern. length s1 - i1 in
119130 if len < = off1 then
120131 for i = 0 to len - 1 do
121- unsafe_set s2 ( i2 + i) ( Caml_string_extern. unsafe_get s1 (i1 + i) )
132+ s2. ! [ i2 + i] < - Caml_string_extern. unsafe_get s1 (i1 + i)
122133 done
123134 else
124135 begin
125136 for i = 0 to off1 - 1 do
126- unsafe_set s2 ( i2 + i) ( Caml_string_extern. unsafe_get s1 (i1 + i) )
137+ s2. ! [ i2 + i] < - Caml_string_extern. unsafe_get s1 (i1 + i)
127138 done ;
128139 for i = off1 to len - 1 do
129- unsafe_set s2 ( i2 + i) '\000'
140+ s2. ! [ i2 + i] < - '\000'
130141 done
131142 end
132143
@@ -135,7 +146,7 @@ let bytes_of_string s =
135146 let len = Caml_string_extern. length s in
136147 let res = new_uninitialized len in
137148 for i = 0 to len - 1 do
138- unsafe_set res i ( Caml_string_extern. unsafe_get s i)
149+ res. ! [i] < - Caml_string_extern. unsafe_get s i
139150 (* Note that when get a char and convert it to int immedately, should be optimized
140151 should be [s.charCodeAt[i]]
141152 *)
@@ -145,7 +156,7 @@ let bytes_of_string s =
145156
146157 let rec caml_bytes_compare_aux (s1 : bytes ) (s2 : bytes ) off len def =
147158 if off < len then
148- let a, b = Caml_bytes_extern. unsafe_get s1 off, Caml_bytes_extern. unsafe_get s2 off in
159+ let a, b = s1. ! [ off], s2. ! [ off] in
149160 if a > b then 1
150161 else if a < b then - 1
151162 else caml_bytes_compare_aux s1 s2 (off + 1 ) len def
@@ -160,7 +171,7 @@ let bytes_of_string s =
160171
161172*)
162173let caml_bytes_compare (s1 : bytes ) (s2 : bytes ) : int =
163- let len1, len2 = Caml_bytes_extern. length s1, Caml_bytes_extern. length s2 in
174+ let len1, len2 = length s1, length s2 in
164175 if len1 = len2 then
165176 caml_bytes_compare_aux s1 s2 0 len1 0
166177 else if len1 < len2 then
@@ -171,12 +182,12 @@ let caml_bytes_compare (s1 : bytes) (s2 : bytes) : int =
171182let rec caml_bytes_equal_aux (s1 : bytes ) s2 (off : int ) len =
172183 if off = len then true
173184 else
174- let a, b = Caml_bytes_extern. unsafe_get s1 off, Caml_bytes_extern. unsafe_get s2 off in
185+ let a, b = s1. ! [ off], s2. ! [ off] in
175186 a = b
176187 && caml_bytes_equal_aux s1 s2 (off + 1 ) len
177188
178189let caml_bytes_equal (s1 : bytes ) (s2 : bytes ) : bool =
179- let len1, len2 = Caml_bytes_extern. length s1, Caml_bytes_extern. length s2 in
190+ let len1, len2 = length s1, length s2 in
180191 len1 = len2 &&
181192 caml_bytes_equal_aux s1 s2 0 len1
182193
0 commit comments