diff --git a/src/backends/packrat.c b/src/backends/packrat.c index 91e4a09224cb03c4eac23d1713dbbc70941d6618..1941f1c9d3d97e492dd4b8bb078f91f7fce75aed 100644 --- a/src/backends/packrat.c +++ b/src/backends/packrat.c @@ -294,6 +294,7 @@ HParseResult *h_packrat_parse(HAllocator* mm__, const HParser* parser, HInputStr parse_state->lr_stack = h_slist_new(arena); parse_state->recursion_heads = h_hashtable_new(arena, pos_equal, pos_hash); parse_state->arena = arena; + parse_state->symbol_table = NULL; HParseResult *res = h_do_parse(parser, parse_state); h_slist_free(parse_state->lr_stack); h_hashtable_free(parse_state->recursion_heads); diff --git a/src/backends/regex.c b/src/backends/regex.c index c10c25890fd5bfdf5e3e9b37a64e988fd3010749..f26abfda67af76900010053c6a6003fad1df55e7 100644 --- a/src/backends/regex.c +++ b/src/backends/regex.c @@ -7,6 +7,8 @@ #undef a_new #define a_new(typ, count) a_new_(arena, typ, count) +#undef a_new0 +#define a_new0(typ, count) a_new0_(arena, typ, count) // Stack VM typedef enum HSVMOp_ { SVM_PUSH, // Push a mark. There is no VM insn to push an object. @@ -67,13 +69,13 @@ void* h_rvm_run__m(HAllocator *mm__, HRVMProg *prog, const uint8_t* input, size_ goto end; HSArray *heads_n = heads_a, *heads_p = heads_b; - uint8_t *insn_seen = a_new(uint8_t, prog->length); // 0 -> not seen, 1->processed, 2->queued - HRVMThread *ip_queue = a_new(HRVMThread, prog->length); + uint8_t *insn_seen = a_new0(uint8_t, prog->length); // 0 -> not seen, 1->processed, 2->queued + HRVMThread *ip_queue = a_new0(HRVMThread, prog->length); size_t ipq_top; #define THREAD ip_queue[ipq_top-1] #define PUSH_SVM(op_, arg_) do { \ - HRVMTrace *nt = a_new(HRVMTrace, 1); \ + HRVMTrace *nt = a_new0(HRVMTrace, 1); \ nt->arg = (arg_); \ nt->opcode = (op_); \ nt->next = THREAD.trace; \ @@ -81,7 +83,7 @@ void* h_rvm_run__m(HAllocator *mm__, HRVMProg *prog, const uint8_t* input, size_ THREAD.trace = nt; \ } while(0) - ((HRVMTrace*)h_sarray_set(heads_n, 0, a_new(HRVMTrace, 1)))->opcode = SVM_NOP; // Initial thread + ((HRVMTrace*)h_sarray_set(heads_n, 0, a_new0(HRVMTrace, 1)))->opcode = SVM_NOP; // Initial thread size_t off = 0; int live_threads = 1; // May be redundant @@ -257,7 +259,7 @@ HParseResult *run_trace(HAllocator *mm__, HRVMProg *orig_prog, HRVMTrace *trace, if (!svm_stack_ensure_cap(mm__, ctx, 1)) { goto fail; } - tmp_res = a_new(HParsedToken, 1); + tmp_res = a_new0(HParsedToken, 1); tmp_res->token_type = TT_MARK; tmp_res->index = cur->input_pos; tmp_res->bit_offset = 0; @@ -288,7 +290,7 @@ HParseResult *run_trace(HAllocator *mm__, HRVMProg *orig_prog, HRVMTrace *trace, break; case SVM_ACCEPT: assert(ctx->stack_count <= 1); - HParseResult *res = a_new(HParseResult, 1); + HParseResult *res = a_new0(HParseResult, 1); if (ctx->stack_count == 1) { res->ast = ctx->stack[0]; } else { diff --git a/src/glue.c b/src/glue.c index 37962e849283951972ed60094345bec62b57434f..da2f3af329232fc16c690441e679deefe7ed76e5 100644 --- a/src/glue.c +++ b/src/glue.c @@ -69,6 +69,7 @@ HParsedToken *h_act_flatten(const HParseResult *p, void* user_data) { res->seq = seq; res->index = p->ast->index; res->bit_offset = p->ast->bit_offset; + res->bit_length = p->bit_length; return res; } diff --git a/src/parsers/bits.c b/src/parsers/bits.c index 288e3e95a45a7709e942d9987cda37c7e55819b5..2b977a27401610a071f0bac42b7404f828351eed 100644 --- a/src/parsers/bits.c +++ b/src/parsers/bits.c @@ -14,6 +14,9 @@ static HParseResult* parse_bits(void* env, HParseState *state) { result->sint = h_read_bits(&state->input_stream, env_->length, true); else result->uint = h_read_bits(&state->input_stream, env_->length, false); + result->index = 0; + result->bit_length = 0; + result->bit_offset = 0; return make_result(state->arena, result); } diff --git a/src/parsers/ch.c b/src/parsers/ch.c index 3da1091a4b71505aebdc6ed5b396084d12b1fde4..c878f9d08659a1cb6ae39f95b06c522c1a5a185f 100644 --- a/src/parsers/ch.c +++ b/src/parsers/ch.c @@ -8,6 +8,9 @@ static HParseResult* parse_ch(void* env, HParseState *state) { if (c == r) { HParsedToken *tok = a_new(HParsedToken, 1); tok->token_type = TT_UINT; tok->uint = r; + tok->index = 0; + tok->bit_length = 0; + tok->bit_offset = 0; return make_result(state->arena, tok); } else { return NULL; diff --git a/src/parsers/charset.c b/src/parsers/charset.c index a4b8c89c7daca326cf77ee9bf5c8ae4660884c56..01657386f68e9788e69635790df6efb600de4c94 100644 --- a/src/parsers/charset.c +++ b/src/parsers/charset.c @@ -10,6 +10,9 @@ static HParseResult* parse_charset(void *env, HParseState *state) { if (charset_isset(cs, in)) { HParsedToken *tok = a_new(HParsedToken, 1); tok->token_type = TT_UINT; tok->uint = in; + tok->index = 0; + tok->bit_length = 0; + tok->bit_offset = 0; return make_result(state->arena, tok); } else return NULL; diff --git a/src/parsers/end.c b/src/parsers/end.c index 85499d9348cd1df6503428a55d7a2ab878d1ef63..35e4186d430d8b48fe5cd1e41552403d6f95e562 100644 --- a/src/parsers/end.c +++ b/src/parsers/end.c @@ -4,6 +4,8 @@ static HParseResult* parse_end(void *env, HParseState *state) { if (state->input_stream.index == state->input_stream.length) { HParseResult *ret = a_new(HParseResult, 1); ret->ast = NULL; + ret->bit_length = 0; + ret->arena = state->arena; return ret; } else { return NULL; diff --git a/src/parsers/epsilon.c b/src/parsers/epsilon.c index bb6e8beb31cca3ff09a565171b4e554e07f2ffad..be614489cecfec6f30e4c2bfdd18c323be894446 100644 --- a/src/parsers/epsilon.c +++ b/src/parsers/epsilon.c @@ -5,6 +5,7 @@ static HParseResult* parse_epsilon(void* env, HParseState* state) { HParseResult* res = a_new(HParseResult, 1); res->ast = NULL; res->arena = state->arena; + res->bit_length = 0; return res; } diff --git a/src/parsers/ignore.c b/src/parsers/ignore.c index c56802ac0885fc11429925f353a516d622b88a9d..7eda13d23eecfc771eb82d40db90c81387be146f 100644 --- a/src/parsers/ignore.c +++ b/src/parsers/ignore.c @@ -8,6 +8,7 @@ static HParseResult* parse_ignore(void* env, HParseState* state) { HParseResult *res = a_new(HParseResult, 1); res->ast = NULL; res->arena = state->arena; + res->bit_length = 0; return res; } diff --git a/src/parsers/many.c b/src/parsers/many.c index 77b9dd8be220d92eac36b18ddbcd2fe263945448..655dd1497667f44b3de6694a0109c6f58804167d 100644 --- a/src/parsers/many.c +++ b/src/parsers/many.c @@ -37,6 +37,9 @@ static HParseResult *parse_many(void* env, HParseState *state) { HParsedToken *res = a_new(HParsedToken, 1); res->token_type = TT_SEQUENCE; res->seq = seq; + res->index = 0; + res->bit_length = 0; + res->bit_offset = 0; return make_result(state->arena, res); err0: if (count >= env_->count) { @@ -85,6 +88,7 @@ static HParsedToken *reshape_many(const HParseResult *p, void *user) res->seq = seq; res->index = p->ast->index; res->bit_offset = p->ast->bit_offset; + res->bit_length = p->bit_length; return res; } diff --git a/src/parsers/optional.c b/src/parsers/optional.c index 726606643056b103f9481cb882dadc19417dd607..6a2789e2d0a86a8c4e6b141825fd3abc075af5d0 100644 --- a/src/parsers/optional.c +++ b/src/parsers/optional.c @@ -9,6 +9,9 @@ static HParseResult* parse_optional(void* env, HParseState* state) { state->input_stream = bak; HParsedToken *ast = a_new(HParsedToken, 1); ast->token_type = TT_NONE; + ast->index = 0; + ast->bit_length = 0; + ast->bit_offset = 0; return make_result(state->arena, ast); } diff --git a/src/parsers/parser_internal.h b/src/parsers/parser_internal.h index 9a3b6de3898b42336a84bfe565448c27315e29bb..ebc5f4b32992d77cae4e6b512d17e3a39729e14f 100644 --- a/src/parsers/parser_internal.h +++ b/src/parsers/parser_internal.h @@ -10,12 +10,13 @@ #include "../backends/regex.h" #include "../backends/contextfree.h" -#define a_new_(arena, typ, count) ((typ*)h_arena_malloc((arena), sizeof(typ)*(count))) +#define a_new_(arena, typ, count) ((typ*)h_arena_malloc_noinit((arena), sizeof(typ)*(count))) #define a_new(typ, count) a_new_(state->arena, typ, count) -// we can create a_new0 if necessary. It would allocate some memory and immediately zero it out. +#define a_new0_(arena, typ, count) ((typ*)h_arena_malloc((arena), sizeof(typ)*(count))) +#define a_new0(typ, count) a_new0_(state->arena, typ, count) static inline HParseResult* make_result(HArena *arena, HParsedToken *tok) { - HParseResult *ret = h_arena_malloc(arena, sizeof(HParseResult)); + HParseResult *ret = h_arena_malloc_noinit(arena, sizeof(HParseResult)); ret->ast = tok; ret->arena = arena; ret->bit_length = 0; // This way it gets overridden in h_do_parse diff --git a/src/parsers/permutation.c b/src/parsers/permutation.c index ec256c4af1f76292847102d0a07eca5cb19e5bae..c40f99da2d52eea8dcbce93882d4aed7a0307360 100644 --- a/src/parsers/permutation.c +++ b/src/parsers/permutation.c @@ -89,6 +89,9 @@ static HParseResult *parse_permutation(void *env, HParseState *state) HParsedToken *tok = a_new(HParsedToken, 1); tok->token_type = TT_SEQUENCE; tok->seq = seq; + tok->index = 0; + tok->bit_length = 0; + tok->bit_offset = 0; return make_result(state->arena, tok); } else { // no parse diff --git a/src/parsers/seek.c b/src/parsers/seek.c index 027098b59424a2f78c9b54a0683e66111c02863f..d5bc02840f0145dc3089e82c11068359932b454c 100644 --- a/src/parsers/seek.c +++ b/src/parsers/seek.c @@ -49,6 +49,9 @@ static HParseResult *parse_seek(void *env, HParseState *state) HParsedToken *tok = a_new(HParsedToken, 1); tok->token_type = TT_UINT; tok->uint = pos; + tok->index = 0; + tok->bit_length = 0; + tok->bit_offset = 0; return make_result(state->arena, tok); } @@ -57,6 +60,9 @@ static HParseResult *parse_tell(void *env, HParseState *state) HParsedToken *tok = a_new(HParsedToken, 1); tok->token_type = TT_UINT; tok->uint = h_input_stream_pos(&state->input_stream); + tok->index = 0; + tok->bit_length = 0; + tok->bit_offset = 0; return make_result(state->arena, tok); } diff --git a/src/parsers/sequence.c b/src/parsers/sequence.c index 786ba62e43683f32ca0cc244bc0695cdb04a76fd..2e7b4bc7286ec0ac32af012126e4289226297be0 100644 --- a/src/parsers/sequence.c +++ b/src/parsers/sequence.c @@ -22,6 +22,9 @@ static HParseResult* parse_sequence(void *env, HParseState *state) { } HParsedToken *tok = a_new(HParsedToken, 1); tok->token_type = TT_SEQUENCE; tok->seq = seq; + tok->index = 0; + tok->bit_offset = 0; + tok->bit_length = 0; return make_result(state->arena, tok); } @@ -60,6 +63,7 @@ static HParsedToken *reshape_sequence(const HParseResult *p, void* user_data) { res->seq = seq; res->index = p->ast->index; res->bit_offset = p->ast->bit_offset; + res->bit_length = p->bit_length; return res; } diff --git a/src/parsers/token.c b/src/parsers/token.c index 19029726ad11a52fa0eadf62b67a7b15cd2e4744..b589d58c60e39bb895395a2eedb48984a0b8669f 100644 --- a/src/parsers/token.c +++ b/src/parsers/token.c @@ -16,6 +16,9 @@ static HParseResult* parse_token(void *env, HParseState *state) { } HParsedToken *tok = a_new(HParsedToken, 1); tok->token_type = TT_BYTES; tok->bytes.token = t->str; tok->bytes.len = t->len; + tok->index = 0; + tok->bit_offset = 0; + tok->bit_length = 0; return make_result(state->arena, tok); } diff --git a/src/t_parser.c b/src/t_parser.c index cb67901ed9227787d5580079112c410df000dd94..2d933ef1d3a025fd15fa8a1e247dc8ced3ba63ea 100644 --- a/src/t_parser.c +++ b/src/t_parser.c @@ -205,12 +205,12 @@ HParsedToken* upcase(const HParseResult *p, void* user_data) { switch(p->ast->token_type) { case TT_SEQUENCE: { - HParsedToken *ret = a_new_(p->arena, HParsedToken, 1); + HParsedToken *ret = a_new0_(p->arena, HParsedToken, 1); HCountedArray *seq = h_carray_new_sized(p->arena, p->ast->seq->used); ret->token_type = TT_SEQUENCE; for (size_t i=0; i<p->ast->seq->used; ++i) { if (TT_UINT == ((HParsedToken*)p->ast->seq->elements[i])->token_type) { - HParsedToken *tmp = a_new_(p->arena, HParsedToken, 1); + HParsedToken *tmp = a_new0_(p->arena, HParsedToken, 1); tmp->token_type = TT_UINT; tmp->uint = toupper(((HParsedToken*)p->ast->seq->elements[i])->uint); h_carray_append(seq, tmp); @@ -223,7 +223,7 @@ HParsedToken* upcase(const HParseResult *p, void* user_data) { } case TT_UINT: { - HParsedToken *ret = a_new_(p->arena, HParsedToken, 1); + HParsedToken *ret = a_new0_(p->arena, HParsedToken, 1); ret->token_type = TT_UINT; ret->uint = toupper(p->ast->uint); return ret; @@ -674,7 +674,7 @@ static void test_endianness(gconstpointer backend) { } HParsedToken* act_get(const HParseResult *p, void* user_data) { - HParsedToken *ret = a_new_(p->arena, HParsedToken, 1); + HParsedToken *ret = a_new0_(p->arena, HParsedToken, 1); ret->token_type = TT_UINT; ret->uint = 3 * (1 << p->ast->uint); return ret;