|
13 | 13 | from_byte,
|
14 | 14 | from_char,
|
15 | 15 | from_chars,
|
16 |
| - push_char, |
17 | 16 | concat,
|
18 | 17 | connect,
|
19 | 18 |
|
@@ -102,6 +101,8 @@ export
|
102 | 101 | native mod rustrt {
|
103 | 102 | fn rust_str_push(&s: str, ch: u8);
|
104 | 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); |
105 | 106 | }
|
106 | 107 |
|
107 | 108 | /*
|
@@ -138,34 +139,72 @@ fn from_byte(b: u8) -> str unsafe {
|
138 | 139 | #[doc = "Appends a character at the end of a string"]
|
139 | 140 | fn push_char(&s: str, ch: char) unsafe {
|
140 | 141 | let code = ch as uint;
|
141 |
| - if code < max_one_b { |
142 |
| - rustrt::rust_str_push(s, code as u8); |
143 |
| - } else if code < max_two_b { |
144 |
| - rustrt::rust_str_push(s, (code >> 6u & 31u | tag_two_b) as u8); |
145 |
| - rustrt::rust_str_push(s, (code & 63u | tag_cont) as u8); |
146 |
| - } else if code < max_three_b { |
147 |
| - rustrt::rust_str_push(s, (code >> 12u & 15u | tag_three_b) as u8); |
148 |
| - rustrt::rust_str_push(s, (code >> 6u & 63u | tag_cont) as u8); |
149 |
| - rustrt::rust_str_push(s, (code & 63u | tag_cont) as u8); |
150 |
| - } else if code < max_four_b { |
151 |
| - rustrt::rust_str_push(s, (code >> 18u & 7u | tag_four_b) as u8); |
152 |
| - rustrt::rust_str_push(s, (code >> 12u & 63u | tag_cont) as u8); |
153 |
| - rustrt::rust_str_push(s, (code >> 6u & 63u | tag_cont) as u8); |
154 |
| - rustrt::rust_str_push(s, (code & 63u | tag_cont) as u8); |
155 |
| - } else if code < max_five_b { |
156 |
| - rustrt::rust_str_push(s, (code >> 24u & 3u | tag_five_b) as u8); |
157 |
| - rustrt::rust_str_push(s, (code >> 18u & 63u | tag_cont) as u8); |
158 |
| - rustrt::rust_str_push(s, (code >> 12u & 63u | tag_cont) as u8); |
159 |
| - rustrt::rust_str_push(s, (code >> 6u & 63u | tag_cont) as u8); |
160 |
| - rustrt::rust_str_push(s, (code & 63u | tag_cont) as u8); |
| 142 | + let nb = if code < max_one_b { 1u } |
| 143 | + else if code < max_two_b { 2u } |
| 144 | + else if code < max_three_b { 3u } |
| 145 | + else if code < max_four_b { 4u } |
| 146 | + else if code < max_five_b { 5u } |
| 147 | + else { 6u }; |
| 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; |
161 | 152 | } else {
|
162 |
| - rustrt::rust_str_push(s, (code >> 30u & 1u | tag_six_b) as u8); |
163 |
| - rustrt::rust_str_push(s, (code >> 24u & 63u | tag_cont) as u8); |
164 |
| - rustrt::rust_str_push(s, (code >> 18u & 63u | tag_cont) as u8); |
165 |
| - rustrt::rust_str_push(s, (code >> 12u & 63u | tag_cont) as u8); |
166 |
| - rustrt::rust_str_push(s, (code >> 6u & 63u | tag_cont) as u8); |
167 |
| - rustrt::rust_str_push(s, (code & 63u | tag_cont) as u8); |
168 |
| - } |
| 153 | + rustrt::upcall_vec_grow(s, fill + nb); |
| 154 | + // possibly realloc'd |
| 155 | + repr = ::unsafe::reinterpret_cast(s); |
| 156 | + } |
| 157 | + let off = fill - 1u; |
| 158 | + if nb == 1u { |
| 159 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off) = |
| 160 | + code as u8; |
| 161 | + } else if nb == 2u { |
| 162 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off) = |
| 163 | + (code >> 6u & 31u | tag_two_b) as u8; |
| 164 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 1u) = |
| 165 | + (code & 63u | tag_cont) as u8; |
| 166 | + } else if nb == 3u { |
| 167 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off) = |
| 168 | + (code >> 12u & 15u | tag_three_b) as u8; |
| 169 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 1u) = |
| 170 | + (code >> 6u & 63u | tag_cont) as u8; |
| 171 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 2u) = |
| 172 | + (code & 63u | tag_cont) as u8; |
| 173 | + } else if nb == 4u { |
| 174 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off) = |
| 175 | + (code >> 18u & 7u | tag_four_b) as u8; |
| 176 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 1u) = |
| 177 | + (code >> 12u & 63u | tag_cont) as u8; |
| 178 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 2u) = |
| 179 | + (code >> 6u & 63u | tag_cont) as u8; |
| 180 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 3u) = |
| 181 | + (code & 63u | tag_cont) as u8; |
| 182 | + } else if nb == 5u { |
| 183 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off) = |
| 184 | + (code >> 24u & 3u | tag_five_b) as u8; |
| 185 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 1u) = |
| 186 | + (code >> 18u & 63u | tag_cont) as u8; |
| 187 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 2u) = |
| 188 | + (code >> 12u & 63u | tag_cont) as u8; |
| 189 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 3u) = |
| 190 | + (code >> 6u & 63u | tag_cont) as u8; |
| 191 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 4u) = |
| 192 | + (code & 63u | tag_cont) as u8; |
| 193 | + } else if nb == 6u { |
| 194 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off) = |
| 195 | + (code >> 30u & 1u | tag_six_b) as u8; |
| 196 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 1u) = |
| 197 | + (code >> 24u & 63u | tag_cont) as u8; |
| 198 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 2u) = |
| 199 | + (code >> 18u & 63u | tag_cont) as u8; |
| 200 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 3u) = |
| 201 | + (code >> 12u & 63u | tag_cont) as u8; |
| 202 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 4u) = |
| 203 | + (code >> 6u & 63u | tag_cont) as u8; |
| 204 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + 5u) = |
| 205 | + (code & 63u | tag_cont) as u8; |
| 206 | + } |
| 207 | + *ptr::mut_offset(ptr::mut_addr_of((*repr).data), off + nb) = 0u8; |
169 | 208 | }
|
170 | 209 |
|
171 | 210 | #[doc = "Convert a char to a string"]
|
|
0 commit comments