typelib: Fix crash when handling array types

This commit is contained in:
James Westman 2023-02-16 20:39:43 -06:00
parent 1df46b5a06
commit 9fcb63a013
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
5 changed files with 36 additions and 4 deletions

View file

@ -126,6 +126,22 @@ class UncheckedType(GirType):
return self._name
class ArrayType(GirType):
def __init__(self, inner: GirType) -> None:
self._inner = inner
def assignable_to(self, other: GirType) -> bool:
return isinstance(other, ArrayType) and self._inner.assignable_to(other._inner)
@property
def name(self) -> str:
return self._inner.name + "[]"
@property
def full_name(self) -> str:
return self._inner.full_name + "[]"
class BasicType(GirType):
name: str = "unknown type"
@ -714,9 +730,15 @@ class Repository(GirNode):
else:
raise CompilerBugError("Unknown type ID", type_id)
else:
return self._resolve_dir_entry(
self.tl.header[type_id].INTERFACE_TYPE_INTERFACE
)
blob = self.tl.header[type_id]
if blob.TYPE_BLOB_TAG == typelib.TYPE_INTERFACE:
return self._resolve_dir_entry(
self.tl.header[type_id].TYPE_BLOB_INTERFACE
)
elif blob.TYPE_BLOB_TAG == typelib.TYPE_ARRAY:
return ArrayType(self._resolve_type_id(blob.TYPE_BLOB_ARRAY_INNER))
else:
raise CompilerBugError(f"{blob.TYPE_BLOB_TAG}")
class GirContext:

View file

@ -136,7 +136,9 @@ class Typelib:
ATTR_NAME = Field(0x0, "string")
ATTR_VALUE = Field(0x0, "string")
INTERFACE_TYPE_INTERFACE = Field(0x2, "dir_entry")
TYPE_BLOB_TAG = Field(0x0, "u8", 3, 5)
TYPE_BLOB_INTERFACE = Field(0x2, "dir_entry")
TYPE_BLOB_ARRAY_INNER = Field(0x4, "u32")
BLOB_NAME = Field(0x4, "string")