IDL inheritance causes runtime errors during Topic creation
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 55/100
Línea de trabajo
Empieza en cyclonedds/idl/_xt_builder.py, en _xt_minimal_struct_header y _xt_complete_struct_header, y luego reproduce el fallo con el ejemplo de foo.idl Parent/Child y la creación de Topic que se muestran en el issue. Se considera terminado cuando los tipos IDL heredados pueden crear Topics Parent y Child y escribir y leer instancias Child sin errores ni aserciones de DDS.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Hello!
I'm experiencing the following issue with the code generated from IDL definitions that use inheritance
foo.idl
struct Parent {
long parent1;
};
struct Child : Parent {
long child1;
};
Generate code from IDL via idlc:
"""
Generated by Eclipse Cyclone DDS idlc Python Backend
Cyclone DDS IDL version: v0.11.0
Module:
IDL file: foo.idl
"""
from dataclasses import dataclass
from enum import auto
from typing import TYPE_CHECKING, Optional
import cyclonedds as dds
import cyclonedds.idl as idl
import cyclonedds.idl.annotations as annotate
import cyclonedds.idl.types as types
@dataclass
@annotate.final
@annotate.autoid("sequential")
class Parent(idl.IdlStruct, typename="Parent"):
parent1: types.int32
@dataclass
@annotate.final
@annotate.autoid("sequential")
class Child(Parent, typename="Child"):
child1: types.int32
Parent class instead of idl.IdlStruct in Python was fixed in https://github.com/eclipse-cyclonedds/cyclonedds-python/issues/162. The change also added some additional checks for base classes. However, trying to use the code (with main branch of the core library (d6684dc96e7ef092869688358753e49e33e9bbc2) fails, for example
"""
Generated by Eclipse Cyclone DDS idlc Python Backend
Cyclone DDS IDL version: v0.11.0
Module:
IDL file: foo.idl
"""
from dataclasses import dataclass
from enum import auto
from typing import TYPE_CHECKING, Optional
import cyclonedds as dds
import cyclonedds.idl as idl
import cyclonedds.idl.annotations as annotate
import cyclonedds.idl.types as types
@dataclass
@annotate.final
@annotate.autoid("sequential")
class Parent(idl.IdlStruct, typename="Parent"):
parent1: types.int32
@dataclass
@annotate.final
@annotate.autoid("sequential")
class Child(Parent, typename="Child"):
child1: types.int32
d = dds.domain.DomainParticipant(42)
t = dds.topic.Topic(d, "test_topic", Child)
w = dds.pub.DataWriter(d, t)
r = dds.sub.DataReader(d, t)
w.write(Child(parent1=1, child1=2))
print(r.read())
$ python foo.py
Traceback (most recent call last):
File "<...>/cyclonedds-python/a/a.py", line 35, in <module>
t = dds.topic.Topic(d, "test_topic", Child)
File "<...>/cyclonedds-python/.venv/lib/python3.10/site-packages/cyclonedds/topic.py", line 59, in __init__
super().__init__(
File "<...>/cyclonedds-python/.venv/lib/python3.10/site-packages/cyclonedds/core.py", line 181, in __init__
raise DDSException(
cyclonedds.core.DDSException: [DDS_RETCODE_BAD_PARAMETER] Bad parameter value. Occurred upon initialisation of a cyclonedds.topic.Topic
Interestingly, if you create a different topic with the Parent class, another error occurs, seemingly because some registration happens in the native DDS:
"""
Generated by Eclipse Cyclone DDS idlc Python Backend
Cyclone DDS IDL version: v0.11.0
Module:
IDL file: foo.idl
"""
from dataclasses import dataclass
from enum import auto
from typing import TYPE_CHECKING, Optional
import cyclonedds as dds
import cyclonedds.idl as idl
import cyclonedds.idl.annotations as annotate
import cyclonedds.idl.types as types
@dataclass
@annotate.final
@annotate.autoid("sequential")
class Parent(idl.IdlStruct, typename="Parent"):
parent1: types.int32
@dataclass
@annotate.final
@annotate.autoid("sequential")
class Child(Parent, typename="Child"):
child1: types.int32
d = dds.domain.DomainParticipant(42)
t_parent = dds.topic.Topic(d, "test_parent", Parent)
t = dds.topic.Topic(d, "test_topic", Child)
w = dds.pub.DataWriter(d, t)
r = dds.sub.DataReader(d, t)
w.write(Child(parent1=1, child1=2))
print(r.read())
$ python foo.py
python: <...>/cyclonedds/src/core/ddsi/src/ddsi_typewrap.c:3112: ddsi_xt_get_typeobject_kind_impl: Assertion `xt->kind == DDSI_TYPEID_KIND_COMPLETE' failed.
Aborted (core dumped)
I've tried digging around the code and I believe I might see the issue. My understanding of the XT type encoding is practically nonexistent, but it seems that the Child class has the wrong type information in the header section, since it points to the minimal version of the Parent class instead of the complete one. The following diff makes the script above working properly:
diff --git a/cyclonedds/idl/_xt_builder.py b/cyclonedds/idl/_xt_builder.py
index 37a5453..19010c1 100644
--- a/cyclonedds/idl/_xt_builder.py
+++ b/cyclonedds/idl/_xt_builder.py
@@ -905,7 +905,7 @@ class XTBuilder:
@classmethod
def _xt_minimal_struct_header(cls, entity: Type[IdlStruct]) -> xt.MinimalStructHeader:
- if entity.__base__ is None or entity.__base__ == IdlStruct:
+ if entity.__base__ is None or issubclass(entity.__base__, IdlStruct):
return xt.MinimalStructHeader(
base_type=xt.TypeIdentifier(discriminator=xt.TK_NONE, value=None),
detail=cls._xt_minimal_type_detail(entity)
@@ -918,7 +918,7 @@ class XTBuilder:
@classmethod
def _xt_complete_struct_header(cls, entity: Type[IdlStruct]) -> xt.CompleteStructHeader:
- if entity.__base__ is None or entity.__base__ == IdlStruct:
+ if entity.__base__ is None or issubclass(entity.__base__, IdlStruct):
return xt.CompleteStructHeader(
base_type=xt.TypeIdentifier(discriminator=xt.TK_NONE, value=None),
detail=cls._xt_complete_type_detail(entity)
$ python foo.py
[Child(parent1=1, child1=2)]
Hope this might help.
- Lenguaje dominante
- Python
- Estrellas
- 110
- Forks
- 68
- Merge medio
- 3 d 5 h
- PR fusionados (30 d)
- 1
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de eclipse-cyclonedds/cyclonedds-python
-
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
-
Generated Python code is not interoperable when a union contains a member called "value"Quizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 58/100
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
-
Dificultad 4/5 3-5 días Aptitud para principiantes 45/100
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
eclipse-cyclonedds/cyclonedds-python#333 · 1 comentario ·
Todos los issues de eclipse-cyclonedds/cyclonedds-python
Issues similares
-
good first issue tools
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
Commits pushed after #1095 merged did not land (ahmi/unified-nova-mcp-review-e095 @ 80fa23a)Abiertobug deferred domain:ci P1
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
Los mantenedores suelen responder en 1 día
-
get_page_thumbnail modifies cached page images, affecting later thumbnails and picture exportsAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
docling-project/docling-mcp#147 ·
-
issue: A pipe model's Valves button ignores the Allow Chat Valves permissionPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abiertobug confirmed issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
open-webui/open-webui#32771 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Scheduled Security Scan is failing on mainPosiblemente ocupada @pkupt la tomó hoy. Abiertosecurity-scan-failure
Dificultad 1/5 1-3 horas Aptitud para principiantes 74/100
semantica-agi/semantica#2045 ·
Los mantenedores suelen responder en 2 días