fn populate_yy_object()

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());
            }
        }
    }
}