Skip to content

Commit c697e33

Browse files
Model BidiAuxiliaryProperties as an EnumeratedProperty (#5597)
1 parent ef4d4d2 commit c697e33

File tree

23 files changed

+1165
-1587
lines changed

23 files changed

+1165
-1587
lines changed

components/collections/codepointtrie_builder/src/common.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ pub(crate) fn args_for_build_immutable<U>(trie_type: TrieType) -> (u32, u32) {
1111
TrieType::Small => 1,
1212
};
1313
let width = match core::mem::size_of::<U>() {
14-
2 => 0, // UCPTRIE_VALUE_BITS_16
15-
4 => 1, // UCPTRIE_VALUE_BITS_32
16-
1 => 2, // UCPTRIE_VALUE_BITS_8
14+
1 => 2, // UCPTRIE_VALUE_BITS_8
15+
2 => 0, // UCPTRIE_VALUE_BITS_16
16+
3 | 4 => 1, // UCPTRIE_VALUE_BITS_32
1717
other => panic!("Don't know how to make trie with width {other}"),
1818
};
1919
(trie_type, width)

components/collections/codepointtrie_builder/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ pub struct CodePointTrieBuilder<'a, T> {
130130

131131
impl<T> CodePointTrieBuilder<'_, T>
132132
where
133-
T: TrieValue + Into<u32>,
133+
T: TrieValue,
134134
{
135135
/// Build the [`CodePointTrie`].
136136
///

components/collections/codepointtrie_builder/src/native.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,15 @@ extern "C" {
7777
#[allow(unused)]
7878
pub(crate) fn run_native<T>(cpt_builder: &CodePointTrieBuilder<T>) -> CodePointTrie<'static, T>
7979
where
80-
T: TrieValue + Into<u32>,
80+
T: TrieValue,
8181
{
8282
let mut error = 0;
8383
let builder = unsafe {
8484
// safety: we're passing a valid error pointer
8585
// leak-safety: we clean up `builder` except in panicky codepaths
8686
umutablecptrie_open(
87-
cpt_builder.default_value.into(),
88-
cpt_builder.error_value.into(),
87+
cpt_builder.default_value.to_u32(),
88+
cpt_builder.error_value.to_u32(),
8989
&mut error,
9090
)
9191
};
@@ -97,13 +97,16 @@ where
9797
let CodePointTrieBuilderData::ValuesByCodePoint(values) = cpt_builder.data;
9898

9999
for (cp, value) in values.iter().enumerate() {
100-
unsafe {
101-
// safety: builder is a valid UMutableCPTrie
102-
// safety: we're passing a valid error pointer
103-
umutablecptrie_set(builder, cp as u32, (*value).into(), &mut error);
104-
}
105-
if error != 0 {
106-
panic!("cpt builder returned error code {}", error);
100+
let value = value.to_u32();
101+
if value != cpt_builder.default_value.to_u32() {
102+
unsafe {
103+
// safety: builder is a valid UMutableCPTrie
104+
// safety: we're passing a valid error pointer
105+
umutablecptrie_set(builder, cp as u32, value, &mut error);
106+
}
107+
if error != 0 {
108+
panic!("cpt builder returned error code {}", error);
109+
}
107110
}
108111
}
109112

@@ -165,7 +168,7 @@ where
165168
.iter()
166169
.map(|x| TrieValue::try_from_u32((*x).into()))
167170
.collect(),
168-
4 => slice::from_raw_parts(trie.data.ptr32, data_length)
171+
3 | 4 => slice::from_raw_parts(trie.data.ptr32, data_length)
169172
.iter()
170173
.map(|x| TrieValue::try_from_u32(*x))
171174
.collect(),

components/collections/codepointtrie_builder/src/wasm.rs

+32-18
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use icu_collections::codepointtrie::CodePointTrieHeader;
99
use icu_collections::codepointtrie::TrieValue;
1010
use wasmi::{Config, Engine, Extern, Func, Instance, Linker, Module, Store, Value};
1111
use zerovec::ZeroSlice;
12+
use zerovec::ZeroVec;
1213

1314
const UCPTRIE_WRAP_WAT: &str = include_str!("../cpp/ucptrie_wrap.wat");
1415

@@ -210,21 +211,21 @@ pub(crate) fn run_wasmi_ucptrie_wrap<T>(
210211
builder: &CodePointTrieBuilder<T>,
211212
) -> CodePointTrie<'static, T>
212213
where
213-
T: TrieValue + Into<u32>,
214+
T: TrieValue,
214215
{
215216
let mut wasm = WasmWrap::create();
216217

217218
let error_code_ptr = wasm.create_uerrorcode();
218219
let trie_ptr = wasm.umutablecptrie_open(
219-
builder.default_value.into() as i32,
220-
builder.error_value.into() as i32,
220+
builder.default_value.to_u32() as i32,
221+
builder.error_value.to_u32() as i32,
221222
&error_code_ptr,
222223
);
223224

224225
let CodePointTrieBuilderData::ValuesByCodePoint(values) = builder.data;
225226
for (cp, value) in values.iter().enumerate() {
226-
let num: u32 = (*value).into();
227-
if num != builder.default_value.into() {
227+
let num = value.to_u32();
228+
if num != builder.default_value.to_u32() {
228229
wasm.umutablecptrie_set(&trie_ptr, cp as u32, num, &error_code_ptr);
229230
}
230231
}
@@ -250,22 +251,35 @@ where
250251
let data_ptr = wasm.get_data_ptr(&ucptrie_ptr);
251252
let data_length = wasm.get_data_length(&ucptrie_ptr);
252253

253-
let index_slice = ZeroSlice::<u16>::parse_byte_slice(
254+
let index = ZeroSlice::<u16>::parse_byte_slice(
254255
wasm.get_bytes_at_ptr(&index_ptr, index_length * core::mem::size_of::<u16>()),
255256
)
256-
.unwrap();
257-
258-
let data_slice = ZeroSlice::<T>::parse_byte_slice(
259-
wasm.get_bytes_at_ptr(&data_ptr, data_length * core::mem::size_of::<T::ULE>()),
260-
)
261-
.unwrap();
257+
.unwrap()
258+
.as_zerovec()
259+
.into_owned();
260+
261+
let data = if core::mem::size_of::<T::ULE>() == 3 {
262+
// need to reallocate 32-bit trie as 24-bit zerovec
263+
ZeroVec::<T>::parse_byte_slice(
264+
&wasm
265+
.get_bytes_at_ptr(&data_ptr, data_length * 4)
266+
.iter()
267+
.enumerate()
268+
.filter(|(i, _)| i % 4 != 3)
269+
.map(|(_, b)| *b)
270+
.collect::<Vec<_>>(),
271+
)
272+
.unwrap()
273+
.into_owned()
274+
} else {
275+
ZeroVec::<T>::parse_byte_slice(
276+
wasm.get_bytes_at_ptr(&data_ptr, data_length * core::mem::size_of::<T::ULE>()),
277+
)
278+
.unwrap()
279+
.into_owned()
280+
};
262281

263-
let built_trie = CodePointTrie::try_new(
264-
header,
265-
index_slice.as_zerovec().into_owned(),
266-
data_slice.as_zerovec().into_owned(),
267-
)
268-
.expect("Failed to construct");
282+
let built_trie = CodePointTrie::try_new(header, index, data).expect("Failed to construct");
269283

270284
wasm.ucptrie_close(&ucptrie_ptr);
271285
wasm.umutablecptrie_close(&trie_ptr);

0 commit comments

Comments
 (0)