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