@@ -101,8 +101,6 @@ export
101
101
native mod rustrt {
102
102
fn rust_str_push ( & s: str , ch : u8 ) ;
103
103
fn str_reserve_shared ( & ss: str , nn : libc:: size_t ) ;
104
- #[ rust_stack]
105
- fn upcall_vec_grow ( & s: str , new_sz : libc:: size_t ) ;
106
104
}
107
105
108
106
/*
@@ -145,66 +143,69 @@ fn push_char(&s: str, ch: char) unsafe {
145
143
else if code < max_four_b { 4 u }
146
144
else if code < max_five_b { 5 u }
147
145
else { 6 u } ;
148
- let mut repr: * vec:: unsafe:: vec_repr = :: unsafe:: reinterpret_cast ( s) ;
149
- let fill = ( * repr) . fill ;
150
- if fill + nb <= ( * repr) . alloc {
151
- ( * repr) . fill = fill + nb;
152
- } else {
153
- rustrt:: upcall_vec_grow ( s, fill + nb) ;
154
- // possibly realloc'd
155
- repr = :: unsafe:: reinterpret_cast ( s) ;
156
- }
157
- let off = fill - 1 u;
158
- if nb == 1 u {
159
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off) =
160
- code as u8 ;
161
- } else if nb == 2 u {
162
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off) =
163
- ( code >> 6 u & 31 u | tag_two_b) as u8 ;
164
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 1 u) =
165
- ( code & 63 u | tag_cont) as u8 ;
166
- } else if nb == 3 u {
167
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off) =
168
- ( code >> 12 u & 15 u | tag_three_b) as u8 ;
169
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 1 u) =
170
- ( code >> 6 u & 63 u | tag_cont) as u8 ;
171
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 2 u) =
172
- ( code & 63 u | tag_cont) as u8 ;
173
- } else if nb == 4 u {
174
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off) =
175
- ( code >> 18 u & 7 u | tag_four_b) as u8 ;
176
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 1 u) =
177
- ( code >> 12 u & 63 u | tag_cont) as u8 ;
178
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 2 u) =
179
- ( code >> 6 u & 63 u | tag_cont) as u8 ;
180
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 3 u) =
181
- ( code & 63 u | tag_cont) as u8 ;
182
- } else if nb == 5 u {
183
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off) =
184
- ( code >> 24 u & 3 u | tag_five_b) as u8 ;
185
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 1 u) =
186
- ( code >> 18 u & 63 u | tag_cont) as u8 ;
187
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 2 u) =
188
- ( code >> 12 u & 63 u | tag_cont) as u8 ;
189
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 3 u) =
190
- ( code >> 6 u & 63 u | tag_cont) as u8 ;
191
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 4 u) =
192
- ( code & 63 u | tag_cont) as u8 ;
193
- } else if nb == 6 u {
194
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off) =
195
- ( code >> 30 u & 1 u | tag_six_b) as u8 ;
196
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 1 u) =
197
- ( code >> 24 u & 63 u | tag_cont) as u8 ;
198
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 2 u) =
199
- ( code >> 18 u & 63 u | tag_cont) as u8 ;
200
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 3 u) =
201
- ( code >> 12 u & 63 u | tag_cont) as u8 ;
202
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 4 u) =
203
- ( code >> 6 u & 63 u | tag_cont) as u8 ;
204
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + 5 u) =
205
- ( code & 63 u | tag_cont) as u8 ;
206
- }
207
- * ptr:: mut_offset ( ptr:: mut_addr_of ( ( * repr) . data ) , off + nb) = 0u8 ;
146
+ let len = len ( s) ;
147
+ let new_len = len + nb;
148
+ reserve_at_least ( s, new_len) ;
149
+ let off = len;
150
+ as_buf ( s) { |buf|
151
+ let buf: * mut u8 = :: unsafe:: reinterpret_cast ( buf) ;
152
+ if nb == 1 u {
153
+ * ptr:: mut_offset ( buf, off) =
154
+ code as u8 ;
155
+ } else if nb == 2 u {
156
+ * ptr:: mut_offset ( buf, off) =
157
+ ( code >> 6 u & 31 u | tag_two_b) as u8 ;
158
+ * ptr:: mut_offset ( buf, off + 1 u) =
159
+ ( code & 63 u | tag_cont) as u8 ;
160
+ } else if nb == 3 u {
161
+ * ptr:: mut_offset ( buf, off) =
162
+ ( code >> 12 u & 15 u | tag_three_b) as u8 ;
163
+ * ptr:: mut_offset ( buf, off + 1 u) =
164
+ ( code >> 6 u & 63 u | tag_cont) as u8 ;
165
+ * ptr:: mut_offset ( buf, off + 2 u) =
166
+ ( code & 63 u | tag_cont) as u8 ;
167
+ } else if nb == 4 u {
168
+ * ptr:: mut_offset ( buf, off) =
169
+ ( code >> 18 u & 7 u | tag_four_b) as u8 ;
170
+ * ptr:: mut_offset ( buf, off + 1 u) =
171
+ ( code >> 12 u & 63 u | tag_cont) as u8 ;
172
+ * ptr:: mut_offset ( buf, off + 2 u) =
173
+ ( code >> 6 u & 63 u | tag_cont) as u8 ;
174
+ * ptr:: mut_offset ( buf, off + 3 u) =
175
+ ( code & 63 u | tag_cont) as u8 ;
176
+ } else if nb == 5 u {
177
+ * ptr:: mut_offset ( buf, off) =
178
+ ( code >> 24 u & 3 u | tag_five_b) as u8 ;
179
+ * ptr:: mut_offset ( buf, off + 1 u) =
180
+ ( code >> 18 u & 63 u | tag_cont) as u8 ;
181
+ * ptr:: mut_offset ( buf, off + 2 u) =
182
+ ( code >> 12 u & 63 u | tag_cont) as u8 ;
183
+ * ptr:: mut_offset ( buf, off + 3 u) =
184
+ ( code >> 6 u & 63 u | tag_cont) as u8 ;
185
+ * ptr:: mut_offset ( buf, off + 4 u) =
186
+ ( code & 63 u | tag_cont) as u8 ;
187
+ } else if nb == 6 u {
188
+ * ptr:: mut_offset ( buf, off) =
189
+ ( code >> 30 u & 1 u | tag_six_b) as u8 ;
190
+ * ptr:: mut_offset ( buf, off + 1 u) =
191
+ ( code >> 24 u & 63 u | tag_cont) as u8 ;
192
+ * ptr:: mut_offset ( buf, off + 2 u) =
193
+ ( code >> 18 u & 63 u | tag_cont) as u8 ;
194
+ * ptr:: mut_offset ( buf, off + 3 u) =
195
+ ( code >> 12 u & 63 u | tag_cont) as u8 ;
196
+ * ptr:: mut_offset ( buf, off + 4 u) =
197
+ ( code >> 6 u & 63 u | tag_cont) as u8 ;
198
+ * ptr:: mut_offset ( buf, off + 5 u) =
199
+ ( code & 63 u | tag_cont) as u8 ;
200
+ }
201
+ * ptr:: mut_offset ( buf, off + nb) = 0u8 ;
202
+ }
203
+
204
+ as_bytes ( s) { |bytes|
205
+ let mut mut_bytes: [ u8] = :: unsafe:: reinterpret_cast ( bytes) ;
206
+ vec:: unsafe:: set_len ( mut_bytes, new_len + 1 u) ;
207
+ :: unsafe:: forget ( mut_bytes) ;
208
+ }
208
209
}
209
210
210
211
#[ doc = "Convert a char to a string" ]
0 commit comments