|
47 | 47 | TYPE_KIND_FIXED_SIZE_VEC = 16 |
48 | 48 | TYPE_KIND_REGULAR_UNION = 17 |
49 | 49 | TYPE_KIND_OS_STRING = 18 |
| 50 | +TYPE_KIND_STD_VECDEQUE = 19 |
50 | 51 |
|
51 | 52 | ENCODED_ENUM_PREFIX = "RUST$ENCODED$ENUM$" |
52 | 53 | ENUM_DISR_FIELD_NAME = "RUST$ENUM$DISR" |
|
62 | 63 | STD_VEC_FIELD_NAMES = [STD_VEC_FIELD_NAME_BUF, |
63 | 64 | STD_VEC_FIELD_NAME_LENGTH] |
64 | 65 |
|
| 66 | +# std::collections::VecDeque<> related constants |
| 67 | +STD_VECDEQUE_FIELD_NAME_TAIL = "tail" |
| 68 | +STD_VECDEQUE_FIELD_NAME_HEAD = "head" |
| 69 | +STD_VECDEQUE_FIELD_NAME_BUF = "buf" |
| 70 | +STD_VECDEQUE_FIELD_NAMES = [STD_VECDEQUE_FIELD_NAME_TAIL, |
| 71 | + STD_VECDEQUE_FIELD_NAME_HEAD, |
| 72 | + STD_VECDEQUE_FIELD_NAME_BUF] |
| 73 | + |
65 | 74 | # std::String related constants |
66 | 75 | STD_STRING_FIELD_NAMES = ["vec"] |
67 | 76 |
|
@@ -161,6 +170,11 @@ def __classify_struct(self): |
161 | 170 | self.__conforms_to_field_layout(STD_VEC_FIELD_NAMES)): |
162 | 171 | return TYPE_KIND_STD_VEC |
163 | 172 |
|
| 173 | + # STD COLLECTION VECDEQUE |
| 174 | + if (unqualified_type_name.startswith("VecDeque<") and |
| 175 | + self.__conforms_to_field_layout(STD_VECDEQUE_FIELD_NAMES)): |
| 176 | + return TYPE_KIND_STD_VECDEQUE |
| 177 | + |
164 | 178 | # STD STRING |
165 | 179 | if (unqualified_type_name.startswith("String") and |
166 | 180 | self.__conforms_to_field_layout(STD_STRING_FIELD_NAMES)): |
@@ -325,6 +339,25 @@ def extract_length_ptr_and_cap_from_std_vec(vec_val): |
325 | 339 | assert data_ptr.type.get_dwarf_type_kind() == DWARF_TYPE_CODE_PTR |
326 | 340 | return (length, data_ptr, capacity) |
327 | 341 |
|
| 342 | + |
| 343 | +def extract_tail_head_ptr_and_cap_from_std_vecdeque(vec_val): |
| 344 | + assert vec_val.type.get_type_kind() == TYPE_KIND_STD_VECDEQUE |
| 345 | + tail_field_index = STD_VECDEQUE_FIELD_NAMES.index(STD_VECDEQUE_FIELD_NAME_TAIL) |
| 346 | + head_field_index = STD_VECDEQUE_FIELD_NAMES.index(STD_VECDEQUE_FIELD_NAME_HEAD) |
| 347 | + buf_field_index = STD_VECDEQUE_FIELD_NAMES.index(STD_VECDEQUE_FIELD_NAME_BUF) |
| 348 | + |
| 349 | + tail = vec_val.get_child_at_index(tail_field_index).as_integer() |
| 350 | + head = vec_val.get_child_at_index(head_field_index).as_integer() |
| 351 | + buf = vec_val.get_child_at_index(buf_field_index) |
| 352 | + |
| 353 | + vec_ptr_val = buf.get_child_at_index(0) |
| 354 | + capacity = buf.get_child_at_index(1).as_integer() |
| 355 | + unique_ptr_val = vec_ptr_val.get_child_at_index(0) |
| 356 | + data_ptr = unique_ptr_val.get_child_at_index(0) |
| 357 | + assert data_ptr.type.get_dwarf_type_kind() == DWARF_TYPE_CODE_PTR |
| 358 | + return (tail, head, data_ptr, capacity) |
| 359 | + |
| 360 | + |
328 | 361 | def extract_length_and_ptr_from_slice(slice_val): |
329 | 362 | assert (slice_val.type.get_type_kind() == TYPE_KIND_SLICE or |
330 | 363 | slice_val.type.get_type_kind() == TYPE_KIND_STR_SLICE) |
|
0 commit comments