[DTrace-devel] [PATCH] Simplification of the varint test

Kris Van Hees kris.van.hees at oracle.com
Mon Jun 14 06:29:48 PDT 2021


Thank you for the suggestion.  It makes sense - I wasn't going for the neatest
code especially since I wrote this little program during implementation of the
varint code - as a way to verify that the implementation was accurate), but I
do appreciate you spending time cleaning it up.

I am going to add one extra case to the check() function that was missing from
my version: dt_vint_skip().  It was missing because I implemented that function
later on when I found it would be convenient to have when implementing various
string operations.  It will simply verify:

	p = dt_vint_skip(s);
	if (!p || (p - s) != len) {
		printf("Skip wrong for %lu: %d vs %d\n",
		       val, p ? p - s : 0, exp);
		exit(1);
	}


On Sat, Jun 12, 2021 at 01:32:49AM -0400, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> Intended to be squashed back into
> "Implement variable length integer support".
> ---
>  test/internals/tst.varint.c | 122 ++++++++++++------------------------
>  1 file changed, 41 insertions(+), 81 deletions(-)
> 
> diff --git a/test/internals/tst.varint.c b/test/internals/tst.varint.c
> index 7011b488..bec6947f 100644
> --- a/test/internals/tst.varint.c
> +++ b/test/internals/tst.varint.c
> @@ -6,29 +6,26 @@
>  #include <dt_varint.h>
>  
>  void
> -check_length(uint64_t val, int len, int exp)
> +check(uint64_t val, int exp)
>  {
> -	if (len != exp) {
> -		printf("Length wrong for %lu: %d vs %d\n", val, len, exp);
> +	char s[VARINT_MAX_BYTES];
> +	int rc, len;
> +	uint64_t dval;
> +
> +	rc = dt_int2vint(val, s);
> +	if (rc != exp) {
> +		printf("Length wrong for %lu: %d vs %d\n", val, rc, exp);
>  		exit(1);
>  	}
> -}
> -
> -void
> -check_size(uint64_t val, int len, int exp)
> -{
> +	len = dt_vint_size(val);
>  	if (len != exp) {
>  		printf("Size wrong for %lu: %d vs %d\n", val, len, exp);
>  		exit(1);
>  	}
> -}
> -
> -void
> -check_value(uint64_t dval, uint64_t eval, int len)
> -{
> -	if (dval != eval) {
> +	dval = dt_vint2int(s);
> +	if (dval != val) {
>  		printf("Value decode error (%d byte prefix): %lx vs %lx\n",
> -		       len, dval, eval);
> +		       rc, dval, val);
>  		exit(1);
>  	}
>  }
> @@ -37,59 +34,37 @@ void
>  check_range(uint64_t lo, uint64_t hi, int len)
>  {
>  	uint64_t	val;
> -	char		s[VARINT_MAX_BYTES];
> -	int		rc;
> -
> -	for (val = lo - 10000; val < lo + 10000; val++) {
> -		rc = dt_int2vint(val, s);
> -		if (val < lo) {
> -			check_length(val, rc, len - 1);
> -			check_size(val, dt_vint_size(val), len - 1);
> -		} else {
> -			check_length(val, rc, len);
> -			check_size(val, dt_vint_size(val), len);
> -		}
>  
> -		check_value(dt_vint2int(s), val, rc);
> -	}
> -
> -	for (val = hi - 10000; val < hi + 10000; val++) {
> -		rc = dt_int2vint(val, s);
> -		if (val <= hi) {
> -			check_length(val, rc, len);
> -			check_size(val, dt_vint_size(val), len);
> -		} else {
> -			check_length(val, rc, len + 1);
> -			check_size(val, dt_vint_size(val), len + 1);
> -		}
> -
> -		check_value(dt_vint2int(s), val, rc);
> -	}
> +	/* taste test!  Here are two styles to choose from: */
> +#if 0
> +	for (val = lo - 10000; val < lo; val++)
> +		check(val, len-1);
> +	for (val = lo; val < lo + 10000; val++)
> +		check(val, len);
> +	for (val = hi - 10000; val <= hi; val++)
> +		check(val, len);
> +	for (val = hi + 1; val < hi + 10000; val++)
> +		check(val, len + 1);
> +#else
> +	for (val = lo - 10000; val < lo + 10000; val++)
> +		check(val, val < lo ? len-1 : len);
> +	for (val = hi - 10000; val < hi + 10000; val++)
> +		check(val, val <= hi ? len : len + 1);
> +#endif
>  }
>  
>  int
>  main(void)
>  {
>  	uint64_t	val;
> -	char		s[VARINT_MAX_BYTES];
> -	int		rc;
>  
>  	/* First range: we go through all 16-bit values. */
> -	for (val = 0; val < 0xffff; val++) {
> -		rc = dt_int2vint(val, s);
> -		if (val <= VARINT_1_MAX) {
> -			check_length(val, rc, 1);
> -			check_size(val, dt_vint_size(val), 1);
> -		} else if (val <= VARINT_2_MAX) {
> -			check_length(val, rc, 2);
> -			check_size(val, dt_vint_size(val), 2);
> -		} else {
> -			check_length(val, rc, 3);
> -			check_size(val, dt_vint_size(val), 3);
> -		}
> -
> -		check_value(dt_vint2int(s), val, rc);
> -	}
> +	for (val = 0; val <= VARINT_1_MAX; val++)
> +		check(val, 1);
> +	for (val = VARINT_1_MAX + 1; val <= VARINT_2_MAX; val++)
> +		check(val, 2);
> +	for (val = VARINT_2_MAX + 1; val < 0xffff; val++)
> +		check(val, 3);
>  
>  	/* For higher ranges, verify the low and high boundary ranges. */
>  	check_range(VARINT_3_MIN, VARINT_3_MAX, 3);
> @@ -100,31 +75,16 @@ main(void)
>  	check_range(VARINT_8_MIN, VARINT_8_MAX, 8);
>  
>  	/* Verify the final range. */
> -	for (val = VARINT_9_MIN - 10000; val < VARINT_9_MIN + 10000; val++) {
> -		rc = dt_int2vint(val, s);
> -		if (val < VARINT_9_MIN) {
> -			check_length(val, rc, 8);
> -			check_size(val, dt_vint_size(val), 8);
> -		} else {
> -			check_length(val, rc, 9);
> -			check_size(val, dt_vint_size(val), 9);
> -		}
> -
> -		check_value(dt_vint2int(s), val, rc);
> -	}
> -
> +	for (val = VARINT_9_MIN - 10000; val < VARINT_9_MIN; val++)
> +		check(val, 8);
> +	for (val = VARINT_9_MIN; val < VARINT_9_MIN + 10000; val++)
> +		check(val, 9);
>  	for (val = VARINT_9_MAX - 10000; val < VARINT_9_MAX; val++) {
> -		rc = dt_int2vint(val, s);
> -		check_length(val, rc, 9);
> -		check_size(val, dt_vint_size(val), 9);
> -
> -		check_value(dt_vint2int(s), val, rc);
> +		check(val, 9);
>  	}
> +	check(VARINT_9_MAX, 9);
>  
> -	rc = dt_int2vint(VARINT_9_MAX, s);
> -	check_length(VARINT_9_MAX, rc, 9);
> -	check_size(VARINT_9_MAX, dt_vint_size(VARINT_9_MAX), 9);
> -	check_value(dt_vint2int(s), VARINT_9_MAX, rc);
> +	return 0;
>  }
>  
>  #include "dt_varint.c"
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list