in src/deserialize/backend/yyjson.rs [245:300]
fn populate_yy_object(dict: *mut pyo3_ffi::PyObject, elem: *mut yyjson_val) {
unsafe {
let len = unsafe_yyjson_get_len(elem);
assume!(len >= 1);
let mut next_key = unsafe_yyjson_get_first(elem);
let mut next_val = next_key.add(1);
for _ in 0..len {
let val = next_val;
let pykey = {
let key_str = str_from_slice!(
(*next_key).uni.str_ as *const u8,
unsafe_yyjson_get_len(next_key)
);
get_unicode_key(key_str)
};
if unlikely!(unsafe_yyjson_is_ctn(val)) {
next_key = unsafe_yyjson_get_next_container(val);
next_val = next_key.add(1);
if is_yyjson_tag!(val, TAG_ARRAY) {
let pyval = ffi!(PyList_New(unsafe_yyjson_get_len(val) as isize));
add_to_dict!(dict, pykey, pyval);
reverse_pydict_incref!(pykey);
reverse_pydict_incref!(pyval);
if unsafe_yyjson_get_len(val) > 0 {
populate_yy_array(pyval, val);
}
} else {
let pyval = ffi!(_PyDict_NewPresized(unsafe_yyjson_get_len(val) as isize));
add_to_dict!(dict, pykey, pyval);
reverse_pydict_incref!(pykey);
reverse_pydict_incref!(pyval);
if unsafe_yyjson_get_len(val) > 0 {
populate_yy_object(pyval, val);
}
}
} else {
next_key = unsafe_yyjson_get_next_non_container(val);
next_val = next_key.add(1);
let pyval = match ElementType::from_tag(val) {
ElementType::String => parse_yy_string(val),
ElementType::Uint64 => parse_yy_u64(val),
ElementType::Int64 => parse_yy_i64(val),
ElementType::Double => parse_yy_f64(val),
ElementType::Null => parse_none(),
ElementType::True => parse_true(),
ElementType::False => parse_false(),
ElementType::Array => unreachable_unchecked!(),
ElementType::Object => unreachable_unchecked!(),
};
add_to_dict!(dict, pykey, pyval.as_ptr());
reverse_pydict_incref!(pykey);
reverse_pydict_incref!(pyval.as_ptr());
}
}
}
}