summaryrefslogtreecommitdiff
path: root/epan/dfilter/dfilter.c
diff options
context:
space:
mode:
authorBill Meier <wmeier@newsguy.com>2007-11-28 22:44:37 +0000
committerBill Meier <wmeier@newsguy.com>2007-11-28 22:44:37 +0000
commitb436aeaf5fa8d5f01d543b8a6a907acba1a93dbe (patch)
tree72eccb5e720a50bf710bd65108457e0c92b07900 /epan/dfilter/dfilter.c
parent6d4dda3327edbaefb333eeee0d957ae031a31fae (diff)
downloadwireshark-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.c34
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;