diff --git a/src/parsers/bind.c b/src/parsers/bind.c index 808df9742bc6e7a1bb6c93a838f9f69903d036e0..87f42330ee8a5a35ef5a026f1060e5937bdc2d16 100644 --- a/src/parsers/bind.c +++ b/src/parsers/bind.c @@ -46,7 +46,11 @@ static HParseResult *parse_bind(void *be_, HParseState *state) { return NULL; } - return h_do_parse(kx, state); + HParseResult *res2 = h_do_parse(kx, state); + if(res2) + res2->bit_length = 0; // recalculate + + return res2; } static const HParserVtable bind_vt = { diff --git a/src/parsers/ignoreseq.c b/src/parsers/ignoreseq.c index 07bdc65c16b7eb1fb6b868999482fdb23dffa700..af74bccd08d901cc5862b105e7251d491e64f2a0 100644 --- a/src/parsers/ignoreseq.c +++ b/src/parsers/ignoreseq.c @@ -24,8 +24,10 @@ static HParseResult* parse_ignoreseq(void* env, HParseState *state) { HParseResult *tmp = h_do_parse(seq->parsers[i], state); if (!tmp) return NULL; - else if (i == seq->which) + else if (i == seq->which) { res = tmp; + res->bit_length = 0; // recalculate + } } return res; diff --git a/src/t_regression.c b/src/t_regression.c index aa78f2c8c02ad218db7e89f0543c06ebdc3e7f25..3dfe5dce12d0d9c9306ede01d5daf3a45ebab488 100644 --- a/src/t_regression.c +++ b/src/t_regression.c @@ -118,6 +118,26 @@ static void test_llk_zero_end(void) { g_check_parse_failed(aze, be, "a", 1); } +HParser *k_test_wrong_bit_length(HAllocator *mm__, const HParsedToken *tok, void *env) +{ + return h_ch__m(mm__, 'b'); +} + +static void test_wrong_bit_length(void) { + HParseResult *r; + HParser *p; + + p = h_right(h_ch('a'), h_ch('b')); + r = h_parse(p, (const uint8_t *)"ab", 2); + g_check_cmp_int64(r->bit_length, ==, 16); + h_parse_result_free(r); + + p = h_bind(h_ch('a'), k_test_wrong_bit_length, NULL); + r = h_parse(p, (const uint8_t *)"ab", 2); + g_check_cmp_int64(r->bit_length, ==, 16); + h_parse_result_free(r); +} + static void test_lalr_charset_lhs(void) { HParserBackend be = PB_LALR; @@ -178,6 +198,7 @@ void register_regression_tests(void) { g_test_add_func("/core/regression/seq_index_path", test_seq_index_path); g_test_add_func("/core/regression/read_bits_48", test_read_bits_48); g_test_add_func("/core/regression/llk_zero_end", test_llk_zero_end); + g_test_add_func("/core/regression/wrong_bit_length", test_wrong_bit_length); g_test_add_func("/core/regression/lalr_charset_lhs", test_lalr_charset_lhs); g_test_add_func("/core/regression/cfg_many_seq", test_cfg_many_seq); g_test_add_func("/core/regression/charset_bits", test_charset_bits);