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 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): class BasicType(GirType):
name: str = "unknown type" name: str = "unknown type"
@ -714,9 +730,15 @@ class Repository(GirNode):
else: else:
raise CompilerBugError("Unknown type ID", type_id) raise CompilerBugError("Unknown type ID", type_id)
else: else:
blob = self.tl.header[type_id]
if blob.TYPE_BLOB_TAG == typelib.TYPE_INTERFACE:
return self._resolve_dir_entry( return self._resolve_dir_entry(
self.tl.header[type_id].INTERFACE_TYPE_INTERFACE 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: class GirContext:

View file

@ -136,7 +136,9 @@ class Typelib:
ATTR_NAME = Field(0x0, "string") ATTR_NAME = Field(0x0, "string")
ATTR_VALUE = 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") BLOB_NAME = Field(0x4, "string")

View file

@ -0,0 +1,6 @@
using Gtk 4.0;
using Adw 1;
Adw.AboutWindow {
developers: Gtk.StringList {};
}

View file

@ -0,0 +1 @@
5,15,17,Cannot assign Gtk.StringList to string[]

View file

@ -231,6 +231,7 @@ class TestSamples(unittest.TestCase):
self.assert_sample_error("signal_object_dne") self.assert_sample_error("signal_object_dne")
self.assert_sample_error("size_group_non_widget") self.assert_sample_error("size_group_non_widget")
self.assert_sample_error("size_group_obj_dne") self.assert_sample_error("size_group_obj_dne")
self.assert_sample_error("strv")
self.assert_sample_error("styles_in_non_widget") self.assert_sample_error("styles_in_non_widget")
self.assert_sample_error("two_templates") self.assert_sample_error("two_templates")
self.assert_sample_error("uint") self.assert_sample_error("uint")