From 648d6381cac8376b5217f915eb49e3aea232df26 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Mon, 29 Apr 2013 16:58:52 -0400 Subject: Minor bug fixes for tuple_table/col_map. --- parse/col_map.py | 4 ++-- parse/tuple_table.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'parse') diff --git a/parse/col_map.py b/parse/col_map.py index 15e1d64..ccce865 100644 --- a/parse/col_map.py +++ b/parse/col_map.py @@ -19,7 +19,7 @@ class ColMapBuilder(object): class ColMap(object): def __init__(self, col_list, values = None): - self.col_list = col_list + self.col_list = sorted(col_list) self.rev_map = {} self.values = values @@ -47,7 +47,7 @@ class ColMap(object): if col not in kv: key += (None,) else: - key += (kv[col],) + key += (str(kv[col]),) return key diff --git a/parse/tuple_table.py b/parse/tuple_table.py index 320d9dd..6edc037 100644 --- a/parse/tuple_table.py +++ b/parse/tuple_table.py @@ -23,7 +23,7 @@ class TupleTable(object): def __setitem__(self, kv, value): key = self.col_map.get_key(kv) - self.table[key] + self.table[key] = value def __contains__(self, kv): key = self.col_map.get_key(kv) -- cgit v1.2.2 From 6f2558b8c4f4e33630b40dfbe20024f7a372a8f0 Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Thu, 2 May 2013 13:42:17 -0400 Subject: Modified sched.py field padding calculations to account for bitfields. --- parse/sched.py | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'parse') diff --git a/parse/sched.py b/parse/sched.py index 4933037..a25ec15 100644 --- a/parse/sched.py +++ b/parse/sched.py @@ -65,15 +65,38 @@ record_map = {} RECORD_SIZE = 24 NSEC_PER_MSEC = 1000000 +def bits_to_bytes(bits): + '''Includes padding''' + return bits / 8 + (1 if bits%8 else 0) + +def field_bytes(fields): + fbytes = 0 + fbits = 0 + for f in fields: + flist = list(f) + + if len(flist) > 2: + # Specified a bitfield + fbits += flist[2] + else: + # Only specified a type, use types size + fbytes += sizeof(list(f)[1]) + + # Bitfields followed by a byte will cause any incomplete + # bytes to be turned into full bytes + fbytes += bits_to_bytes(fbits) + fbits = 0 + + fbytes += bits_to_bytes(fbits) + return fbytes + fbits + def register_record(id, clazz): fields = clazz.FIELDS - - fsize = lambda fields : sum([sizeof(list(f)[1]) for f in fields]) - diff = RECORD_SIZE - fsize(SchedRecord.FIELDS) - fsize(fields) + diff = RECORD_SIZE - field_bytes(SchedRecord.FIELDS) - field_bytes(fields) # Create extra padding fields to make record the proper size # Creating one big field of c_uint64 and giving it a size of 8*diff - # _shoud_ work, but doesn't. This is an uglier way of accomplishing + # _should_ work, but doesn't. This is an uglier way of accomplishing # the same goal for d in range(diff): fields += [("extra%d" % d, c_char)] -- cgit v1.2.2