コード例 #1
0
ファイル: decl_keeper.py プロジェクト: amstuta/Kooc
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
コード例 #2
0
ファイル: user_class.py プロジェクト: amstuta/Kooc
 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
コード例 #3
0
 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
コード例 #4
0
 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
コード例 #5
0
ファイル: user_class.py プロジェクト: amstuta/Kooc
 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
コード例 #6
0
ファイル: user_class.py プロジェクト: amstuta/Kooc
 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)
コード例 #7
0
 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)
コード例 #8
0
    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
コード例 #9
0
ファイル: implementation.py プロジェクト: amstuta/Kooc
    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
コード例 #10
0
ファイル: user_class.py プロジェクト: amstuta/Kooc
    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
コード例 #11
0
    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