summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2018-02-27 12:45:12 +0200
committerYuval Adam <_@yuv.al>2018-02-27 12:57:10 +0200
commita5e675be5d52389ea806e834e303eca4dc8047f5 (patch)
tree27f5267c881577901bd4615131de7e10d969b3bc
parentb07ed7f89ce2fcc29585e746ea3db4b599ee3c67 (diff)
Add sparse array support
-rw-r--r--viewstate/parse.py15
1 files changed, 15 insertions, 0 deletions
diff --git a/viewstate/parse.py b/viewstate/parse.py
index b9d2ae1..4905c09 100644
--- a/viewstate/parse.py
+++ b/viewstate/parse.py
@@ -59,6 +59,17 @@ def parse_array(b):
l.append(val)
return l, remain
+def parse_sparse_array(b):
+ type, remain = parse_type(b)
+ length, remain = parse_int(remain)
+ n, remain = parse_int(remain)
+ l = [None] * length
+ for _ in range(n):
+ idx, remain = parse_int(remain)
+ val, remain = parse(remain)
+ l[idx] = val
+ return l, remain
+
def parse_dict(b):
n = b[0]
d = {}
@@ -101,6 +112,10 @@ def parse(b):
return parse_array(b[1:])
elif b[0] == 0x18:
return parse_dict(b[1:])
+ elif b[0] == 0x1f:
+ return parse_int(b[1:])
+ elif b[0] == 0x3c:
+ return parse_sparse_array(b[1:])
else:
raise ViewStateException(f'Unable to parse remainder of {len(b)} bytes {b[:20]}')
return b, bytes()