Changeset 4691


Ignore:
Timestamp:
10/03/08 10:40:56 (5 years ago)
Author:
marek
Message:

remove debugging output
help the parser to match "of-object" contructs

Location:
trunk/src/host/pye17/codegen
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/host/pye17/codegen/argtypes.py

    r4682 r4691  
    537537 
    538538            if typename != ptype: 
    539                 info.arglist.append('(%s *) %s' % (ptype[:-1], pname)) 
     539                info.arglist.append('(%s *) %s' % (ptype[:-1], pname)) 
    540540            else: 
    541541                info.arglist.append(pname) 
  • trunk/src/host/pye17/codegen/codegen.py

    r4664 r4691  
    321321            raise argtypes.ArgTypeNotFoundError("varargs functions not supported") 
    322322 
    323         fd = open("/tmp/codegen.log","a+") 
    324         fd.write(">>> write_function_wrapper() >>>\n") 
    325         fd.write("arglist 1: " + str(info.get_arglist()) + "\n") 
     323        #fd = open("/tmp/codegen.log","a+") 
     324        #fd.write(">>> write_function_wrapper() >>>\n") 
     325        #fd.write("arglist 1: " + str(info.get_arglist()) + "\n") 
    326326 
    327327        for param in function_obj.params: 
     
    329329                info.add_parselist('|', [], []) 
    330330            handler = argtypes.matcher.get(param.ptype) 
    331             fd.write("pname: " + param.pname + "; ptype: " + str(param.ptype) + "; pdflt: " + str(param.pdflt) + "; pnull: " + str(param.pnull) + "; handler: " + str(handler) + "\n") 
     331            #fd.write("pname: " + param.pname + "; ptype: " + str(param.ptype) + "; pdflt: " + str(param.pdflt) + "; pnull: " + str(param.pnull) + "; handler: " + str(handler) + "\n") 
    332332            handler.write_param(param.ptype, param.pname, param.pdflt, 
    333333                                param.pnull, info) 
    334334 
    335         fd.write("arglist 2: " + str(info.get_arglist()) + "\n") 
     335        #fd.write("arglist 2: " + str(info.get_arglist()) + "\n") 
    336336 
    337337        substdict['setreturn'] = '' 
     
    343343                                 function_obj.caller_owns_return, info) 
    344344 
    345         fd.write("arglist 3: " + str(info.get_arglist()) + "\n") 
     345        #fd.write("arglist 3: " + str(info.get_arglist()) + "\n") 
    346346 
    347347        if function_obj.deprecated != None: 
     
    390390            flags = 'METH_NOARGS' 
    391391 
    392         fd.write("arglist: " + str(info.get_arglist()) + "\n") 
    393         for key,item in substdict.iteritems(): 
    394                 fd.write("key: " + str(key) + ", item: " + str(item) + "\n") 
    395         fd.close() 
     392        #fd.write("arglist: " + str(info.get_arglist()) + "\n") 
     393        #for key,item in substdict.iteritems(): 
     394                #fd.write("key: " + str(key) + ", item: " + str(item) + "\n") 
     395        #fd.close() 
    396396 
    397397        return template % substdict, flags 
  • trunk/src/host/pye17/codegen/h2def.py

    r4682 r4691  
    6565split_prefix_pat = re.compile('([A-Za-z]*)_([A-Za-z0-9]+)') 
    6666 
    67 def find_obj_defs(buf, objdefs=[]): 
     67def find_obj_defs(buf, objdefs=[], objtypedefs={}): 
    6868    """ 
    6969    Try to find object definitions in header files. 
     
    7272    # filter out comments from buffer. 
    7373    buf = strip_comments(buf) 
    74  
    75     struct_typedef = {} 
    7674 
    7775    # handle typedef enum style defs. 
     
    8280        if not m: break 
    8381        #print "typedef struct: " + m.group(1) + " => " + m.group(2) 
    84         struct_typedef[m.group(1)] = m.group(2) 
     82        objtypedefs[m.group(1)] = m.group(2) 
    8583        pos = m.end() 
    8684 
     
    9593 
    9694        name = m.group(1) 
    97         if name in struct_typedef: 
    98                 name = struct_typedef[name] 
     95        if name in objtypedefs: 
     96                name = objtypedefs[name] 
    9997 
    10098        objdefs.append((name, None)) 
     
    328326arg_split_pat = re.compile("\s*,\s*") 
    329327 
    330 get_type_pat = re.compile(r'(const-)?([A-Za-z0-9]+)\*?\s+') 
     328get_type_pat = re.compile(r'(const-)?([A-Za-z0-9_]+)\*?\s+') 
    331329pointer_pat = re.compile('.*\*$') 
    332330func_new_pat = re.compile('(\w+)_new$') 
     
    402400            fp.write(')\n\n') 
    403401 
    404     def write_obj_defs(self, objdefs, fp=None): 
     402    def write_obj_defs(self, objdefs, objtypedefs, fp=None): 
    405403        if not fp: 
    406404            fp = self.fp 
     405 
     406        written_objs = 0 
    407407 
    408408        fp.write(';; -*- scheme -*-\n') 
     
    414414                if klass in filter: 
    415415                    continue 
    416             m = split_prefix_pat.match(klass) 
    417             cmodule = None 
    418             cname = klass 
    419             if m: 
    420                 cmodule = m.group(1) 
    421                 #cname = m.group(2) 
    422             fp.write('(define-object ' + cname + '\n') 
    423             if cmodule: 
    424                 fp.write('  (in-module "' + cmodule + '")\n') 
    425             if parent: 
    426                 fp.write('  (parent "' + parent + '")\n') 
    427             fp.write('  (c-name "' + klass + '")\n') 
    428             #fp.write('  (gtype-id "' + typecode(klass) + '")\n') 
    429             fp.write('  (gtype-id "' + klass + '")\n') 
    430             # should do something about accessible fields 
    431             fp.write(')\n\n') 
     416            self.write_obj_defs_to_file(fp, klass, parent) 
     417            written_objs += 1 
     418 
     419        # if we have no struct definitions (e.g. ecore_evas) we should try add some objects for the object generation 
     420        if written_objs == 0: 
     421            for klass in objtypedefs: 
     422                self.write_obj_defs_to_file(fp, objtypedefs[klass], None) 
     423 
     424    def write_obj_defs_to_file(self, fp, klass, parent): 
     425        m = split_prefix_pat.match(klass) 
     426        cmodule = None 
     427        cname = klass 
     428        if m: 
     429            cmodule = m.group(1) 
     430            #cname = m.group(2) 
     431        fp.write('(define-object ' + cname + '\n') 
     432        if cmodule: 
     433            fp.write('  (in-module "' + cmodule + '")\n') 
     434        if parent: 
     435            fp.write('  (parent "' + parent + '")\n') 
     436        fp.write('  (c-name "' + klass + '")\n') 
     437        #fp.write('  (gtype-id "' + typecode(klass) + '")\n') 
     438        fp.write('  (gtype-id "' + klass + '")\n') 
     439        # should do something about accessible fields 
     440        fp.write(')\n\n') 
    432441 
    433442    def _define_func(self, buf): 
     
    505514            munged_name = name.replace('_', '') 
    506515            m = get_type_pat.match(args[0]) 
    507             if m: 
     516            if m and name.find('new') < 0: 
    508517                obj = m.group(2) 
    509                 if munged_name[:len(obj)] == obj.lower(): 
     518                if name[:len(obj)].lower() == obj.lower(): 
    510519                    self._write_method(obj, name, ret, args) 
    511520                    return 
     
    526535        # Hmmm... Let's asume that a constructor function name 
    527536        # ends with '_new' and it returns a pointer. 
    528         #m = func_new_pat.match(name) 
    529         #if pointer_pat.match(ret) and m: 
    530             #cname = '' 
    531             #for s in m.group(1).split ('_'): 
    532                 #cname += s.title() 
    533             #if cname != '': 
    534                 #self.fp.write('  (is-constructor-of "' + cname + '")\n') 
     537        m = func_new_pat.match(name) 
     538        if pointer_pat.match(ret) and m: 
     539            cname = '' 
     540            for s in m.group(1).split ('_'): 
     541                cname += s.title() 
     542            if cname != '': 
     543                self.fp.write('  (is-constructor-of "' + cname + '")\n') 
    535544 
    536545        self._write_return(ret) 
     
    614623    # read all the object definitions in 
    615624    objdefs = [] 
     625    objtypedefs = {} 
    616626    enums = [] 
    617627    for filename in args: 
    618628        buf = open(filename).read() 
    619         find_obj_defs(buf, objdefs) 
     629        find_obj_defs(buf, objdefs, objtypedefs) 
    620630        find_enum_defs(buf, enums) 
    621631    #objdefs = sort_obj_defs(objdefs) 
     
    627637        dw = DefsWriter(methods, prefix=modulename, verbose=verbose, 
    628638                        defsfilter=defsfilter) 
    629         dw.write_obj_defs(objdefs, types) 
     639        dw.write_obj_defs(objdefs, objtypedefs, types) 
    630640        dw.write_enum_defs(enums, types) 
    631641        print "Wrote %s-types.defs" % separate 
     
    641651            dw.write_enum_defs(enums) 
    642652        elif onlyobjdefs: 
    643             dw.write_obj_defs(objdefs) 
     653            dw.write_obj_defs(objdefs, objtypedefs) 
    644654        else: 
    645             dw.write_obj_defs(objdefs) 
     655            dw.write_obj_defs(objdefs, objtypedefs) 
    646656            dw.write_enum_defs(enums) 
    647657 
Note: See TracChangeset for help on using the changeset viewer.