22
22
* along with this program; if not, write to the Free Software
23
23
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *)
24
24
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
+
26
33
27
34
let get s i =
28
35
if i < 0 || i > = length s then
29
36
raise (Invalid_argument " index out of bounds" )
30
- else unsafe_get s i
37
+ else s. ! [i]
31
38
32
39
let caml_fill_bytes (s : bytes ) i l (c : char ) =
33
40
if l > 0 then
34
41
for k = i to l + i - 1 do
35
- unsafe_set s k c
42
+ s. ! [k] < - c
36
43
done
37
44
38
45
let caml_create_bytes len : bytes =
@@ -41,7 +48,7 @@ let caml_create_bytes len : bytes =
41
48
else
42
49
let result = new_uninitialized len in
43
50
for i = 0 to len - 1 do
44
- unsafe_set result i '\000'
51
+ result. ! [i] < - '\000'
45
52
done ;
46
53
result
47
54
@@ -53,14 +60,14 @@ let copyWithin (s1 : bytes) i1 i2 len =
53
60
let range_b = len - 1 in
54
61
let range = if range_a > range_b then range_b else range_a in
55
62
for j = range downto 0 do
56
- unsafe_set s1 ( i2 + j) (unsafe_get s1 ( i1 + j))
63
+ s1. ! [ i2 + j] < - s1. ! [ i1 + j]
57
64
done
58
65
else if i1 > i2 then
59
66
let range_a = length s1 - i1 - 1 in
60
67
let range_b = len - 1 in
61
68
let range = if range_a > range_b then range_b else range_a in
62
69
for k = 0 to range do
63
- unsafe_set s1 ( i2 + k) (unsafe_get s1 ( i1 + k))
70
+ s1. ! [ i2 + k] < - s1. ! [ i1 + k]
64
71
done
65
72
66
73
(* TODO: when the compiler could optimize small function calls,
@@ -74,20 +81,20 @@ let caml_blit_bytes (s1:bytes) i1 (s2:bytes) i2 len =
74
81
let off1 = length s1 - i1 in
75
82
if len < = off1 then
76
83
for i = 0 to len - 1 do
77
- unsafe_set s2 ( i2 + i) (unsafe_get s1 ( i1 + i))
84
+ s2. ! [ i2 + i] < - s1. ! [ i1 + i]
78
85
done
79
86
else
80
87
begin
81
88
for i = 0 to off1 - 1 do
82
- unsafe_set s2 ( i2 + i) (unsafe_get s1 ( i1 + i))
89
+ s2. ! [ i2 + i] < - s1. ! [ i1 + i]
83
90
done ;
84
91
for i = off1 to len - 1 do
85
- unsafe_set s2 ( i2 + i) '\000'
92
+ s2. ! [ i2 + i] < - '\000'
86
93
done
87
94
end
88
95
89
96
external to_int_array : bytes -> int array = " %identity"
90
- let string_of_large_bytes bytes i len =
97
+ let string_of_large_bytes ( bytes : bytes ) i len =
91
98
let s = ref " " in
92
99
let s_len = ref len in
93
100
let seg = 1024 in
@@ -118,15 +125,15 @@ let caml_blit_string (s1 : string) i1 (s2 : bytes) i2 (len : int ) =
118
125
let off1 = Caml_string_extern. length s1 - i1 in
119
126
if len < = off1 then
120
127
for i = 0 to len - 1 do
121
- unsafe_set s2 ( i2 + i) ( Caml_string_extern. unsafe_get s1 (i1 + i) )
128
+ s2. ! [ i2 + i] < - Caml_string_extern. unsafe_get s1 (i1 + i)
122
129
done
123
130
else
124
131
begin
125
132
for i = 0 to off1 - 1 do
126
- unsafe_set s2 ( i2 + i) ( Caml_string_extern. unsafe_get s1 (i1 + i) )
133
+ s2. ! [ i2 + i] < - Caml_string_extern. unsafe_get s1 (i1 + i)
127
134
done ;
128
135
for i = off1 to len - 1 do
129
- unsafe_set s2 ( i2 + i) '\000'
136
+ s2. ! [ i2 + i] < - '\000'
130
137
done
131
138
end
132
139
@@ -135,7 +142,7 @@ let bytes_of_string s =
135
142
let len = Caml_string_extern. length s in
136
143
let res = new_uninitialized len in
137
144
for i = 0 to len - 1 do
138
- unsafe_set res i ( Caml_string_extern. unsafe_get s i)
145
+ res. ! [i] < - Caml_string_extern. unsafe_get s i
139
146
(* Note that when get a char and convert it to int immedately, should be optimized
140
147
should be [s.charCodeAt[i]]
141
148
*)
@@ -145,7 +152,7 @@ let bytes_of_string s =
145
152
146
153
let rec caml_bytes_compare_aux (s1 : bytes ) (s2 : bytes ) off len def =
147
154
if off < len then
148
- let a, b = Caml_bytes_extern. unsafe_get s1 off, Caml_bytes_extern. unsafe_get s2 off in
155
+ let a, b = s1. ! [ off], s2. ! [ off] in
149
156
if a > b then 1
150
157
else if a < b then - 1
151
158
else caml_bytes_compare_aux s1 s2 (off + 1 ) len def
@@ -160,7 +167,7 @@ let bytes_of_string s =
160
167
161
168
*)
162
169
let caml_bytes_compare (s1 : bytes ) (s2 : bytes ) : int =
163
- let len1, len2 = Caml_bytes_extern. length s1, Caml_bytes_extern. length s2 in
170
+ let len1, len2 = length s1, length s2 in
164
171
if len1 = len2 then
165
172
caml_bytes_compare_aux s1 s2 0 len1 0
166
173
else if len1 < len2 then
@@ -171,12 +178,12 @@ let caml_bytes_compare (s1 : bytes) (s2 : bytes) : int =
171
178
let rec caml_bytes_equal_aux (s1 : bytes ) s2 (off : int ) len =
172
179
if off = len then true
173
180
else
174
- let a, b = Caml_bytes_extern. unsafe_get s1 off, Caml_bytes_extern. unsafe_get s2 off in
181
+ let a, b = s1. ! [ off], s2. ! [ off] in
175
182
a = b
176
183
&& caml_bytes_equal_aux s1 s2 (off + 1 ) len
177
184
178
185
let caml_bytes_equal (s1 : bytes ) (s2 : bytes ) : bool =
179
- let len1, len2 = Caml_bytes_extern. length s1, Caml_bytes_extern. length s2 in
186
+ let len1, len2 = length s1, length s2 in
180
187
len1 = len2 &&
181
188
caml_bytes_equal_aux s1 s2 0 len1
182
189
0 commit comments