diff --git a/TODO b/TODO index b7f0e6a0f2a2471cc82340f8f5ec8034cf77749b..07bcd6632f3432381286eaa9f964386af4c957d7 100644 --- a/TODO +++ b/TODO @@ -1,10 +1,9 @@ Next (in order of descending priority/precedence): * Finish the test suite for the base functionality -* Improve debugging and error handling: - - Variables: dump variable identifiers in stead of storage indexes * Make sure cmusieve can be replaced seamlessly with the new plugin. * Final issues: + - FIXME hunting - Fix amd64 logging segfault - Fix/Report issues listed in 'doc/rfc/RFC Controversy.txt' diff --git a/src/lib-sieve/plugins/include/ext-include-binary.c b/src/lib-sieve/plugins/include/ext-include-binary.c index 34e759a52ceb41bfe348fc225f31a8b0738fc6b0..fc5525ef44d36ab882fc373cd3e73d7107ed587d 100644 --- a/src/lib-sieve/plugins/include/ext-include-binary.c +++ b/src/lib-sieve/plugins/include/ext-include-binary.c @@ -411,3 +411,16 @@ bool ext_include_binary_dump(struct sieve_dumptime_env *denv) return TRUE; } +bool ext_include_code_dump +(const struct sieve_dumptime_env *denv, sieve_size_t *address ATTR_UNUSED) +{ + struct sieve_binary *sbin = denv->sbin; + struct ext_include_binary_context *binctx = + ext_include_binary_get_context(sbin); + + sieve_ext_variables_dump_set_scope(denv, &include_extension, binctx->global_vars); + + return TRUE; +} + + diff --git a/src/lib-sieve/plugins/include/ext-include-binary.h b/src/lib-sieve/plugins/include/ext-include-binary.h index 7f5988ff08b72b02c04618e97422cfdd9e06a039..32c86c73ef95b18dee7009c83c961180b443a48a 100644 --- a/src/lib-sieve/plugins/include/ext-include-binary.h +++ b/src/lib-sieve/plugins/include/ext-include-binary.h @@ -56,6 +56,8 @@ unsigned int ext_include_binary_script_get_count */ bool ext_include_binary_dump(struct sieve_dumptime_env *denv); +bool ext_include_code_dump + (const struct sieve_dumptime_env *denv, sieve_size_t *address ATTR_UNUSED); #endif /* __EXT_INCLUDE_BINARY_H */ diff --git a/src/lib-sieve/plugins/include/ext-include.c b/src/lib-sieve/plugins/include/ext-include.c index 244c539f2eec2c41724e4e559edd90658a7766ee..58f3f63ad71f0fe413bdc341f981d28bfe4e456b 100644 --- a/src/lib-sieve/plugins/include/ext-include.c +++ b/src/lib-sieve/plugins/include/ext-include.c @@ -67,7 +67,7 @@ const struct sieve_extension include_extension = { ext_include_interpreter_load, ext_include_binary_load, ext_include_binary_dump, - NULL, + ext_include_code_dump, SIEVE_EXT_DEFINE_OPERATIONS(ext_include_operations), SIEVE_EXT_DEFINE_NO_OPERANDS }; diff --git a/src/lib-sieve/plugins/variables/ext-variables-dump.c b/src/lib-sieve/plugins/variables/ext-variables-dump.c index 8c5cf9427876c55a18d0e355aa564193336be0b3..b4845dab666ec2c63d4aaa79da3b9d8676641b09 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-dump.c +++ b/src/lib-sieve/plugins/variables/ext-variables-dump.c @@ -18,7 +18,28 @@ struct ext_variables_dump_context { struct sieve_variable_scope *main_scope; -}; + ARRAY_DEFINE(ext_scopes, struct sieve_variable_scope *); +}; + +static struct ext_variables_dump_context *ext_variables_dump_get_context + (const struct sieve_dumptime_env *denv) +{ + struct sieve_code_dumper *dumper = denv->cdumper; + struct ext_variables_dump_context *dctx = sieve_dump_extension_get_context + (dumper, &variables_extension); + pool_t pool; + + if ( dctx == NULL ) { + /* Create dumper context */ + pool = sieve_code_dumper_pool(dumper); + dctx = p_new(pool, struct ext_variables_dump_context, 1); + p_array_init(&dctx->ext_scopes, pool, sieve_extensions_get_count()); + + sieve_dump_extension_set_context(dumper, &variables_extension, dctx); + } + + return dctx; +} bool ext_variables_code_dump (const struct sieve_dumptime_env *denv, sieve_size_t *address) @@ -59,16 +80,25 @@ bool ext_variables_code_dump (void) sieve_variable_scope_declare(main_scope, str_c(identifier)); } - /* Create dumper context */ - dctx = p_new(sieve_code_dumper_pool(dumper), - struct ext_variables_dump_context, 1); + dctx = ext_variables_dump_get_context(denv); dctx->main_scope = main_scope; - sieve_dump_extension_set_context(dumper, &variables_extension, dctx); - return TRUE; } +/* + * Scope registry + */ + +void sieve_ext_variables_dump_set_scope +(const struct sieve_dumptime_env *denv, const struct sieve_extension *ext, + struct sieve_variable_scope *scope) +{ + struct ext_variables_dump_context *dctx = ext_variables_dump_get_context(denv); + + array_idx_set(&dctx->ext_scopes, (unsigned int) *ext->id, &scope); +} + /* * Variable identifier dump */ @@ -77,15 +107,27 @@ const char *ext_variables_dump_get_identifier (const struct sieve_dumptime_env *denv, const struct sieve_extension *ext, unsigned int index) { - struct sieve_code_dumper *dumper = denv->cdumper; - struct ext_variables_dump_context *dctx = sieve_dump_extension_get_context - (dumper, &variables_extension); + struct ext_variables_dump_context *dctx = ext_variables_dump_get_context(denv); + struct sieve_variable_scope *scope; struct sieve_variable *var; - if ( ext != NULL ) + if ( ext == NULL ) + scope = dctx->main_scope; + else { + struct sieve_variable_scope *const *ext_scope; + int ext_id = *ext->id; + + if ( ext_id < 0 || ext_id >= (int) array_count(&dctx->ext_scopes) ) + return NULL; + + ext_scope = array_idx(&dctx->ext_scopes, (unsigned int) ext_id); + scope = *ext_scope; + } + + if ( scope == NULL ) return NULL; - var = sieve_variable_scope_get_indexed(dctx->main_scope, index); + var = sieve_variable_scope_get_indexed(scope, index); return var->identifier; } diff --git a/src/lib-sieve/plugins/variables/sieve-ext-variables.h b/src/lib-sieve/plugins/variables/sieve-ext-variables.h index 7d6b067a53917824a95b4277085e5cc6c255f1c1..4fd7639b68801d0431d8481c1a4a2edc30a2418c 100644 --- a/src/lib-sieve/plugins/variables/sieve-ext-variables.h +++ b/src/lib-sieve/plugins/variables/sieve-ext-variables.h @@ -151,4 +151,12 @@ struct sieve_variables_modifier { void sieve_variables_modifier_register (struct sieve_validator *valdtr, const struct sieve_variables_modifier *smodf); +/* + * Code dumping + */ + +void sieve_ext_variables_dump_set_scope +(const struct sieve_dumptime_env *denv, const struct sieve_extension *ext, + struct sieve_variable_scope *scope); + #endif /* __SIEVE_EXT_VARIABLES_H */