diff --git a/design/mvp/CanonicalABI.md b/design/mvp/CanonicalABI.md index 16f3164d..0f2648ce 100644 --- a/design/mvp/CanonicalABI.md +++ b/design/mvp/CanonicalABI.md @@ -180,6 +180,7 @@ def size_variant(cases): def size_flags(labels): n = len(labels) + if n == 0: return 0 if n <= 8: return 1 if n <= 16: return 2 return 4 * num_i32_flags(labels) diff --git a/design/mvp/canonical-abi/definitions.py b/design/mvp/canonical-abi/definitions.py index 3a90ec58..3d09ef21 100644 --- a/design/mvp/canonical-abi/definitions.py +++ b/design/mvp/canonical-abi/definitions.py @@ -183,6 +183,7 @@ def size_variant(cases): def size_flags(labels): n = len(labels) + if n == 0: return 0 if n <= 8: return 1 if n <= 16: return 2 return 4 * num_i32_flags(labels) diff --git a/design/mvp/canonical-abi/run_tests.py b/design/mvp/canonical-abi/run_tests.py index e6586375..965c0246 100644 --- a/design/mvp/canonical-abi/run_tests.py +++ b/design/mvp/canonical-abi/run_tests.py @@ -95,6 +95,8 @@ def test_name(): test(Unit(), [], {}) test(Record([Field('x',U8()), Field('y',U16()), Field('z',U32())]), [1,2,3], {'x':1,'y':2,'z':3}) test(Tuple([Tuple([U8(),U8()]),U8()]), [1,2,3], {'0':{'0':1,'1':2},'1':3}) +t = Flags([]) +test(t, [], {}) t = Flags(['a','b']) test(t, [0], {'a':False,'b':False}) test(t, [2], {'a':False,'b':True}) @@ -283,6 +285,12 @@ def test_heap(t, expect, args, byte_array): [1,0xff,5,0,6,0xff,7,0xff, 0,0xff,8,0xff,0xff,0xff,9,0xff]) test_heap(List(Union([U8()])), [{'0':6},{'0':7},{'0':8}], [0,3], [0,6, 0,7, 0,8]) +t = List(Flags([])) +test_heap(t, [{},{},{}], [0,3], + []) +t = List(Tuple([Flags([]), U8()])) +test_heap(t, [mk_tup({}, 42), mk_tup({}, 43), mk_tup({}, 44)], [0,3], + [42,43,44]) t = List(Flags(['a','b'])) test_heap(t, [{'a':False,'b':False},{'a':False,'b':True},{'a':True,'b':True}], [0,3], [0,2,3])