X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=wrappers%2Ftrace.py;h=10f71a4dc7a32362dfafe3d96d68705ed3578db8;hb=a78c14780294e326d79f3968f82de1e7bab412c2;hp=17e4e9c9baf03a0158dbc4ebf02ee6a3afdd02f8;hpb=ba7bb0d584f82da2de0db2af720c037ca386c945;p=apitrace diff --git a/wrappers/trace.py b/wrappers/trace.py index 17e4e9c..10f71a4 100644 --- a/wrappers/trace.py +++ b/wrappers/trace.py @@ -207,54 +207,66 @@ class ValueSerializer(stdapi.Visitor, stdapi.ExpanderMixin): print ' }' def visitAttribArray(self, array, instance): - # iterate element by element and for each, decide if it is a key or value (which depends on the - # previous key). If it is a value, look up what it means and store it as the right type - usually - # int, some bitfield, or some enum. + # For each element, decide if it is a key or a value (which depends on the previous key). + # If it is a value, store it as the right type - usually int, some bitfield, or some enum. + # It is currently assumed that an unknown key means that it is followed by an int value. - # determine the array length, which is unfortunately needed by writeArray() up front + # determine the array length which must be passed to writeArray() up front count = '_c' + array.keyType.tag + print ' {' print ' int %s;' % count - print ' for (%(c)s = 0; %(array)s && %(array)s[%(c)s]; %(c)s++) {' % {'c': count, 'array': instance} - print ' switch (%(array)s[%(c)s]) {' % {'array': instance, 'c': count} - for key, valueType in array.valueTypes: - if valueType is not None: - print ' case %s:' % key - print ' %s++;' % count # only a null key marks the end; skip null values - print ' break;' - print ' }' + print ' for (%(c)s = 0; %(array)s && %(array)s[%(c)s] != %(terminator)s; %(c)s += 2) {' \ + % {'c': count, 'array': instance, 'terminator': array.terminator} + if array.hasKeysWithoutValues: + print ' switch (int(%(array)s[%(c)s])) {' % {'array': instance, 'c': count} + for key, valueType in array.valueTypes: + if valueType is None: + print ' case %s:' % key + print ' %s--;' % count # the next value is a key again and checked if it's the terminator + print ' break;' + print ' }' print ' }' - # ### not handling null attrib_list differently from empty + print ' %(c)s += %(array)s ? 1 : 0;' % {'c': count, 'array': instance} print ' trace::localWriter.beginArray(%s);' % count # for each key / key-value pair write the key and the value, if the key requires one index = '_i' + array.keyType.tag print ' for (int %(i)s = 0; %(i)s < %(count)s; %(i)s++) {' % {'i': index, 'count': count} + print ' trace::localWriter.beginElement();' self.visitEnum(array.keyType, "%(array)s[%(i)s]" % {'array': instance, 'i': index}) - print ' switch (%(array)s[%(i)s]) {' % {'array': instance, 'i': index} + print ' trace::localWriter.endElement();' + print ' if (%(i)s + 1 >= %(count)s) {' % {'i': index, 'count': count} + print ' break;' + print ' }' + print ' switch (int(%(array)s[%(i)s++])) {' % {'array': instance, 'i': index} # write generic value the usual way for key, valueType in array.valueTypes: if valueType is not None: print ' case %s:' % key - print ' %s++;' % index print ' trace::localWriter.beginElement();' self.visitElement(index, valueType, '(%(array)s)[%(i)s]' % {'array': instance, 'i': index}) print ' trace::localWriter.endElement();' print ' break;' + # known key with no value, just decrease the index so we treat the next value as a key + if array.hasKeysWithoutValues: + for key, valueType in array.valueTypes: + if valueType is None: + print ' case %s:' % key + print ' %s--;' % index + print ' break;' # unknown key, write an int value print ' default:' - print ' %s++;' % index print ' trace::localWriter.beginElement();' - print ' trace::localWriter.writeSInt(%(array)s[%(i)s]);' % {'array': instance, 'i': index} + print ' os::log("apitrace: warning: %s: unknown key 0x%04X, interpreting value as int\\n", ' + \ + '__FUNCTION__, int(%(array)s[%(i)s]));' % {'array': instance, 'i': index} + print ' trace::localWriter.writeSInt(%(array)s[%(i)s]);' % {'array': instance, 'i': index} print ' trace::localWriter.endElement();' - # known key with no value, do nothing - for key, valueType in array.valueTypes: - if valueType is None: - print ' case %s:' % key print ' break;' print ' }' print ' }' print ' trace::localWriter.endArray();' + print ' }' def visitBlob(self, blob, instance):