dovecot-2.0-pigeonhole: Improved runtime trace debugging output ...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Sat Jul 17 13:12:04 EEST 2010


details:   http://hg.rename-it.nl/dovecot-2.0-pigeonhole/rev/fdec4e5304e2
changeset: 1336:fdec4e5304e2
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sat Jul 17 12:11:58 2010 +0200
description:
Improved runtime trace debugging output for core Sieve language.

diffstat:

 TODO                                |   2 -
 src/lib-sieve/cmd-discard.c         |   2 +-
 src/lib-sieve/cmd-keep.c            |   3 +-
 src/lib-sieve/cmd-redirect.c        |   3 +-
 src/lib-sieve/cmd-stop.c            |   2 +-
 src/lib-sieve/ext-envelope.c        |   3 +
 src/lib-sieve/ext-fileinto.c        |   2 +-
 src/lib-sieve/ext-reject.c          |   4 +-
 src/lib-sieve/sieve-address-parts.c |   5 ++
 src/lib-sieve/sieve-code.c          |   6 +--
 src/lib-sieve/sieve-interpreter.c   |  19 ++++++++-
 src/lib-sieve/sieve-match.c         |  45 ++++++++++++----------
 src/lib-sieve/sieve-match.h         |   2 +-
 src/lib-sieve/sieve-runtime-trace.c |  11 +++--
 src/lib-sieve/tst-address.c         |   3 +
 src/lib-sieve/tst-exists.c          |  11 ++++-
 src/lib-sieve/tst-header.c          |   6 +++
 src/sieve-tools/sieve-test.c        |   4 +-
 18 files changed, 86 insertions(+), 47 deletions(-)

diffs (truncated from 427 to 300 lines):

diff -r 50dc4c2ae28f -r fdec4e5304e2 TODO
--- a/TODO	Fri Jul 16 21:31:46 2010 +0200
+++ b/TODO	Sat Jul 17 12:11:58 2010 +0200
@@ -2,8 +2,6 @@
 
 * Improve debugging support in the sieve-test tool:
 	- Improve trace debugging towards something more intuitively readable.
-	- Give trace debugging multiple levels of verbosity (e.g. to include more 
-    messy output like value matching).
 
 Next (in order of descending priority/precedence):
 
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/cmd-discard.c
--- a/src/lib-sieve/cmd-discard.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/cmd-discard.c	Sat Jul 17 12:11:58 2010 +0200
@@ -110,7 +110,7 @@
 	/* Source line */
 	source_line = sieve_runtime_get_command_location(renv);
 
-	sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, "discard action");
+	sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, "discard action; cancel implicit keep");
 
 	return ( sieve_result_add_action
 		(renv, NULL, &act_discard, NULL, source_line, NULL, 0) >= 0 );
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/cmd-keep.c
--- a/src/lib-sieve/cmd-keep.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/cmd-keep.c	Sat Jul 17 12:11:58 2010 +0200
@@ -102,7 +102,8 @@
 	 * Perform operation
 	 */
 
-	sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, "keep action");
+	sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, 
+		"keep action; store message in default mailbox");
 	
 	/* Add keep action to result. 
 	 */
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/cmd-redirect.c
--- a/src/lib-sieve/cmd-redirect.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/cmd-redirect.c	Sat Jul 17 12:11:58 2010 +0200
@@ -219,7 +219,8 @@
 	/* FIXME: perform address normalization if the string is not a string literal
 	 */
 
-	sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, "redirect action (\"%s\")",
+	sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, 
+		"redirect action; forward message to address `%s'",
 		str_sanitize(str_c(redirect), 64));
 	
 	/* Add redirect action to the result */
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/cmd-stop.c
--- a/src/lib-sieve/cmd-stop.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/cmd-stop.c	Sat Jul 17 12:11:58 2010 +0200
@@ -77,7 +77,7 @@
 static int opc_stop_execute
 (const struct sieve_runtime_env *renv,  sieve_size_t *address ATTR_UNUSED)
 {	
-	sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "STOP");
+	sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "stop");
 	
 	sieve_interpreter_interrupt(renv->interp);
 
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/ext-envelope.c
--- a/src/lib-sieve/ext-envelope.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/ext-envelope.c	Sat Jul 17 12:11:58 2010 +0200
@@ -458,6 +458,9 @@
 		(result=sieve_coded_stringlist_next_item(envp_list, &envp_item)) 
 		&& envp_item != NULL ) {
 		const struct sieve_envelope_part *epart;
+
+		sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
+            "  matching envelope part `%s'", str_sanitize(str_c(envp_item), 80));
 			
 		if ( (epart=_envelope_part_find(str_c(envp_item))) != NULL ) {
 			const struct sieve_address * const *addresses = NULL;
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/ext-fileinto.c
--- a/src/lib-sieve/ext-fileinto.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/ext-fileinto.c	Sat Jul 17 12:11:58 2010 +0200
@@ -179,7 +179,7 @@
 
 	mailbox = str_sanitize(str_c(folder), 64);
 	sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS, 
-		"fileinto action (\"%s\")", mailbox);
+		"fileinto action; store message in mailbox `%s'", mailbox);
 		
 	/* Add action to result */	
 	ret = sieve_act_store_add_to_result
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/ext-reject.c
--- a/src/lib-sieve/ext-reject.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/ext-reject.c	Sat Jul 17 12:11:58 2010 +0200
@@ -292,10 +292,10 @@
 
 	if ( sieve_operation_is(oprtn, ereject_operation) )
 		sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
-			"ereject action (\"%s\")", str_sanitize(str_c(reason), 64));
+			"ereject action; reject message with reason `%s'", str_sanitize(str_c(reason), 64));
 	else
 		sieve_runtime_trace(renv, SIEVE_TRLVL_ACTIONS,
-			"reject action (\"%s\")", str_sanitize(str_c(reason), 64));
+			"reject action; reject message with reason `%s'", str_sanitize(str_c(reason), 64));
 
 	/* Add reject action to the result */
 	pool = sieve_result_pool(renv->result);
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-address-parts.c
--- a/src/lib-sieve/sieve-address-parts.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-address-parts.c	Sat Jul 17 12:11:58 2010 +0200
@@ -7,6 +7,7 @@
 #include "hash.h"
 #include "array.h"
 #include "message-address.h"
+#include "str-sanitize.h"
 
 #include "sieve-extensions.h"
 #include "sieve-code.h"
@@ -234,9 +235,13 @@
 (const struct sieve_address_part *addrp, struct sieve_match_context *mctx, 		
 	const char *data)
 {
+	const struct sieve_runtime_env *renv = mctx->runenv;
 	int result = FALSE;
 	const struct message_address *addr;
 
+	sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
+            "  matching addresses `%s'", str_sanitize(data, 80));
+
 	T_BEGIN {
 		bool valid = TRUE;
 		const struct message_address *aitem;
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-code.c
--- a/src/lib-sieve/sieve-code.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-code.c	Sat Jul 17 12:11:58 2010 +0200
@@ -1058,8 +1058,7 @@
 {	
 	bool result = sieve_interpreter_get_test_result(renv->interp);
 	
-	sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "jump if true (%s)", 
-		result ? "true" : "false");
+	sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "jump if result is true");
 	
 	return sieve_interpreter_program_jump(renv->interp, result);
 }
@@ -1069,8 +1068,7 @@
 {	
 	bool result = sieve_interpreter_get_test_result(renv->interp);
 	
-	sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "jump if false (%s)",
-		result ? "true" : "false" );
+	sieve_runtime_trace(renv, SIEVE_TRLVL_COMMANDS, "jump if result is false");
 	
 	return sieve_interpreter_program_jump(renv->interp, !result);
 }	
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-interpreter.c
--- a/src/lib-sieve/sieve-interpreter.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-interpreter.c	Sat Jul 17 12:11:58 2010 +0200
@@ -425,10 +425,23 @@
 		jmp_start + jmp_offset > 0 ) 
 	{	
 		if ( jump ) {
-			sieve_runtime_trace_here(renv, SIEVE_TRLVL_COMMANDS, "jump to #%08llx", 
-				(long long unsigned int) jmp_start + jmp_offset);
+			sieve_size_t jmp_addr = jmp_start + jmp_offset;
 
-			*address = jmp_start + jmp_offset;
+			if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) {
+				unsigned int jmp_line = 
+					sieve_runtime_get_source_location(renv, jmp_addr);
+
+				if ( (renv->trace_config.flags & SIEVE_TRFLG_ADDRESSES) > 0 ) {
+					sieve_runtime_trace(renv, 0, "jumping to line %d [%08llx]", 
+						jmp_line, (long long unsigned int) jmp_addr);
+				} else {
+					sieve_runtime_trace(renv, 0, "jumping to line %d", jmp_line);
+				}
+			}
+
+			*address = jmp_addr;
+		} else {
+			sieve_runtime_trace(renv, 0, "not jumping");	
 		}
 		
 		return SIEVE_EXEC_OK;
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-match.c
--- a/src/lib-sieve/sieve-match.c	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-match.c	Sat Jul 17 12:11:58 2010 +0200
@@ -61,20 +61,25 @@
 	const struct sieve_runtime_env *renv = mctx->runenv;
 	const struct sieve_match_type *mcht = mctx->match_type;
 	sieve_coded_stringlist_reset(mctx->key_list);
+	bool trace = sieve_runtime_trace_active(renv, SIEVE_TRLVL_MATCHING);
 	bool ok = TRUE;
+	int ret = 0;
 
 	/* Reject unimplemented match-type */
-	if ( mcht->def == NULL || mcht->def->match == NULL )
+	if ( mcht->def == NULL || mcht->def->match == NULL ) {
+		mctx->status = FALSE;
 		return FALSE;
+	}
 
-	sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
-		"  matching value `%s'", str_sanitize(value, 80));
+	if ( trace ) {
+		sieve_runtime_trace(renv, 0,
+			"  matching value `%s'", str_sanitize(value, 80));
+	}
 
 	/* Match to all key values */
 	if ( mcht->def->is_iterative ) {
 		unsigned int key_index = 0;
 		string_t *key_item = NULL;
-		int ret = 0;
 	
 		while ( (ok=sieve_coded_stringlist_next_item(mctx->key_list, &key_item)) 
 			&& key_item != NULL ) {				
@@ -91,8 +96,10 @@
 							ret = mcht->def->match
 								(mctx, value, val_size, key, key_size, key_index);
 						
-							sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
-								"    with key `%s' => %d", str_sanitize(key, 80), ret);
+							if ( trace ) {
+								sieve_runtime_trace(renv, 0,
+									"    with key `%s' => %d", str_sanitize(key, 80), ret);
+							}
 
 							if ( ret != 0 ) break;
 						}
@@ -101,8 +108,10 @@
 					ret = mcht->def->match(mctx, value, val_size, str_c(key_item), 
 							str_len(key_item), key_index);
 
-					sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
-						"    with key `%s' => %d", str_sanitize(str_c(key_item), 80), ret);
+					if ( trace ) {
+						sieve_runtime_trace(renv, 0,
+							"    with key `%s' => %d", str_sanitize(str_c(key_item), 80), ret);
+					}
 				}
 			} T_END;
 			
@@ -112,31 +121,23 @@
 			key_index++;
 		}
 
-		if ( !ok ) 
-			return -1;
-
-		if ( ret < 0 ) 
-			return ret;
-		if ( ret > 0 )
-			return TRUE;
+		if ( !ok ) ret = -1;
 
 	} else {
-		int ret;
-
 		T_BEGIN {
 			ret = mcht->def->match(mctx, value, val_size, NULL, 0, -1);
 		} T_END;
-
-		return ret;
 	}
 
-	return FALSE;
+	mctx->status = ret;
+	return ret;
 }
 
 int sieve_match_end(struct sieve_match_context **mctx)
 {
 	const struct sieve_runtime_env *renv = (*mctx)->runenv;
 	const struct sieve_match_type *mcht = (*mctx)->match_type;
+	int status = (*mctx)->status;
 	int ret = FALSE;
 
 	if ( mcht->def != NULL && mcht->def->match_deinit != NULL ) {
@@ -146,9 +147,11 @@
 	pool_unref(&(*mctx)->pool);
 	*mctx = NULL;
 
+	if ( ret < 0 ) status = ret;
+
 	sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING,
 		"  finishing match with result: %s", 
-		( ret > 0 ? "true" : ( ret < 0 ? "error" : "false" ) ));
+		( status > 0 ? "true" : ( status < 0 ? "error" : "false" ) ));
 
 	return ret;
 }
diff -r 50dc4c2ae28f -r fdec4e5304e2 src/lib-sieve/sieve-match.h
--- a/src/lib-sieve/sieve-match.h	Fri Jul 16 21:31:46 2010 +0200
+++ b/src/lib-sieve/sieve-match.h	Sat Jul 17 12:11:58 2010 +0200
@@ -25,7 +25,7 @@
 
 	struct sieve_coded_stringlist *key_list;
 
-
+	int status;
 	void *data;
 };


More information about the dovecot-cvs mailing list