Exemplo n.º 1
0
 def _bitfield_types(self, fname):
     with cxxheader(fname, self.hdr_bitfields_h, ['df']) as f:
         for e in etx('bitfield-type')(self.woot):
             type_t, lines, unused = bitfield_t(e)
             self.emitted.add(type_t)
             for l in lines:
                 f.write(self.indent + l + "\n");
Exemplo n.º 2
0
 def getaddr(name):
     xpa = "symbol-table[@name='{version}']/global-address[@name='{global_name}']".format(
         version = self._version, global_name = name)
     el =  etx(xpa)(self.woot)
     try:
         return el[0].get('value')
     except IndexError:
         return None
Exemplo n.º 3
0
 def eat(self, fname):
     t = etree.parse(fname, self._p).getroot()
     etree.strip_elements(t, "comment", "code-helper")
     etree.strip_tags(t, "virtual-methods")
     for e in t.iter():
         if isinstance(e, etree._Comment):
             e.getparent().remove(e)
         else:
             e.tail = e.text = None
         try:
             e.set("xmlfilename", fname)
         except TypeError:
             pass
     self.woot.extend( etx('*')(t) )
Exemplo n.º 4
0
 def _compound_types(self, fname):
     global df_type_tab
     els = etx("struct-type")(self.woot) + etx("class-type")(self.woot)       
     types = {}
     for e in els:
         type_t, lines, deps = struct_t(e)
         df_type_tab[e.get('type-name')] = 'df::' + type_t
         types[e.get('type-name')] = (lines, deps)
     all = set(types.keys())
     
     with cxxheader(fname, self.hdr_structs_h, ['df']) as f, io.StringIO() as stuff:
         f.write(self.indent.join(self.df_helper_defs))
         for tname in all: # emit forward decls for all 
             f.write(self.indent + 'struct ' + tname + ";\n")
         while len(all) > 0:
             for tname in all:
                 #print("{} :{}".format(tname, types[tname][1]))
                 if len(types[tname][1]) == 0:
                     for l in types[tname][0]:
                         stuff.write(self.indent + l + "\n")
                     self.emitted.add(tname)
             _a = len(all)
             _e = len(self.emitted)
             all.difference_update(self.emitted)
             if _a == len(all):
                 print("error: type dependency loop.")
                 for tn in all:
                     deps = types[tn][1]
                     aid = all.intersection(deps)
                     if len(aid) == 0: # deps of type can't be fullfilled by any in all
                         print("{}: {}".format(tn, deps))
                         for d in deps:
                             print (d, types[d][1])
                 raise Error
             for tname in all:
                 types[tname][1].difference_update(self.emitted)
         f.write(stuff.getvalue())
Exemplo n.º 5
0
    def _globals(self, hfname, ccfname):
        global df_type_tab, static_crap
        def getaddr(name):
            xpa = "symbol-table[@name='{version}']/global-address[@name='{global_name}']".format(
                version = self._version, global_name = name)
            el =  etx(xpa)(self.woot)
            try:
                return el[0].get('value')
            except IndexError:
                return None

        gcode = open(ccfname, "w")
        gcode.write(self.hdr_globals_h)
        gcode.write('#include "globals.h"\n\n')

        with cxxheader(hfname, self.hdr_globals_h, ['df', 'global']) as ghead:
            for e in etx("global-object")(self.woot):
                name = e.get('name')
                type_t, decl, deps = pointer_t(e)
                if decl:
                    for l in decl:
                        ghead.write(self.indent + l + "\n")
                    df_type_tab[type_t] = 'df::global::' + type_t
                ghead.write("{indent}extern {type_t} const {name};\n".format(
                    type_t = type_t, name = name, indent = self.indent))
                address = getaddr(name)
                name = 'df::global::' + name
                if address is None:
                    print("warning: no address for ``{} {}'', assuming NULL.".format(type_t, name))
                    address = 'NULL'
                gcode.write("{type_t} const {name} = ({type_t}) {value};\n".format(
                    type_t = df_type_tab.get(type_t, type_t),
                    name = name, 
                    value = address))
        for l in static_crap:
            gcode.write(l + "\n")
        gcode.close()