def create_typedef_vt(): d = Declaration() res = d.parse( ''' typedef struct _kc_Object Object; struct _kc_vt_Object { void (*clean)(Object *); int (*isKindOf)(Object *, const char *); int (*isKindOf)(Object *, Object *); int (*isInstanceOf)(Object *, const char *); int (*isInstanceOf)(Object *, Object *); }; ''') res2 = d.parse( ''' typedef struct _kc_Object Object; void clean(Object *); int isKindOf(Object *, const char *); int isKindOf(Object *, Object *); int isInstanceOf(Object *, const char *); int isInstanceOf(Object *, Object *); ''') res2.body.pop(0) for decl in res.body: if isinstance(decl._ctype, cnorm.nodes.ComposedType) and decl._ctype._identifier == '_kc_vt_Object': for (dcl, proto) in zip(decl._ctype.fields, res2.body): dcl._name = mangler.mimpleSangle(proto) global typedef_vt_object typedef_vt_object = decl
def add_virtual_members(self): for decl in self.non_mangled: vir_name = mangler.mimpleSangle(decl) for idx, dcl in enumerate(self.vt._ctype.fields): if dcl._name == vir_name: m_name = mangler.muckFangle(decl, self.ident) self.inst_vt._assign_expr.body[idx].params[0].value = m_name
def add_virtual_members(self): for decl in self.non_mangled: vir_name = mangler.mimpleSangle(decl) for idx, dcl in enumerate(self.vt._ctype.fields): if dcl._name == vir_name: m_name = mangler.muckFangle(decl, self.ident) self.inst_vt._assign_expr.body[idx].params[ 0].value = m_name
def mangle_virtuals(self): new_dict = {} for vir in self.virtuals: m_name = mangler.muckFangle(self.virtuals[vir], self.ident) v_name = mangler.mimpleSangle(self.virtuals[vir]) v_obj = deepcopy(self.virtuals[vir]) v_obj._name = v_name new_dict[v_name] = v_obj proto = deepcopy(v_obj) proto._name = m_name self.protos.append(proto) self.virtuals = new_dict
def add_self_virtuals(self, decl): for vr in self.virtuals: vr_name = mangler.mimpleSangle(self.virtuals[vr]) if self.virtual_exists(decl._ctype.fields, vr_name): continue item = self.virtuals[vr] ct_fct = cnorm.nodes.PrimaryType(item._ctype._identifier) ct_fct._storage = 0 ct_fct._specifier = 0 ct_fct._decltype = cnorm.nodes.PointerType() setattr(ct_fct._decltype, '_decltype', cnorm.nodes.ParenType(item._ctype._params)) setattr(ct_fct._decltype, '_identifier', item._ctype._identifier) fct_ptr = cnorm.nodes.Decl(vr_name, ct_fct) decl._ctype.fields.append(fct_ptr)
def instanciate_vt(self): m_inst_vt = None if self.ident in decl_keeper.inher: mom_name = decl_keeper.inher[self.ident] m_inst_vt = decl_keeper.classes[mom_name].inst_vt else: m_inst_vt = decl_keeper.obj_vtable blockInit = deepcopy(m_inst_vt._assign_expr) # Réassignation des pointeurs size_b = len(blockInit.body) size_v = len(self.vt._ctype.fields) if size_v > size_b: diff = size_v - size_b for i in range(0, diff): blockInit.body.append(None) for vir_name in self.virtuals: idx = None tmp_name = mangler.mimpleSangle(self.virtuals[vir_name]) for index, tp in enumerate(self.vt._ctype.fields): if tp._name == tmp_name: idx = index if idx == None: continue fct = self.virtuals[vir_name] m_name = mangler.muckFangle(fct, self.ident) blockInit.body[idx] = cnorm.nodes.Unary(cnorm.nodes.Raw('&'), [cnorm.nodes.Id(m_name)]) decl = cnorm.nodes.Decl('vtable_%s' % self.ident, cnorm.nodes.PrimaryType('vt_%s' % self.ident)) setattr(decl, '_assign_expr', blockInit) self.inst_vt = decl self.add_virtual_members() self.mangle_virtuals() ext = deepcopy(self.inst_vt) delattr(ext, '_assign_expr') ext._ctype._storage = cnorm.nodes.Storages.EXTERN return ext
def check_param(self, decl): if hasattr(decl, '_ctype') and isinstance(decl._ctype, cnorm.nodes.FuncType): if not self.ident in decl_keeper.classes: return None cl = decl_keeper.classes[self.ident] param = cnorm.nodes.Decl('self', cnorm.nodes.PrimaryType(self.ident)) param._ctype._decltype = cnorm.nodes.PointerType() if decl._ctype._params != [] and decl._ctype._params[0]._ctype._identifier == self.ident: return None dc = deepcopy(decl) dc._ctype._params.insert(0, param) sm_name = mangler.mimpleSangle(dc) dc._name = mangler.muckFangle(dc, self.ident) for dcl in cl.members: if dcl._name == dc._name: return dc if sm_name in cl.virtuals: return dc return None
def check_param(self, decl): if hasattr(decl, '_ctype') and isinstance(decl._ctype, cnorm.nodes.FuncType): if not self.ident in decl_keeper.classes: return None cl = decl_keeper.classes[self.ident] param = cnorm.nodes.Decl('self', cnorm.nodes.PrimaryType(self.ident)) param._ctype._decltype = cnorm.nodes.PointerType() if decl._ctype._params != [] and decl._ctype._params[ 0]._ctype._identifier == self.ident: return None dc = deepcopy(decl) dc._ctype._params.insert(0, param) sm_name = mangler.mimpleSangle(dc) dc._name = mangler.muckFangle(dc, self.ident) for dcl in cl.members: if dcl._name == dc._name: return dc if sm_name in cl.virtuals: return dc return None