r4691 - trunk/src/host/pye17/codegen

marek at docs.openmoko.org marek at docs.openmoko.org
Fri Oct 3 10:40:57 CEST 2008


Author: marek
Date: 2008-10-03 10:40:56 +0200 (Fri, 03 Oct 2008)
New Revision: 4691

Modified:
   trunk/src/host/pye17/codegen/argtypes.py
   trunk/src/host/pye17/codegen/codegen.py
   trunk/src/host/pye17/codegen/h2def.py
Log:
remove debugging output
help the parser to match "of-object" contructs

Modified: trunk/src/host/pye17/codegen/argtypes.py
===================================================================
--- trunk/src/host/pye17/codegen/argtypes.py	2008-10-02 13:53:01 UTC (rev 4690)
+++ trunk/src/host/pye17/codegen/argtypes.py	2008-10-03 08:40:56 UTC (rev 4691)
@@ -536,7 +536,7 @@
 	    #fd.close
 
             if typename != ptype:
-	        info.arglist.append('(%s *) %s' % (ptype[:-1], pname))
+                info.arglist.append('(%s *) %s' % (ptype[:-1], pname))
             else:
                 info.arglist.append(pname)
 

Modified: trunk/src/host/pye17/codegen/codegen.py
===================================================================
--- trunk/src/host/pye17/codegen/codegen.py	2008-10-02 13:53:01 UTC (rev 4690)
+++ trunk/src/host/pye17/codegen/codegen.py	2008-10-03 08:40:56 UTC (rev 4691)
@@ -320,19 +320,19 @@
         if function_obj.varargs:
             raise argtypes.ArgTypeNotFoundError("varargs functions not supported")
 
-	fd = open("/tmp/codegen.log","a+")
-	fd.write(">>> write_function_wrapper() >>>\n")
-	fd.write("arglist 1: " + str(info.get_arglist()) + "\n")
+	#fd = open("/tmp/codegen.log","a+")
+	#fd.write(">>> write_function_wrapper() >>>\n")
+	#fd.write("arglist 1: " + str(info.get_arglist()) + "\n")
 
         for param in function_obj.params:
             if param.pdflt != None and '|' not in info.parsestr:
                 info.add_parselist('|', [], [])
             handler = argtypes.matcher.get(param.ptype)
-	    fd.write("pname: " + param.pname + "; ptype: " + str(param.ptype) + "; pdflt: " + str(param.pdflt) + "; pnull: " + str(param.pnull) + "; handler: " + str(handler) + "\n")
+	    #fd.write("pname: " + param.pname + "; ptype: " + str(param.ptype) + "; pdflt: " + str(param.pdflt) + "; pnull: " + str(param.pnull) + "; handler: " + str(handler) + "\n")
             handler.write_param(param.ptype, param.pname, param.pdflt,
                                 param.pnull, info)
 
-	fd.write("arglist 2: " + str(info.get_arglist()) + "\n")
+	#fd.write("arglist 2: " + str(info.get_arglist()) + "\n")
 
         substdict['setreturn'] = ''
         if handle_return:
@@ -342,7 +342,7 @@
             handler.write_return(function_obj.ret,
                                  function_obj.caller_owns_return, info)
 
-	fd.write("arglist 3: " + str(info.get_arglist()) + "\n")
+	#fd.write("arglist 3: " + str(info.get_arglist()) + "\n")
 
         if function_obj.deprecated != None:
             deprecated = self.deprecated_tmpl % {
@@ -389,10 +389,10 @@
             substdict['extraparams'] = ''
             flags = 'METH_NOARGS'
 
-	fd.write("arglist: " + str(info.get_arglist()) + "\n")
-	for key,item in substdict.iteritems():
-		fd.write("key: " + str(key) + ", item: " + str(item) + "\n")
-        fd.close()
+	#fd.write("arglist: " + str(info.get_arglist()) + "\n")
+	#for key,item in substdict.iteritems():
+		#fd.write("key: " + str(key) + ", item: " + str(item) + "\n")
+        #fd.close()
 
         return template % substdict, flags
 

Modified: trunk/src/host/pye17/codegen/h2def.py
===================================================================
--- trunk/src/host/pye17/codegen/h2def.py	2008-10-02 13:53:01 UTC (rev 4690)
+++ trunk/src/host/pye17/codegen/h2def.py	2008-10-03 08:40:56 UTC (rev 4691)
@@ -64,7 +64,7 @@
 
 split_prefix_pat = re.compile('([A-Za-z]*)_([A-Za-z0-9]+)')
 
-def find_obj_defs(buf, objdefs=[]):
+def find_obj_defs(buf, objdefs=[], objtypedefs={}):
     """
     Try to find object definitions in header files.
     """
@@ -72,8 +72,6 @@
     # filter out comments from buffer.
     buf = strip_comments(buf)
 
-    struct_typedef = {}
-
     # handle typedef enum style defs.
     pat = re.compile("typedef struct\s*([_A-Za-z]*)\s*([_A-Za-z]*)\s*;", re.MULTILINE)
     pos = 0
@@ -81,7 +79,7 @@
         m = pat.search(buf, pos)
         if not m: break
 	#print "typedef struct: " + m.group(1) + " => " + m.group(2)
-	struct_typedef[m.group(1)] = m.group(2)
+	objtypedefs[m.group(1)] = m.group(2)
         pos = m.end()
 
     # first find all structures that look like they may represent a GtkObject
@@ -94,8 +92,8 @@
 	#print "struct: " + m.group(1) + " => " + m.group(2)
 
 	name = m.group(1)
-	if name in struct_typedef:
-		name = struct_typedef[name]
+	if name in objtypedefs:
+		name = objtypedefs[name]
 
         objdefs.append((name, None))
         pos = m.end()
@@ -327,7 +325,7 @@
 #"""
 arg_split_pat = re.compile("\s*,\s*")
 
-get_type_pat = re.compile(r'(const-)?([A-Za-z0-9]+)\*?\s+')
+get_type_pat = re.compile(r'(const-)?([A-Za-z0-9_]+)\*?\s+')
 pointer_pat = re.compile('.*\*$')
 func_new_pat = re.compile('(\w+)_new$')
 
@@ -401,10 +399,12 @@
             fp.write('  )\n')
             fp.write(')\n\n')
 
-    def write_obj_defs(self, objdefs, fp=None):
+    def write_obj_defs(self, objdefs, objtypedefs, fp=None):
         if not fp:
             fp = self.fp
 
+        written_objs = 0
+
         fp.write(';; -*- scheme -*-\n')
         fp.write('; object definitions ...\n')
 
@@ -413,23 +413,32 @@
             if filter:
                 if klass in filter:
                     continue
-            m = split_prefix_pat.match(klass)
-            cmodule = None
-            cname = klass
-            if m:
-                cmodule = m.group(1)
-                #cname = m.group(2)
-            fp.write('(define-object ' + cname + '\n')
-            if cmodule:
-                fp.write('  (in-module "' + cmodule + '")\n')
-            if parent:
-                fp.write('  (parent "' + parent + '")\n')
-            fp.write('  (c-name "' + klass + '")\n')
-            #fp.write('  (gtype-id "' + typecode(klass) + '")\n')
-	    fp.write('  (gtype-id "' + klass + '")\n')
-            # should do something about accessible fields
-            fp.write(')\n\n')
+            self.write_obj_defs_to_file(fp, klass, parent)
+            written_objs += 1
 
+        # if we have no struct definitions (e.g. ecore_evas) we should try add some objects for the object generation
+        if written_objs == 0:
+            for klass in objtypedefs:
+                self.write_obj_defs_to_file(fp, objtypedefs[klass], None)
+
+    def write_obj_defs_to_file(self, fp, klass, parent):
+        m = split_prefix_pat.match(klass)
+        cmodule = None
+        cname = klass
+        if m:
+            cmodule = m.group(1)
+            #cname = m.group(2)
+        fp.write('(define-object ' + cname + '\n')
+        if cmodule:
+            fp.write('  (in-module "' + cmodule + '")\n')
+        if parent:
+            fp.write('  (parent "' + parent + '")\n')
+        fp.write('  (c-name "' + klass + '")\n')
+        #fp.write('  (gtype-id "' + typecode(klass) + '")\n')
+        fp.write('  (gtype-id "' + klass + '")\n')
+        # should do something about accessible fields
+        fp.write(')\n\n')
+
     def _define_func(self, buf):
         buf = clean_func(buf)
         buf = string.split(buf,'\n')
@@ -504,9 +513,9 @@
             # methods must have at least one argument
             munged_name = name.replace('_', '')
             m = get_type_pat.match(args[0])
-            if m:
+            if m and name.find('new') < 0:
                 obj = m.group(2)
-                if munged_name[:len(obj)] == obj.lower():
+                if name[:len(obj)].lower() == obj.lower():
                     self._write_method(obj, name, ret, args)
                     return
 
@@ -525,13 +534,13 @@
 
         # Hmmm... Let's asume that a constructor function name
         # ends with '_new' and it returns a pointer.
-        #m = func_new_pat.match(name)
-        #if pointer_pat.match(ret) and m:
-            #cname = ''
-            #for s in m.group(1).split ('_'):
-                #cname += s.title()
-            #if cname != '':
-                #self.fp.write('  (is-constructor-of "' + cname + '")\n')
+        m = func_new_pat.match(name)
+        if pointer_pat.match(ret) and m:
+            cname = ''
+            for s in m.group(1).split ('_'):
+                cname += s.title()
+            if cname != '':
+                self.fp.write('  (is-constructor-of "' + cname + '")\n')
 
         self._write_return(ret)
         self._write_arguments(args)
@@ -613,10 +622,11 @@
 
     # read all the object definitions in
     objdefs = []
+    objtypedefs = {}
     enums = []
     for filename in args:
         buf = open(filename).read()
-        find_obj_defs(buf, objdefs)
+        find_obj_defs(buf, objdefs, objtypedefs)
         find_enum_defs(buf, enums)
     #objdefs = sort_obj_defs(objdefs)
 
@@ -626,7 +636,7 @@
 
         dw = DefsWriter(methods, prefix=modulename, verbose=verbose,
                         defsfilter=defsfilter)
-        dw.write_obj_defs(objdefs, types)
+        dw.write_obj_defs(objdefs, objtypedefs, types)
         dw.write_enum_defs(enums, types)
         print "Wrote %s-types.defs" % separate
 
@@ -640,9 +650,9 @@
         if onlyenums:
             dw.write_enum_defs(enums)
         elif onlyobjdefs:
-            dw.write_obj_defs(objdefs)
+            dw.write_obj_defs(objdefs, objtypedefs)
         else:
-            dw.write_obj_defs(objdefs)
+            dw.write_obj_defs(objdefs, objtypedefs)
             dw.write_enum_defs(enums)
 
             for filename in args:




More information about the commitlog mailing list