On 12/20/2011 10:51 AM, Anthony Liguori wrote:
This is series 2/4 of the QOM refactoring. These series are divided up based on the major scripted code conversions.
Dang, this should have been an RFC, apologies.
This series makes qdev a proper Object and converts qdev's type inheritance to QOM inheritance. The first half of the series are manual cleanups/refactorings. The second half is mostly scripted conversion, separated out into reviewable and bisectable chunks. There are a number of patches prefixed with 'not-for-upstream'. As is not surprising with a refactoring like this, it turned up some interesting corner cases. Part of the purpose of this RFC is to get some feedback on how to best handle these cases. I've tested this series extensively for the pc target including bisectability. I've tested this series extensively for the pc target including bisectability. I have not tested any other targets yet so your mileage may vary. This is also available at: https://github.com/aliguori/qemu/tree/qom-upstream.5 For full context, the whole tree is located at: https://github.com/aliguori/qemu/commits/qom-rebase.6 I'll reply to this note with a code of the patch monkey script I used for much of this series.
Attached here. Regards, Anthony Liguori
import sys info = 'SSISlaveInfo' klass = 'SSISlaveClass' cast = 'SSI_SLAVE_CLASS' lines = sys.stdin.read().split('\n') i = 0 while i < len(lines): line = lines[i] i += 1 if line.startswith('static %s ' % info): if not line.endswith('info = {'): raise Exception('Cannot process this form "%s"' % line) name = line.split()[2][:-5] items = [] processed_lines = [] while i < len(lines) and lines[i] != '};': line = lines[i] i += 1 processed_lines.append(line) if line.strip() == '' or line.strip().startswith('/*'): continue try: key, value = map(lambda x: x.strip(), line.split('=', 1)) if value.endswith(','): value = value[:-1] except: sys.stdout.write('\n'.join(processed_lines)) raise if key == '.qdev.props' and value.startswith('('): properties = [] while i < len(lines) and lines[i].strip() not in ['},', '}']: line = lines[i] i += 1 line = line.strip() if line.endswith(','): line = line[:-1] properties.append(line) if i == len(lines): raise Exception('Cannot find end of properties') i += 1 value = properties items.append((key, value)) if i == len(lines): raise Exception('Cannot find end of type info') i += 1 props = filter(lambda (x,y): x == '.qdev.props', items) if len(props) and type(props[0][1]) == list: print 'static Property %s_properties[] = {' % name for prop in props[0][1]: print ' %s,' % prop print '};' print print '''static void %s_class_init(ObjectClass *klass, void *data) { %s *k = %s(klass); ''' % (name, klass, cast) for key, value in items: if key.startswith('.qdev.'): continue print ' k->%s = %s;' % (key[1:], value) print '''} static DeviceInfo %s_info = {''' % name for key, value in items: if not key.startswith('.qdev.'): continue if key == '.qdev.props' and type(value) == list: print ' .props = %s_properties,' % name else: print ' %s = %s,' % (key[5:], value) print ' .class_init = %s_class_init,' % (name) print '};' elif i < len(lines): print line