From: Marc-André Lureau <marcandre.lur...@redhat.com> Signed-off-by: Marc-André Lureau <marcandre.lur...@redhat.com> --- scripts/qapi/cabi.py | 50 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+)
diff --git a/scripts/qapi/cabi.py b/scripts/qapi/cabi.py index f33680477f..29c6d5144d 100644 --- a/scripts/qapi/cabi.py +++ b/scripts/qapi/cabi.py @@ -7,6 +7,7 @@ from typing import List, Optional from .common import c_enum_const, c_name, mcgen +from .rs import rs_name, to_snake_case from .schema import ( QAPISchemaEnumMember, QAPISchemaIfCond, @@ -24,6 +25,9 @@ def __init__(self, name: str, ifcond: QAPISchemaIfCond): def gen_c(self) -> str: raise NotImplementedError() + def gen_rs(self) -> str: + raise NotImplementedError() + class CABIEnum(CABI): def __init__( @@ -48,6 +52,19 @@ def gen_c(self) -> str: ret += self.ifcond.gen_endif() return ret + def gen_rs(self) -> str: + return mcgen(""" +%(cfg)s +{ + println!("%(name)s enum: sizeof={}", ::std::mem::size_of::<%(rs_name)s>()); + println!(" max={}", %(rs_name)s::_MAX as u32); + println!(); +} +""", + name=self.name, + rs_name=rs_name(self.name), + cfg=self.ifcond.rsgen()) + class CABIStruct(CABI): def __init__(self, name: str, ifcond: QAPISchemaIfCond): @@ -84,6 +101,21 @@ def gen_c(self) -> str: ret += self.ifcond.gen_endif() return ret + def gen_rs(self) -> str: + ret = mcgen(""" +%(cfg)s +{ + println!("%(name)s struct: sizeof={}", + ::std::mem::size_of::<%(rs_name)s>()); +""", name=self.name, rs_name=rs_name(self.name), cfg=self.ifcond.rsgen()) + for member in self.members: + ret += member.gen_rs() + ret += mcgen(""" + println!(); +} +""") + return ret + class CABIStructMember: def __init__(self, struct: CABIStruct, name: str, @@ -105,6 +137,24 @@ def gen_c(self) -> str: ret += self.ifcond.gen_endif() return ret + def gen_rs(self) -> str: + ret = '' + if self.ifcond: + ret += self.ifcond.rsgen() + protect = not self.prefix or self.prefix[-1] == '.' + rsmember = self.prefix + to_snake_case(rs_name(self.name, protect)) + ret += mcgen(""" +unsafe { + println!(" %(member)s member: sizeof={} offset={}", + ::std::mem::size_of_val( + &(*::std::ptr::null::<%(sname)s>()).%(rsmember)s + ), + &(*(::std::ptr::null::<%(sname)s>())).%(rsmember)s as *const _ as usize + ); +} +""", member=self.name, sname=rs_name(self.struct.name), rsmember=rsmember) + return ret + def gen_object_cabi( name: str, -- 2.33.0.113.g6c40894d24