Implement generated packet wire codecs (#47)
Some checks failed
Native code generation / deterministic (push) Successful in 4m29s
Imaging and meshing gate / native (push) Failing after 16s
JPEG 2000 feature / linux (push) Failing after 59s
Skia feature / linux (push) Failing after 1m37s

This commit is contained in:
2026-08-09 08:16:32 +00:00
parent 5bc22bdd83
commit 74801c3488
16 changed files with 87505 additions and 25470 deletions

View File

@@ -38,6 +38,7 @@ TARGETS = {
# implementations. The generated module keeps catalog markers and re-exports
# the hand-written type so coverage remains deterministic.
NATIVE_TYPES = {
"T:LibreMetaverse.BitPack": "crate::bit_pack::BitPack",
"T:LibreMetaverse.Packets.PacketType": "crate::packet_catalog::PacketType",
"T:LibreMetaverse.PrimMesher.Coord": "crate::prim_mesher::Coord",
"T:LibreMetaverse.PrimMesher.Face": "crate::prim_mesher::Face",
@@ -296,6 +297,52 @@ COMPOSED_BASE_TYPES = {
"T:LibreMetaverse.Packets.TestMessagePacket",
"T:LibreMetaverse.Rendering.Joint",
}
NATIVE_MESSAGE_CODEC_TYPES = {
"T:LibreMetaverse.Messages.Linden.AgentGroupDataUpdateMessage",
"T:LibreMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.GroupData",
"T:LibreMetaverse.Messages.Linden.AgentGroupDataUpdateMessage.NewGroupData",
"T:LibreMetaverse.Messages.Linden.ChatSessionAcceptInvitation",
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestBlock",
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestMuteUpdate",
"T:LibreMetaverse.Messages.Linden.ChatSessionRequestStartConference",
"T:LibreMetaverse.Messages.Linden.ChatterBoxInvitationMessage",
"T:LibreMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage",
"T:LibreMetaverse.Messages.Linden.ChatterBoxSessionAgentListUpdatesMessage.AgentUpdatesBlock",
"T:LibreMetaverse.Messages.Linden.ChatterBoxSessionStartReplyMessage",
"T:LibreMetaverse.Messages.Linden.ChatterboxSessionEventReplyMessage",
"T:LibreMetaverse.Messages.Linden.CopyInventoryFromNotecardMessage",
"T:LibreMetaverse.Messages.Linden.DirLandReplyMessage",
"T:LibreMetaverse.Messages.Linden.DirLandReplyMessage.QueryReply",
"T:LibreMetaverse.Messages.Linden.EnableSimulatorMessage",
"T:LibreMetaverse.Messages.Linden.EnableSimulatorMessage.SimulatorInfoBlock",
"T:LibreMetaverse.Messages.Linden.EstablishAgentCommunicationMessage",
"T:LibreMetaverse.Messages.Linden.LandStatReplyMessage",
"T:LibreMetaverse.Messages.Linden.LandStatReplyMessage.ReportDataBlock",
"T:LibreMetaverse.Messages.Linden.MapLayerMessageBase",
"T:LibreMetaverse.Messages.Linden.MapLayerReplyVariant",
"T:LibreMetaverse.Messages.Linden.MapLayerReplyVariant.LayerData",
"T:LibreMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage",
"T:LibreMetaverse.Messages.Linden.ParcelObjectOwnersReplyMessage.PrimOwner",
"T:LibreMetaverse.Messages.Linden.ParcelPropertiesMessage",
"T:LibreMetaverse.Messages.Linden.ParcelPropertiesUpdateMessage",
"T:LibreMetaverse.Messages.Linden.ParcelVoiceInfoRequestMessage",
"T:LibreMetaverse.Messages.Linden.PlacesReplyMessage",
"T:LibreMetaverse.Messages.Linden.PlacesReplyMessage.QueryData",
"T:LibreMetaverse.Messages.Linden.ProvisionVoiceAccountRequestMessage",
"T:LibreMetaverse.Messages.Linden.RemoteParcelRequestReply",
"T:LibreMetaverse.Messages.Linden.RequiredVoiceVersionMessage",
"T:LibreMetaverse.Messages.Linden.ScriptRunningReplyMessage",
"T:LibreMetaverse.Messages.Linden.SendPostcardMessage",
"T:LibreMetaverse.Messages.Linden.TeleportFailedMessage",
"T:LibreMetaverse.Messages.Linden.TeleportFinishMessage",
"T:LibreMetaverse.Messages.Linden.UpdateAgentInformationMessage",
"T:LibreMetaverse.Messages.Linden.UpdateAgentInventoryRequestMessage",
"T:LibreMetaverse.Messages.Linden.UpdateAgentLanguageMessage",
"T:LibreMetaverse.Messages.Linden.UpdateScriptAgentRequestMessage",
"T:LibreMetaverse.Messages.Linden.UpdateScriptTaskUpdateMessage",
"T:LibreMetaverse.Messages.Linden.ViewerStatsMessage",
}
OPEN_ENUM_IDS = {"T:LibreMetaverse.BakeType", "T:LibreMetaverse.HoleType"}
TRAIT_SUPERTRAITS = {
"T:LibreMetaverse.IBakingTextureProvider": "std::any::Any",
@@ -746,10 +793,68 @@ def native_member_body(member_id: str) -> str | None:
body = NATIVE_MEMBER_BODIES.get(member_id)
if body is not None:
return body
message_owner = "T:" + member_id[2:].split(".#ctor", 1)[0] if member_id.startswith("M:") and ".#ctor" in member_id else None
if message_owner in NATIVE_MESSAGE_CODEC_TYPES:
return "Ok(<Self as crate::message_codec::GeneratedMessage>::new_generated())"
message_owner = "T:" + member_id[2:].rsplit(".Deserialize", 1)[0] if member_id.startswith("M:") and ".Deserialize(" in member_id else None
if message_owner in NATIVE_MESSAGE_CODEC_TYPES:
return "<Self as crate::message_codec::GeneratedMessage>::deserialize_generated(self, &map)"
message_owner = "T:" + member_id[2:].rsplit(".Serialize", 1)[0] if member_id.startswith("M:") and member_id.endswith(".Serialize") else None
if message_owner in NATIVE_MESSAGE_CODEC_TYPES:
return "<Self as crate::message_codec::GeneratedMessage>::serialize_generated(self)"
if re.fullmatch(r"M:LibreMetaverse\.Packets\.[^.]+Packet\.#ctor", member_id):
return "Ok(<Self as crate::packet_catalog::GeneratedPacket>::new_generated())"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.#ctor\(LibreMetaverse\.Packets\.Header,System\.Byte\[\],System\.Int32@\)",
member_id,
):
return "<Self as crate::packet_catalog::GeneratedPacket>::new_from_header(head, &bytes, i)"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.#ctor\(System\.Byte\[\],System\.Int32@\)",
member_id,
):
return "<Self as crate::packet_catalog::GeneratedPacket>::new_from_bytes(&bytes, i)"
if re.fullmatch(r"M:LibreMetaverse\.Packets\.[^.]+Packet\.[^.]+Block\.#ctor", member_id):
return "Ok(<Self as crate::packet_catalog::GeneratedBlock>::new_generated())"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.[^.]+Block\.#ctor\(System\.Byte\[\],System\.Int32@\)",
member_id,
):
return "<Self as crate::packet_catalog::GeneratedBlock>::new_from_bytes(&bytes, i)"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.[^.]+Block\.FromBytes\(System\.Byte\[\],System\.Int32@\)",
member_id,
):
return "<Self as crate::packet_catalog::GeneratedBlock>::decode_from_bytes(self, &bytes, i)"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.[^.]+Block\.ToBytes\(System\.Byte\[\],System\.Int32@\)",
member_id,
):
return "<Self as crate::packet_catalog::GeneratedBlock>::encode_to_slice(self, bytes, i)"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.FromBytes\(LibreMetaverse\.Packets\.Header,System\.Byte\[\],System\.Int32@,System\.Int32@\)",
member_id,
):
return "<Self as crate::packet_catalog::GeneratedPacket>::decode_from_header(self, header, &bytes, i, packet_end)"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.FromBytes\(System\.Byte\[\],System\.Int32@,System\.Int32@,System\.Byte\[\]\)",
member_id,
):
return "<Self as crate::packet_catalog::GeneratedPacket>::decode_from_bytes(self, &bytes, i, packet_end, zero_buffer)"
if re.fullmatch(r"M:LibreMetaverse\.Packets\.[^.]+Packet\.ToBytes", member_id):
return "<Self as crate::packet_catalog::GeneratedPacket>::encode_packet(self)"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.ToBytes\(LibreMetaverse\.Interfaces\.IByteBufferPool,System\.Int32@\)",
member_id,
):
return "{ let _ = pool; let bytes = <Self as crate::packet_catalog::GeneratedPacket>::encode_packet(self)?; *size = i32::try_from(bytes.len()).map_err(|_| crate::Error::Argument)?; Ok(bytes) }"
if re.fullmatch(r"M:LibreMetaverse\.Packets\.[^.]+Packet\.ToBytesMultiple", member_id):
return "<Self as crate::packet_catalog::GeneratedPacket>::encode_multiple(self)"
if re.fullmatch(
r"M:LibreMetaverse\.Packets\.[^.]+Packet\.ToBytesMultiple\(LibreMetaverse\.Interfaces\.IByteBufferPool,System\.Int32\[\]@\)",
member_id,
):
return "{ let _ = pool; let packets = <Self as crate::packet_catalog::GeneratedPacket>::encode_multiple(self)?; *sizes = packets.iter().map(|packet| i32::try_from(packet.len()).unwrap_or(i32::MAX)).collect(); Ok(packets) }"
if re.fullmatch(r"P:LibreMetaverse\.Packets\.[^.]+Packet\.Length", member_id):
return "<Self as crate::packet_catalog::GeneratedPacket>::generated_length(self)"
if re.fullmatch(r"P:LibreMetaverse\.Packets\.[^.]+Packet\.UsesBufferPooling", member_id):
@@ -760,6 +865,20 @@ def native_member_body(member_id: str) -> str | None:
return "Ok(crate::packet_catalog::packet_type(id, frequency))"
if member_id == "M:LibreMetaverse.Packets.Packet.BuildPacket(LibreMetaverse.Packets.PacketType)":
return "crate::packet_catalog::build_packet(type_)"
if member_id == "M:LibreMetaverse.Packets.Packet.BuildPacket(System.Byte[],System.Int32@,System.Byte[])":
return "{ let mut zero_buffer = zero_buffer; crate::packet_wire::build_packet_from_bytes(&packet_buffer, packet_end, &mut zero_buffer) }"
if member_id == "M:LibreMetaverse.Packets.Header.BuildHeader(System.Byte[],System.Int32@,System.Int32@)":
return "crate::packet_wire::decode_header(&bytes, pos, packet_end)"
if member_id == "M:LibreMetaverse.Packets.Header.FromBytes(System.Byte[],System.Int32@,System.Int32@)":
return "{ *self = crate::packet_wire::decode_header(&bytes, pos, packet_end)?; Ok(()) }"
if member_id == "M:LibreMetaverse.Packets.Header.ToBytes(System.Byte[],System.Int32@)":
return "crate::packet_wire::header_to_slice(self, bytes, i)"
if member_id == "M:LibreMetaverse.Packets.Header.AcksToBytes(System.Byte[],System.Int32@)":
return "crate::packet_wire::acks_to_slice(self, bytes, i)"
if member_id == "M:LibreMetaverse.Helpers.ZeroDecode(System.Byte[],System.Int32,System.Byte[])":
return "crate::packet_wire::zero_decode(src, srclen, dest)"
if member_id == "M:LibreMetaverse.Helpers.ZeroEncode(System.Byte[],System.Int32,System.Byte[])":
return "crate::packet_wire::zero_encode(src, srclen, dest)"
return None