diff options
author | Bill Meier <wmeier@newsguy.com> | 2007-11-28 22:44:37 +0000 |
---|---|---|
committer | Bill Meier <wmeier@newsguy.com> | 2007-11-28 22:44:37 +0000 |
commit | b436aeaf5fa8d5f01d543b8a6a907acba1a93dbe (patch) | |
tree | 72eccb5e720a50bf710bd65108457e0c92b07900 /epan/dfilter/dfilter.c | |
parent | 6d4dda3327edbaefb333eeee0d957ae031a31fae (diff) | |
download | wireshark-b436aeaf5fa8d5f01d543b8a6a907acba1a93dbe.tar.gz |
From Didier Gautheron: Bug #2042: Move constants initialisation at compile time.
svn path=/trunk/; revision=23659
Diffstat (limited to 'epan/dfilter/dfilter.c')
-rw-r--r-- | epan/dfilter/dfilter.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c index d6cf5679a0..c6d0a2b3d7 100644 --- a/epan/dfilter/dfilter.c +++ b/epan/dfilter/dfilter.c @@ -137,13 +137,28 @@ free_insns(GPtrArray *insns) void dfilter_free(dfilter_t *df) { + int i; + + if (!df) + return; + if (df->insns) { free_insns(df->insns); } + if (df->consts) { + free_insns(df->consts); + } if (df->interesting_fields) { g_free(df->interesting_fields); } + + /* clear registers */ + for (i = 0; i < df->max_registers; i++) { + if (df->registers[i]) { + g_list_free(df->registers[i]); + } + } g_free(df->registers); g_free(df->attempted_load); @@ -161,10 +176,12 @@ dfwork_new(void) dfw->st_root = NULL; dfw->syntax_error = FALSE; dfw->insns = NULL; + dfw->consts = NULL; dfw->loaded_fields = NULL; dfw->interesting_fields = NULL; dfw->next_insn_id = 0; dfw->next_register = 0; + dfw->first_constant = -1; return dfw; } @@ -187,11 +204,14 @@ dfwork_free(dfwork_t *dfw) if (dfw->insns) { free_insns(dfw->insns); } + + if (dfw->consts) { + free_insns(dfw->consts); + } g_free(dfw); } - gboolean dfilter_compile(const gchar *text, dfilter_t **dfp) { @@ -279,14 +299,20 @@ dfilter_compile(const gchar *text, dfilter_t **dfp) /* Tuck away the bytecode in the dfilter_t */ dfilter = dfilter_new(); dfilter->insns = dfw->insns; + dfilter->consts = dfw->consts; dfw->insns = NULL; + dfw->consts = NULL; dfilter->interesting_fields = dfw_interesting_fields(dfw, &dfilter->num_interesting_fields); /* Initialize run-time space */ - dfilter->num_registers = dfw->next_register; - dfilter->registers = g_new0(GList*, dfilter->num_registers); - dfilter->attempted_load = g_new0(gboolean, dfilter->num_registers); + dfilter->num_registers = dfw->first_constant; + dfilter->max_registers = dfw->next_register; + dfilter->registers = g_new0(GList*, dfilter->max_registers); + dfilter->attempted_load = g_new0(gboolean, dfilter->max_registers); + + /* Initialize constants */ + dfvm_init_const(dfilter); /* And give it to the user. */ *dfp = dfilter; |