def genParseEventStructures(allEvents, classId): parseMacro = "TRACE_" + string.upper(classId) + "_PARSE_DEFINE_IN_C" print '#ifdef', parseMacro print "TraceEventParse trace" + classId + "EventParse[] = {" # define a function to replace the positional arguments with %pos[%fmt] pFmt = '%(?P<argNo>\d+)' # identify a field argument def pFmt2k42(matchObject): fieldNo = int(matchObject.group('argNo')) fieldName = anEvent.getFieldNameByPos(fieldNo) fieldFormat = anEvent.getFieldFormat(fieldName) traceFieldNo = anEvent.getTraceFields().index(fieldName) return '%' + str(traceFieldNo) + '[' + fieldFormat + ']' # generate the parse structure for each event for anEvent in allEvents: print "\t{ __TR(" + pemEvent.getEventSpecifierMacro(anEvent) + ")," parseString = "\"" for field in anEvent.getTraceFields(): # anEvent._fieldSeq: parseString = parseString + \ pemTypes.getTypeBitSize(anEvent.getFieldType(field)) + " " parseString = parseString + "\"" print "\t" + parseString + "," if anEvent._printFormat != None: print "\t \"" + re.sub(pFmt, pFmt2k42, anEvent._printFormat) + "\"}," else: print "\t \"\" }," print "};" print '#else /* #ifdef', parseMacro, '*/' print "extern TraceEventParse trace" + classId + "EventParse[];" print '#endif /* #ifdef', parseMacro, '*/' print '\n'
def genParseEventStructures(allEvents, classId): parseMacro = "TRACE_" + string.upper(classId) + "_PARSE_DEFINE_IN_C" print '#ifdef', parseMacro print "TraceEventParse trace" + classId + "EventParse[] = {" # define a function to replace the positional arguments with %pos[%fmt] pFmt = '%(?P<argNo>\d+)' # identify a field argument def pFmt2k42(matchObject): fieldNo = int(matchObject.group('argNo')) fieldName = anEvent.getFieldNameByPos(fieldNo) fieldFormat = anEvent.getFieldFormat(fieldName) traceFieldNo = anEvent.getTraceFields().index(fieldName) return '%' + str(traceFieldNo) + '[' + fieldFormat + ']' # generate the parse structure for each event for anEvent in allEvents: print "\t{ __TR(" + pemEvent.getEventSpecifierMacro(anEvent) + ")," parseString = "\"" for field in anEvent.getTraceFields(): # anEvent._fieldSeq: parseString = parseString + \ pemTypes.getTypeBitSize(anEvent.getFieldType(field)) + " " parseString = parseString + "\"" print "\t" + parseString + "," if anEvent._printFormat != None: print "\t \""+re.sub(pFmt, pFmt2k42, anEvent._printFormat)+"\"}," else: print "\t \"\" }," print "};" print '#else /* #ifdef', parseMacro, '*/' print "extern TraceEventParse trace" + classId + "EventParse[];" print '#endif /* #ifdef', parseMacro, '*/' print '\n'
def packFields(self): args = {} filled = 0 i = 0 for field in self.getTraceFields(): fieldType = self.getFieldType(field) if self.isListField(field): if filled > 0: args[i] = args[i] + ")" i = i+1 filled = 0 # for C we need an extra argument, the size of the list, which # is computed in pemGenPEMAPI if pemGlobals.language == 'C': #args[i] = string.replace(self.getListCount(field), '_', '', 1) + \ # "* (" + pemTypes.getTypeBitSize(fieldType) + " >> 3)" #args[i+1] = field args[i] = '___listLength' args[i+1] = '(void *)___tmpBuffer' i = i+2 else: args[i] = field i = i+1 elif fieldType == 'uint64' or fieldType == 'string': if filled > 0: args[i] = args[i] + ")" i = i+1 filled = 0 args[i] = field i = i+1 else: typeBitSize = int(pemTypes.getTypeBitSize(fieldType)) if (filled + typeBitSize) <= 64: if not args.has_key(i): args[i] = "("+pemTypes.getCType('uint64')+ ")(" if filled > 0: args[i] = args[i] + "|" args[i] = args[i] + \ "((("+pemTypes.getCType('uint64')+")"+field+")<<"+\ str(64-filled-typeBitSize) + ")" else: i = i + 1 args[i] = "("+pemTypes.getCType('uint64')+ ")(" + \ "((("+pemTypes.getCType('uint64')+")"+field+")<<"+\ str(64-filled-typeBitSize) + ")" filled = 0 filled = filled + typeBitSize if filled == 64: args[i] = args[i] + ")" i = i+1 filled = 0 if filled > 0: args[i] = args[i] + ")" return args
def packFields(self): args = {} filled = 0 i = 0 for field in self.getTraceFields(): fieldType = self.getFieldType(field) if self.isListField(field): if filled > 0: args[i] = args[i] + ")" i = i + 1 filled = 0 # for C we need an extra argument, the size of the list, which # is computed in pemGenPEMAPI if pemGlobals.language == 'C': #args[i] = string.replace(self.getListCount(field), '_', '', 1) + \ # "* (" + pemTypes.getTypeBitSize(fieldType) + " >> 3)" #args[i+1] = field args[i] = '___listLength' args[i + 1] = '(void *)___tmpBuffer' i = i + 2 else: args[i] = field i = i + 1 elif fieldType == 'uint64' or fieldType == 'string': if filled > 0: args[i] = args[i] + ")" i = i + 1 filled = 0 args[i] = field i = i + 1 else: typeBitSize = int(pemTypes.getTypeBitSize(fieldType)) if (filled + typeBitSize) <= 64: if not args.has_key(i): args[i] = "(" + pemTypes.getCType('uint64') + ")(" if filled > 0: args[i] = args[i] + "|" args[i] = args[i] + \ "((("+pemTypes.getCType('uint64')+")"+field+")<<"+\ str(64-filled-typeBitSize) + ")" else: i = i + 1 args[i] = "("+pemTypes.getCType('uint64')+ ")(" + \ "((("+pemTypes.getCType('uint64')+")"+field+")<<"+\ str(64-filled-typeBitSize) + ")" filled = 0 filled = filled + typeBitSize if filled == 64: args[i] = args[i] + ")" i = i + 1 filled = 0 if filled > 0: args[i] = args[i] + ")" return args