diff options
author | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2015-01-23 21:29:29 +0200 |
---|---|---|
committer | Petteri Aimonen <jpa@git.mail.kapsi.fi> | 2015-01-23 21:29:29 +0200 |
commit | d32d04ba1011806fe769f95dc2a88964f1102c6c (patch) | |
tree | 76eaed039e6dcf8502598c3b1d74a2c29ce4fb18 | |
parent | 0286a0746ad6f6d525400f720e30d9d13913a556 (diff) |
Fix encoded_size #defines for oneof messages.
The sizes are represented as EncodedSize() instances, which cause
max() operation to sort them by address instead of value. This caused
pretty much random item to be selected for the maximum.
Update issue 141
Status: FixedInGit
-rwxr-xr-x | generator/nanopb_generator.py | 12 | ||||
-rw-r--r-- | tests/regression/issue_141/SConscript | 8 | ||||
-rw-r--r-- | tests/regression/issue_141/testproto.expected | 7 | ||||
-rw-r--r-- | tests/regression/issue_141/testproto.proto | 50 |
4 files changed, 76 insertions, 1 deletions
diff --git a/generator/nanopb_generator.py b/generator/nanopb_generator.py index 0d7be492..9750b670 100755 --- a/generator/nanopb_generator.py +++ b/generator/nanopb_generator.py @@ -641,7 +641,17 @@ class OneOf(Field): return max([f.largest_field_value() for f in self.fields]) def encoded_size(self, allmsgs): - return max([f.encoded_size(allmsgs) for f in self.fields]) + largest = EncodedSize(0) + for f in self.fields: + size = f.encoded_size(allmsgs) + if size is None: + return None + elif size.symbols: + return None # Cannot resolve maximum of symbols + elif size.value > largest.value: + largest = size + + return largest # --------------------------------------------------------------------------- # Generation of messages (structures) diff --git a/tests/regression/issue_141/SConscript b/tests/regression/issue_141/SConscript new file mode 100644 index 00000000..b6526bed --- /dev/null +++ b/tests/regression/issue_141/SConscript @@ -0,0 +1,8 @@ +# Regression test for issue 141: wrong encoded size #define for oneof messages + +Import("env") + +env.NanopbProto("testproto") +env.Object('testproto.pb.c') +env.Match(['testproto.pb.h', 'testproto.expected']) + diff --git a/tests/regression/issue_141/testproto.expected b/tests/regression/issue_141/testproto.expected new file mode 100644 index 00000000..75bc195c --- /dev/null +++ b/tests/regression/issue_141/testproto.expected @@ -0,0 +1,7 @@ +define SubMessage_size \s* 88 +define OneOfMessage_size \s* 113 +define topMessage_size \s* 70 +define MyMessage1_size \s* 46 +define MyMessage2_size \s* 8 +define MyMessage3_size \s* 5 +define MyMessage4_size \s* 18 diff --git a/tests/regression/issue_141/testproto.proto b/tests/regression/issue_141/testproto.proto new file mode 100644 index 00000000..21598b45 --- /dev/null +++ b/tests/regression/issue_141/testproto.proto @@ -0,0 +1,50 @@ +import 'nanopb.proto'; + +message SubMessage +{ + repeated int32 array = 1 [(nanopb).max_count = 8]; +} + +message OneOfMessage +{ + required int32 prefix = 1; + oneof values + { + int32 first = 5; + string second = 6 [(nanopb).max_size = 8]; + SubMessage third = 7; + } + required int32 suffix = 99; +} + +message topMessage { + required int32 start = 1; + oneof msg { + MyMessage1 msg1 = 2; + MyMessage2 msg2 = 3; + } + required int32 end = 4; +} + +message MyMessage1 { + required uint32 n1 = 1; + required uint32 n2 = 2; + required string s = 3 [(nanopb).max_size = 32]; +} + +message MyMessage2 { + required uint32 num = 1; + required bool b = 2; +} + +message MyMessage3 { + required bool bbb = 1; + required string ss = 2 [(nanopb).max_size = 1]; +} + +message MyMessage4 { + required bool bbbb = 1; + required string sss = 2 [(nanopb).max_size = 2]; + required uint32 num = 3; + required uint32 num2 = 4; +} |