public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v6 0/8] gdb: split array and string limiting options
@ 2022-08-17 22:03 Maciej W. Rozycki
  2022-08-17 22:03 ` [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean Maciej W. Rozycki
                   ` (14 more replies)
  0 siblings, 15 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:03 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

Hi,

 Here is v6 of the series to split array and string limiting options.

 I believe I have addressed one way or another all the issues Andrew has 
raised in the review.  In the course I have discovered more issues that I 
concluded need to be addressed in preparation, so the series has gone back 
to 8 patches even though some of the 8 patches from v5 have been approved 
and committed.

 I have regression-tested the changes, with a native `x86_64-linux-gnu' 
configuration.  I have also visually examined the result of the updated 
changes to the GDB manual in the info and PDF formats.

 See individual change descriptions for details, including updates made.

 OK to apply?

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
@ 2022-08-17 22:03 ` Maciej W. Rozycki
  2022-10-17 13:43   ` Simon Marchi
  2022-10-21 18:44   ` Simon Marchi
  2022-08-17 22:03 ` [PATCH v6 2/8] GDB/doc: Document the Guile `#:unlimited' keyword Maciej W. Rozycki
                   ` (13 subsequent siblings)
  14 siblings, 2 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:03 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

Do not assert that a value intended for an integer parameter, of either 
the PARAM_UINTEGER or the PARAM_ZUINTEGER_UNLIMITED type, is boolean,
causing error messages such as:

ERROR: In procedure make-parameter:
ERROR: In procedure gdbscm_make_parameter: Wrong type argument in position 15 (expecting integer or #:unlimited): 3
Error while executing Scheme code.

when initialization with a number is attempted.  Instead assert that it 
is integer.  Keep matching `#:unlimited' keyword as an alternative.  Add 
suitable test cases.
---
Hi,

 Probably obvious, and shows how much use this code gets.

  Maciej

New change in v6.
---
 gdb/guile/scm-param.c                     |    2 
 gdb/testsuite/gdb.guile/scm-parameter.exp |  176 ++++++++++++++++++++++++++++++
 2 files changed, 177 insertions(+), 1 deletion(-)

gdb-guile-scm-param-is-integer.diff
Index: src/gdb/guile/scm-param.c
===================================================================
--- src.orig/gdb/guile/scm-param.c
+++ src/gdb/guile/scm-param.c
@@ -742,7 +742,7 @@ pascm_set_param_value_x (param_smob *p_s
       if (var.type () == var_uinteger
 	  || var.type () == var_zuinteger_unlimited)
 	{
-	  SCM_ASSERT_TYPE (gdbscm_is_bool (value)
+	  SCM_ASSERT_TYPE (scm_is_integer (value)
 			   || scm_is_eq (value, unlimited_keyword),
 			   value, arg_pos, func_name,
 			   _("integer or #:unlimited"));
Index: src/gdb/testsuite/gdb.guile/scm-parameter.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.guile/scm-parameter.exp
+++ src/gdb/testsuite/gdb.guile/scm-parameter.exp
@@ -29,6 +29,14 @@ if { [skip_guile_tests] } { continue }
 gdb_install_guile_utils
 gdb_install_guile_module
 
+proc scm_param_test_maybe_no_output { command pattern args } {
+    if [string length $pattern] {
+	gdb_test $command $pattern $args
+    } else {
+	gdb_test_no_output $command $args
+    }
+}
+
 # We use "." here instead of ":" so that this works on win32 too.
 set escaped_directory [string_to_regexp "$srcdir/$subdir"]
 gdb_test "guile (print (parameter-value \"directories\"))" "$escaped_directory.\\\$cdir.\\\$cwd"
@@ -91,6 +99,172 @@ with_test_prefix "test-enum-param" {
     gdb_test "set print test-enum-param three" "Undefined item: \"three\".*" "set invalid enum parameter" 
 }
 
+# Test integer parameters.
+
+foreach_with_prefix param {
+    "listsize"
+    "print elements"
+    "max-completions"
+} {
+    set param_range_error "integer -1 out of range"
+    set param_type_error \
+	"#<gdb:exception out-of-range\
+	 \\(\"gdbscm_parameter_value\"\
+	    \"Out of range: program error: unhandled type in position 1: ~S\"\
+	    \\(3\\) \\(3\\)\\)>"
+    switch -- $param {
+	"listsize" {
+	    set param_get_one $param_type_error
+	    set param_get_zero $param_type_error
+	    set param_get_minus_one $param_type_error
+	    set param_get_unlimited $param_type_error
+	    set param_set_minus_one ""
+	}
+	"print elements" {
+	    set param_get_one 1
+	    set param_get_zero "#:unlimited"
+	    set param_get_minus_one "#:unlimited"
+	    set param_get_unlimited "#:unlimited"
+	    set param_set_minus_one $param_range_error
+	}
+	"max-completions" {
+	    set param_get_one 1
+	    set param_get_zero 0
+	    set param_get_minus_one "#:unlimited"
+	    set param_get_unlimited "#:unlimited"
+	    set param_set_minus_one ""
+	}
+	default {
+	    error "invalid param: $param"
+	}
+    }
+
+    gdb_test_no_output "set $param 1" "test set to 1"
+
+    gdb_test "guile (print (parameter-value \"$param\"))" \
+	$param_get_one "test value of 1"
+
+    gdb_test_no_output "set $param 0" "test set to 0"
+
+    gdb_test "guile (print (parameter-value \"$param\"))" \
+	$param_get_zero "test value of 0"
+
+    scm_param_test_maybe_no_output "set $param -1" \
+	$param_set_minus_one "test set to -1"
+
+    gdb_test "guile (print (parameter-value \"$param\"))" \
+	$param_get_minus_one "test value of -1"
+
+    gdb_test_no_output "set $param unlimited" "test set to 'unlimited'"
+
+    gdb_test "guile (print (parameter-value \"$param\"))" \
+	$param_get_unlimited "test value of 'unlimited'"
+}
+
+foreach_with_prefix kind {
+    PARAM_UINTEGER
+    PARAM_ZINTEGER
+    PARAM_ZUINTEGER
+    PARAM_ZUINTEGER_UNLIMITED
+} {
+    gdb_test_multiline "create gdb parameter" \
+	"guile" "" \
+	"(define test-$kind-param" "" \
+	"  (make-parameter \"print test-$kind-param\"" "" \
+	"   #:command-class COMMAND_DATA" "" \
+	"   #:parameter-type $kind" "" \
+	"   #:doc \"Set to a number or 'unlimited' to yield an effect.\"" "" \
+	"   #:show-doc \"Show the state of $kind.\"" "" \
+	"   #:set-doc \"Set the state of $kind.\"" "" \
+	"   #:show-func (lambda (self value)" "" \
+	"      (format #f \"The state of $kind is ~a.\" value))" "" \
+	"   #:initial-value 3))" "" \
+	"(register-parameter! test-$kind-param)" "" \
+	"end"
+
+    set param_integer_error \
+	"ERROR: In procedure set-parameter-value!:\r\nERROR: In procedure\
+	 gdbscm_set_parameter_value_x: Wrong type argument in position 2\
+	 \\(expecting integer\\): #:unlimited\r\nError while executing Scheme\
+	 code\\."
+    set param_minus_one_error "integer -1 out of range"
+    set param_minus_two_range "integer -2 out of range"
+    set param_minus_two_unlimited "only -1 is allowed to set as unlimited"
+    switch -- $kind {
+	PARAM_UINTEGER {
+	    set param_get_zero "#:unlimited"
+	    set param_get_minus_one "#:unlimited"
+	    set param_get_minus_two "#:unlimited"
+	    set param_str_unlimited unlimited
+	    set param_set_unlimited ""
+	    set param_set_minus_one $param_minus_one_error
+	    set param_set_minus_two $param_minus_two_range
+	}
+	PARAM_ZINTEGER {
+	    set param_get_zero 0
+	    set param_get_minus_one -1
+	    set param_get_minus_two -2
+	    set param_str_unlimited 2
+	    set param_set_unlimited $param_integer_error
+	    set param_set_minus_one ""
+	    set param_set_minus_two ""
+	}
+	PARAM_ZUINTEGER {
+	    set param_get_zero 0
+	    set param_get_minus_one 0
+	    set param_get_minus_two 0
+	    set param_str_unlimited 2
+	    set param_set_unlimited $param_integer_error
+	    set param_set_minus_one $param_minus_one_error
+	    set param_set_minus_two $param_minus_two_range
+	}
+	PARAM_ZUINTEGER_UNLIMITED {
+	    set param_get_zero 0
+	    set param_get_minus_one "#:unlimited"
+	    set param_get_minus_two "#:unlimited"
+	    set param_str_unlimited unlimited
+	    set param_set_unlimited ""
+	    set param_set_minus_one ""
+	    set param_set_minus_two $param_minus_two_unlimited
+	}
+	default {
+	    error "invalid kind: $kind"
+	}
+    }
+
+    with_test_prefix "test-$kind-param" {
+	gdb_test "guile (print (parameter-value test-$kind-param))" \
+	    3 "$kind parameter value (3)"
+	gdb_test "show print test-$kind-param" \
+	    "The state of $kind is 3." "show initial value"
+	gdb_test_no_output "set print test-$kind-param 2"
+	gdb_test "show print test-$kind-param" \
+	    "The state of $kind is 2." "show new value"
+	gdb_test "guile (print (parameter-value test-$kind-param))" \
+	    2 "$kind parameter value (2)"
+	scm_param_test_maybe_no_output \
+	    "guile (set-parameter-value! test-$kind-param #:unlimited)" \
+	    $param_set_unlimited
+	gdb_test "show print test-$kind-param" \
+	    "The state of $kind is $param_str_unlimited." \
+	    "show unlimited value"
+	gdb_test_no_output "guile (set-parameter-value! test-$kind-param 1)"
+	gdb_test "guile (print (parameter-value test-$kind-param))" \
+	    1 "$kind parameter value (1)"
+	gdb_test_no_output "guile (set-parameter-value! test-$kind-param 0)"
+	gdb_test "guile (print (parameter-value test-$kind-param))" \
+	    $param_get_zero "$kind parameter value (0)"
+	scm_param_test_maybe_no_output "set print test-$kind-param -1" \
+	    $param_set_minus_one
+	gdb_test "guile (print (parameter-value test-$kind-param))" \
+	    $param_get_minus_one "$kind parameter value (-1)"
+	scm_param_test_maybe_no_output "set print test-$kind-param -2" \
+	    $param_set_minus_two
+	gdb_test "guile (print (parameter-value test-$kind-param))" \
+	    $param_get_minus_two "$kind parameter value (-2)"
+    }
+}
+
 # Test a file parameter.
 
 gdb_test_multiline "file gdb parameter" \
@@ -206,3 +380,5 @@ with_test_prefix "previously-ambiguous"
     gdb_test "help set print s" "This command is not documented." "set help"
     gdb_test "help set print" "set print s -- This command is not documented.*" "general help"
 }
+
+rename scm_param_test_maybe_no_output ""

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6 2/8] GDB/doc: Document the Guile `#:unlimited' keyword
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
  2022-08-17 22:03 ` [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean Maciej W. Rozycki
@ 2022-08-17 22:03 ` Maciej W. Rozycki
  2022-08-18  6:06   ` Eli Zaretskii
  2022-08-17 22:04 ` [PATCH v6 3/8] GDB/testsuite: Expand Python integer parameter coverage across all types Maciej W. Rozycki
                   ` (12 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:03 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

Document the Guile `#:unlimited' keyword and deprecate the internal 
integer representation it corresponds to for integer parameters.
---
New change in v6.
---
 gdb/doc/guile.texi |   12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

gdb-doc-guile-param-xinteger.diff
Index: src/gdb/doc/guile.texi
===================================================================
--- src.orig/gdb/doc/guile.texi
+++ src/gdb/doc/guile.texi
@@ -2135,8 +2135,9 @@ Guile, true and false are represented us
 @samp{auto} is represented using @code{#:auto}.
 
 @item PARAM_UINTEGER
-The value is an unsigned integer.  The value of 0 should be
-interpreted to mean ``unlimited''.
+The value is an unsigned integer.  The value of @code{#:unlimited}
+should be interpreted to mean ``unlimited'', and the value of @samp{0}
+is reserved and should not be used.
 
 @item PARAM_ZINTEGER
 The value is an integer.
@@ -2145,9 +2146,10 @@ The value is an integer.
 The value is an unsigned integer.
 
 @item PARAM_ZUINTEGER_UNLIMITED
-The value is an integer in the range @samp{[0, INT_MAX]}.
-A value of @samp{-1} means ``unlimited'', and other negative
-numbers are not allowed.
+The value is an integer in the range @samp{[0, INT_MAX]}.  The value
+of @code{#:unlimited} means ``unlimited'', the value of @samp{-1} is
+reserved and should not be used, and other negative numbers are not
+allowed.
 
 @item PARAM_STRING
 The value is a string.  When the user modifies the string, any escape

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6 3/8] GDB/testsuite: Expand Python integer parameter coverage across all types
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
  2022-08-17 22:03 ` [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean Maciej W. Rozycki
  2022-08-17 22:03 ` [PATCH v6 2/8] GDB/doc: Document the Guile `#:unlimited' keyword Maciej W. Rozycki
@ 2022-08-17 22:04 ` Maciej W. Rozycki
  2022-10-17 13:56   ` Simon Marchi
  2022-08-17 22:04 ` [PATCH v6 4/8] GDB/Python: Make `None' stand for `unlimited' in setting integer parameters Maciej W. Rozycki
                   ` (11 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:04 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

Also verify PARAM_UINTEGER, PARAM_INTEGER, and PARAM_ZINTEGER parameter 
types, in addition to PARAM_ZUINTEGER and PARAM_ZUINTEGER_UNLIMITED 
already covered, and verify a choice of existing GDB parameters.  Add 
verification for reading parameters via `<parameter>.value' in addition 
to `gdb.parameter('<parameter>')' as this covers different code paths.
---
New change in v6.
---
 gdb/testsuite/gdb.python/py-parameter.exp |  197 +++++++++++++++++++++++++++---
 1 file changed, 181 insertions(+), 16 deletions(-)

gdb-test-python-var-integer.diff
Index: src/gdb/testsuite/gdb.python/py-parameter.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.python/py-parameter.exp
+++ src/gdb/testsuite/gdb.python/py-parameter.exp
@@ -24,6 +24,14 @@ clean_restart
 # Skip all tests if Python scripting is not enabled.
 if { [skip_python_tests] } { continue }
 
+proc py_param_test_maybe_no_output { command pattern args } {
+    if [string length $pattern] {
+	gdb_test $command $pattern $args
+    } else {
+	gdb_test_no_output $command $args
+    }
+}
+
 proc_with_prefix test_directories { } {
     # We use "." here instead of ":" so that this works on win32 too.
     if { [is_remote host] } {
@@ -325,8 +333,80 @@ proc_with_prefix test_deprecated_api_par
 	"test general help"
 }
 
+proc_with_prefix test_gdb_parameter { } {
+    foreach_with_prefix param {
+	"listsize"
+	"print elements"
+	"max-completions"
+    } {
+	clean_restart
+
+	set param_range_error ".*gdb.error: integer -1 out of range.*"
+	switch -- $param {
+	    "listsize" {
+		set param_get_zero None
+		set param_get_minus_one -1
+		set param_get_unlimited None
+		set param_set_minus_one ""
+	    }
+	    "print elements" {
+		set param_get_zero None
+		set param_get_minus_one None
+		set param_get_unlimited None
+		set param_set_minus_one $param_range_error
+	    }
+	    "max-completions" {
+		set param_get_zero 0
+		set param_get_minus_one -1
+		set param_get_unlimited -1
+		set param_set_minus_one ""
+	    }
+	    default {
+		error "invalid param: $param"
+	    }
+	}
+
+	gdb_test_no_output "python gdb.set_parameter('$param', 1)" \
+	    "test set to 1"
+
+	gdb_test "python print(gdb.parameter('$param'))" \
+	    1 "test value of 1"
+
+	gdb_test_no_output "python gdb.set_parameter('$param', 0)" \
+	    "test set to 0"
+
+	gdb_test "python print(gdb.parameter('$param'))" \
+	    $param_get_zero "test value of 0"
+
+	py_param_test_maybe_no_output \
+	    "python gdb.set_parameter('$param', -1)" \
+	    $param_set_minus_one "test set to -1"
+
+	gdb_test "python print(gdb.parameter('$param'))" \
+	    $param_get_minus_one "test value of -1"
+
+	gdb_test_no_output "python gdb.set_parameter('$param', 'unlimited')" \
+	    "test set to 'unlimited'"
+
+	gdb_test "python print(gdb.parameter('$param'))" \
+	    $param_get_unlimited "test value of 'unlimited'"
+    }
+
+    clean_restart
+
+    # This caused a gdb crash.
+    gdb_test "python print(gdb.parameter('endian'))" "auto" \
+	"print endian parameter"
+}
+
 proc_with_prefix test_integer_parameter { } {
-    foreach_with_prefix kind {PARAM_ZUINTEGER PARAM_ZUINTEGER_UNLIMITED} {
+    foreach_with_prefix kind {
+	PARAM_UINTEGER
+	PARAM_INTEGER
+	PARAM_ZINTEGER
+	PARAM_ZUINTEGER
+	PARAM_ZUINTEGER_UNLIMITED
+    } {
 	clean_restart
 
 	gdb_test_multiline "create parameter" \
@@ -338,20 +418,106 @@ proc_with_prefix test_integer_parameter
 	    "test_param_$kind = TestNodocParam ('test-$kind')" "" \
 	    "end"
 
-	gdb_test "python print(gdb.parameter('test-$kind'))" "0"
+	set param_range_error "RuntimeError: Range exceeded.*"
+	set param_integer_error "RuntimeError: The value must be integer.*"
+	switch -- $kind {
+	    PARAM_UINTEGER {
+		set param_get_zero None
+		set param_get_minus_one None
+		set param_get_minus_five 1
+		set param_get_none 5
+		set param_set_minus_one $param_range_error
+		set param_set_minus_five $param_range_error
+		set param_set_none $param_integer_error
+	    }
+	    PARAM_INTEGER {
+		set param_get_zero None
+		set param_get_minus_one -1
+		set param_get_minus_five -5
+		set param_get_none 5
+		set param_set_minus_one -1
+		set param_set_minus_five -5
+		set param_set_none $param_integer_error
+	    }
+	    PARAM_ZINTEGER {
+		set param_get_zero 0
+		set param_get_minus_one -1
+		set param_get_minus_five -5
+		set param_get_none 5
+		set param_set_minus_one ""
+		set param_set_minus_five ""
+		set param_set_none $param_integer_error
+	    }
+	    PARAM_ZUINTEGER {
+		set param_get_zero 0
+		set param_get_minus_one 0
+		set param_get_minus_five 1
+		set param_get_none 5
+		set param_set_minus_one $param_range_error
+		set param_set_minus_five $param_range_error
+		set param_set_none $param_integer_error
+	    }
+	    PARAM_ZUINTEGER_UNLIMITED {
+		set param_get_zero 0
+		set param_get_minus_one -1
+		set param_get_minus_five 1
+		set param_get_none 5
+		set param_set_minus_one ""
+		set param_set_minus_five $param_range_error
+		set param_set_none $param_integer_error
+	    }
+	    default {
+		error "invalid kind: $kind"
+	    }
+	}
 
-	gdb_test "python test_param_$kind.value = -5" "RuntimeError: Range exceeded.*"
+	gdb_test "python print(test_param_$kind.value)" \
+	    $param_get_zero "test default value"
 
-	if {$kind == "PARAM_ZUINTEGER"} {
-	    gdb_test "python test_param_$kind.value = -1" "RuntimeError: Range exceeded.*"
-	} elseif {$kind == "PARAM_ZUINTEGER_UNLIMITED"} {
-	    gdb_test_no_output "python test_param_$kind.value = -1" \
-		"check that PARAM_ZUINTEGER_UNLIMITED value can be set to -1"
-	    gdb_test "python print(gdb.parameter('test-$kind'))" "-1" \
-		"check that PARAM_ZUINTEGER_UNLIMITED value is -1 after setting"
-	} else {
-	    error "invalid kind: $kind"
-	}
+	gdb_test "python print(gdb.parameter('test-$kind'))" \
+	    $param_get_zero "test default value via gdb.parameter"
+
+	py_param_test_maybe_no_output "python test_param_$kind.value = -1" \
+	    $param_set_minus_one "test set to -1"
+
+	gdb_test "python print(test_param_$kind.value)" \
+	    $param_get_minus_one "test value of -1"
+
+	gdb_test "python print(gdb.parameter('test-$kind'))" \
+	    $param_get_minus_one "test value of -1 via gdb.parameter"
+
+	gdb_test_no_output "python test_param_$kind.value = 1" "test set to 1"
+
+	gdb_test "python print(test_param_$kind.value)" 1 "test value of 1"
+
+	gdb_test "python print(gdb.parameter('test-$kind'))" \
+	    1 "test value of 1 via gdb.parameter"
+
+	py_param_test_maybe_no_output "python test_param_$kind.value = -5" \
+	    $param_set_minus_five "test set to -5"
+
+	gdb_test "python print(gdb.parameter('test-$kind'))" \
+	    $param_get_minus_five "test value of -5 via gdb.parameter"
+
+	gdb_test_no_output "python test_param_$kind.value = 5" "test set to 5"
+
+	gdb_test "python print(gdb.parameter('test-$kind'))" \
+	    5 "test value of 5 via gdb.parameter"
+
+	py_param_test_maybe_no_output "python test_param_$kind.value = None" \
+	    $param_set_none "test set to None"
+
+	gdb_test "python print(test_param_$kind.value)" \
+	    $param_get_none "test value of None"
+
+	gdb_test "python print(gdb.parameter('test-$kind'))" \
+	    $param_get_none "test value of None via gdb.parameter"
+
+	gdb_test_no_output "python test_param_$kind.value = 0" \
+	    "test set to 0"
+
+	gdb_test "python print(gdb.parameter('test-$kind'))" \
+	    $param_get_zero "test value of 0 via gdb.parameter"
     }
 }
 
@@ -395,10 +561,9 @@ test_file_parameter
 test_undocumented_parameter
 test_really_undocumented_parameter
 test_deprecated_api_parameter
+test_gdb_parameter
 test_integer_parameter
 test_throwing_parameter
 test_language
 
-# This caused a gdb crash.
-gdb_test "python print(gdb.parameter('endian'))" "auto" \
-    "print endian parameter"
+rename py_param_test_maybe_no_output ""

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6 4/8] GDB/Python: Make `None' stand for `unlimited' in setting integer parameters
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (2 preceding siblings ...)
  2022-08-17 22:04 ` [PATCH v6 3/8] GDB/testsuite: Expand Python integer parameter coverage across all types Maciej W. Rozycki
@ 2022-08-17 22:04 ` Maciej W. Rozycki
  2022-10-17 14:26   ` Simon Marchi
  2022-08-17 22:04 ` [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited' Maciej W. Rozycki
                   ` (10 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:04 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

Similarly to booleans and following the fix for PR python/29217 make 
`gdb.parameter' accept `None' for `unlimited' with parameters of the 
PARAM_UINTEGER, PARAM_INTEGER, and PARAM_ZUINTEGER_UNLIMITED types, as 
`None' is already returned by parameters of the two former types, so 
one might expect to be able to feed it back.  It also makes it possible 
to avoid the need to know what the internal integer representation is 
for the special setting of `unlimited'.

Expand the testsuite accordingly.
---
New change in v6.
---
 gdb/python/lib/gdb/__init__.py            |    9 ++++++---
 gdb/python/py-param.c                     |   10 +++++++---
 gdb/testsuite/gdb.python/py-parameter.exp |   21 +++++++++++++++------
 3 files changed, 28 insertions(+), 12 deletions(-)

gdb-python-set-var-xinteger-none.diff
Index: src/gdb/python/lib/gdb/__init__.py
===================================================================
--- src.orig/gdb/python/lib/gdb/__init__.py
+++ src/gdb/python/lib/gdb/__init__.py
@@ -240,9 +240,12 @@ Return the name of the shared library ho
 
 def set_parameter(name, value):
     """Set the GDB parameter NAME to VALUE."""
-    # Handle the specific case of booleans here, because gdb.parameter
-    # can return them, but they can't be passed to 'set' this way.
-    if isinstance(value, bool):
+    # Handle the specific cases of None and booleans here, because
+    # gdb.parameter can return them, but they can't be passed to 'set'
+    # this way.
+    if value is None:
+        value = "unlimited"
+    elif isinstance(value, bool):
         if value:
             value = "on"
         else:
Index: src/gdb/python/py-param.c
===================================================================
--- src.orig/gdb/python/py-param.c
+++ src/gdb/python/py-param.c
@@ -243,14 +243,18 @@ set_parameter_value (parmpy_object *self
 	long l;
 	int ok;
 
-	if (!PyLong_Check (value))
+	if (value == Py_None
+	    && (self->type == var_uinteger || self->type == var_integer))
+	  l = 0;
+	else if (value == Py_None && self->type == var_zuinteger_unlimited)
+	  l = -1;
+	else if (!PyLong_Check (value))
 	  {
 	    PyErr_SetString (PyExc_RuntimeError,
 			     _("The value must be integer."));
 	    return -1;
 	  }
-
-	if (! gdb_py_int_as_long (value, &l))
+	else if (! gdb_py_int_as_long (value, &l))
 	  return -1;
 
 	switch (self->type)
Index: src/gdb/testsuite/gdb.python/py-parameter.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.python/py-parameter.exp
+++ src/gdb/testsuite/gdb.python/py-parameter.exp
@@ -346,18 +346,21 @@ proc_with_prefix test_gdb_parameter { }
 	    "listsize" {
 		set param_get_zero None
 		set param_get_minus_one -1
+		set param_get_none None
 		set param_get_unlimited None
 		set param_set_minus_one ""
 	    }
 	    "print elements" {
 		set param_get_zero None
 		set param_get_minus_one None
+		set param_get_none None
 		set param_get_unlimited None
 		set param_set_minus_one $param_range_error
 	    }
 	    "max-completions" {
 		set param_get_zero 0
 		set param_get_minus_one -1
+		set param_get_none -1
 		set param_get_unlimited -1
 		set param_set_minus_one ""
 	    }
@@ -385,6 +388,12 @@ proc_with_prefix test_gdb_parameter { }
 	gdb_test "python print(gdb.parameter('$param'))" \
 	    $param_get_minus_one "test value of -1"
 
+	gdb_test_no_output "python gdb.set_parameter('$param', None)" \
+	    "test set to None"
+
+	gdb_test "python print(gdb.parameter('$param'))" \
+	    $param_get_none "test value of None"
+
 	gdb_test_no_output "python gdb.set_parameter('$param', 'unlimited')" \
 	    "test set to 'unlimited'"
 
@@ -425,19 +434,19 @@ proc_with_prefix test_integer_parameter
 		set param_get_zero None
 		set param_get_minus_one None
 		set param_get_minus_five 1
-		set param_get_none 5
+		set param_get_none None
 		set param_set_minus_one $param_range_error
 		set param_set_minus_five $param_range_error
-		set param_set_none $param_integer_error
+		set param_set_none ""
 	    }
 	    PARAM_INTEGER {
 		set param_get_zero None
 		set param_get_minus_one -1
 		set param_get_minus_five -5
-		set param_get_none 5
+		set param_get_none None
 		set param_set_minus_one -1
 		set param_set_minus_five -5
-		set param_set_none $param_integer_error
+		set param_set_none ""
 	    }
 	    PARAM_ZINTEGER {
 		set param_get_zero 0
@@ -461,10 +470,10 @@ proc_with_prefix test_integer_parameter
 		set param_get_zero 0
 		set param_get_minus_one -1
 		set param_get_minus_five 1
-		set param_get_none 5
+		set param_get_none -1
 		set param_set_minus_one ""
 		set param_set_minus_five $param_range_error
-		set param_set_none $param_integer_error
+		set param_set_none ""
 	    }
 	    default {
 		error "invalid kind: $kind"

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (3 preceding siblings ...)
  2022-08-17 22:04 ` [PATCH v6 4/8] GDB/Python: Make `None' stand for `unlimited' in setting integer parameters Maciej W. Rozycki
@ 2022-08-17 22:04 ` Maciej W. Rozycki
  2022-08-18  6:08   ` Eli Zaretskii
                     ` (2 more replies)
  2022-08-17 22:04 ` [PATCH v6 6/8] GDB: Allow arbitrary keywords in integer set commands Maciej W. Rozycki
                   ` (9 subsequent siblings)
  14 siblings, 3 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:04 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

Consistently with parameters of the PARAM_UINTEGER and PARAM_INTEGER 
types return the special value of `None' for a PARAM_ZUINTEGER_UNLIMITED 
parameter set to `unlimited', fixing an inconsistency introduced with 
commit 0489430a0e1a ("Handle var_zuinteger and var_zuinteger_unlimited 
from Python"); cf. PR python/20084.  Adjust the testsuite accordingly.

This makes all the three parameter types consistent with each other as 
far as the use of `None' is concerned, and similar to the Guile/Scheme 
interface where the `#:unlimited' keyword is likewise used.  We have a 
precedent already documented for a similar API correction:

 -- Function: gdb.breakpoints ()
     Return a sequence holding all of GDB's breakpoints.  *Note
     Breakpoints In Python::, for more information.  In GDB version 7.11
     and earlier, this function returned 'None' if there were no
     breakpoints.  This peculiarity was subsequently fixed, and now
     'gdb.breakpoints' returns an empty sequence in this case.

made in the past.

And then we have documentation not matching the interface as far as the 
value of `None' already returned for parameters of the PARAM_UINTEGER 
and PARAM_INTEGER types is concerned, and the case of an incorrect 
assertion for PARAM_UINTEGER and PARAM_ZUINTEGER_UNLIMITED parameters in 
the sibling Guile/Scheme module making such parameters unusable that has 
never been reported, both indicating that these features may indeed not 
be heavily used, and therefore that the risk from such an API change is 
likely lower than the long-term burden of the inconsistency.

And where the value read from a parameter is only used for presentation 
purposes, then such a change is expected to be transparent.
---
Changes from v5:

- Refer to Python parameter types in the change description rather than
  underlying GDB variable types in preparation for breaking the tight 
  coupling between the two later in this series.

- Document existing and updated semantics in the GDB manual.

- Update the testsuite adjustment to fit in the now expanded test case.

- Add a NEWS entry.

No change from v4.

New change in v4.
---
 gdb/NEWS                                  |    7 +++++++
 gdb/doc/python.texi                       |   30 +++++++++++++++++++-----------
 gdb/python/python.c                       |   10 +++++++++-
 gdb/testsuite/gdb.python/py-parameter.exp |   16 +++++-----------
 4 files changed, 40 insertions(+), 23 deletions(-)

Index: src/gdb/NEWS
===================================================================
--- src.orig/gdb/NEWS
+++ src/gdb/NEWS
@@ -175,6 +175,13 @@ GNU/Linux/LoongArch (gdbserver)	loongarc
      gdb.BreakpointLocation objects specifying the locations where the
      breakpoint is inserted into the debuggee.
 
+  ** Parameters of gdb.PARAM_ZUINTEGER_UNLIMITED type now return the
+     value of None for the 'unlimited' setting, consistently with
+     parameters of gdb.PARAM_UINTEGER and gdb.PARAM_INTEGER types.
+     Parameters of all the three types now accept the value of None
+     to mean 'unlimited'.  The use of internal integer representation
+     for the 'unlimited' setting is now deprecated.
+
 * New features in the GDB remote stub, GDBserver
 
   ** GDBserver is now supported on LoongArch GNU/Linux.
Index: src/gdb/doc/python.texi
===================================================================
--- src.orig/gdb/doc/python.texi
+++ src/gdb/doc/python.texi
@@ -4598,14 +4598,16 @@ Python, true and false are represented u
 @findex PARAM_UINTEGER
 @findex gdb.PARAM_UINTEGER
 @item gdb.PARAM_UINTEGER
-The value is an unsigned integer.  The value of 0 should be
-interpreted to mean ``unlimited''.
+The value is an unsigned integer.  The value of @code{None} should be
+interpreted to mean ``unlimited'', and the value of 0 is reserved and
+should not be used.
 
 @findex PARAM_INTEGER
 @findex gdb.PARAM_INTEGER
 @item gdb.PARAM_INTEGER
-The value is a signed integer.  The value of 0 should be interpreted
-to mean ``unlimited''.
+The value is a signed integer.  The value of @code{None} should be
+interpreted to mean ``unlimited'', and the value of 0 is reserved and
+should not be used.
 
 @findex PARAM_STRING
 @findex gdb.PARAM_STRING
@@ -4635,21 +4637,27 @@ The value is a filename.  This is just l
 @findex PARAM_ZINTEGER
 @findex gdb.PARAM_ZINTEGER
 @item gdb.PARAM_ZINTEGER
-The value is an integer.  This is like @code{PARAM_INTEGER}, except 0
-is interpreted as itself.
+The value is a signed integer.  This is like @code{PARAM_INTEGER},
+except that 0 is allowed and the value of @code{None} is not supported.
 
 @findex PARAM_ZUINTEGER
 @findex gdb.PARAM_ZUINTEGER
 @item gdb.PARAM_ZUINTEGER
-The value is an unsigned integer.  This is like @code{PARAM_INTEGER},
-except 0 is interpreted as itself, and the value cannot be negative.
+The value is an unsigned integer.  This is like @code{PARAM_UINTEGER},
+except that 0 is allowed and the value of @code{None} is not supported.
 
 @findex PARAM_ZUINTEGER_UNLIMITED
 @findex gdb.PARAM_ZUINTEGER_UNLIMITED
 @item gdb.PARAM_ZUINTEGER_UNLIMITED
-The value is a signed integer.  This is like @code{PARAM_ZUINTEGER},
-except the special value -1 should be interpreted to mean
-``unlimited''.  Other negative values are not allowed.
+The value is a signed integer.  This is like @code{PARAM_INTEGER}
+including that the value of @code{None} should be interpreted to mean
+``unlimited'', except that 0 is allowed, and the value cannot be negative.
+
+In GDB version 12 and earlier, a parameter of this type when read would
+return -1 rather than @code{None} for the setting of ``unlimited''.
+This peculiarity was subsequently fixed, for consistency with parameters
+of @code{PARAM_UINTEGER} and @code{PARAM_INTEGER} types, so that all the
+three types return the value of @code{None} for ``unlimited''.
 
 @findex PARAM_ENUM
 @findex gdb.PARAM_ENUM
Index: src/gdb/python/python.c
===================================================================
--- src.orig/gdb/python/python.c
+++ src/gdb/python/python.c
@@ -509,9 +509,17 @@ gdbpy_parameter_value (const setting &va
 	Py_RETURN_NONE;
       /* Fall through.  */
     case var_zinteger:
-    case var_zuinteger_unlimited:
       return gdb_py_object_from_longest (var.get<int> ()).release ();
 
+    case var_zuinteger_unlimited:
+      {
+	int val = var.get<int> ();
+
+	if (val == -1)
+	  Py_RETURN_NONE;
+	return gdb_py_object_from_longest (val).release ();
+      }
+
     case var_uinteger:
       {
 	unsigned int val = var.get<unsigned int> ();
Index: src/gdb/testsuite/gdb.python/py-parameter.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.python/py-parameter.exp
+++ src/gdb/testsuite/gdb.python/py-parameter.exp
@@ -346,22 +346,16 @@ proc_with_prefix test_gdb_parameter { }
 	    "listsize" {
 		set param_get_zero None
 		set param_get_minus_one -1
-		set param_get_none None
-		set param_get_unlimited None
 		set param_set_minus_one ""
 	    }
 	    "print elements" {
 		set param_get_zero None
 		set param_get_minus_one None
-		set param_get_none None
-		set param_get_unlimited None
 		set param_set_minus_one $param_range_error
 	    }
 	    "max-completions" {
 		set param_get_zero 0
-		set param_get_minus_one -1
-		set param_get_none -1
-		set param_get_unlimited -1
+		set param_get_minus_one None
 		set param_set_minus_one ""
 	    }
 	    default {
@@ -392,13 +386,13 @@ proc_with_prefix test_gdb_parameter { }
 	    "test set to None"
 
 	gdb_test "python print(gdb.parameter('$param'))" \
-	    $param_get_none "test value of None"
+	    None "test value of None"
 
 	gdb_test_no_output "python gdb.set_parameter('$param', 'unlimited')" \
 	    "test set to 'unlimited'"
 
 	gdb_test "python print(gdb.parameter('$param'))" \
-	    $param_get_unlimited "test value of 'unlimited'"
+	    None "test value of 'unlimited'"
     }
 
     clean_restart
@@ -468,9 +462,9 @@ proc_with_prefix test_integer_parameter
 	    }
 	    PARAM_ZUINTEGER_UNLIMITED {
 		set param_get_zero 0
-		set param_get_minus_one -1
+		set param_get_minus_one None
 		set param_get_minus_five 1
-		set param_get_none -1
+		set param_get_none None
 		set param_set_minus_one ""
 		set param_set_minus_five $param_range_error
 		set param_set_none ""

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6 6/8] GDB: Allow arbitrary keywords in integer set commands
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (4 preceding siblings ...)
  2022-08-17 22:04 ` [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited' Maciej W. Rozycki
@ 2022-08-17 22:04 ` Maciej W. Rozycki
  2022-08-17 22:05 ` [PATCH v6 7/8] GDB: Add a character string limiting option Maciej W. Rozycki
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:04 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

Rather than just `unlimited' allow the integer set commands (or command 
options) to define arbitrary keywords for the user to use, removing 
hardcoded arrangements for the `unlimited' keyword.

Remove the confusingly named `var_zinteger', `var_zuinteger' and 
`var_zuinteger_unlimited' `set'/`show' command variable types redefining 
them in terms of `var_uinteger', `var_integer' and `var_pinteger', which 
have the range of [0;UINT_MAX], [INT_MIN;INT_MAX], and [0;INT_MAX] each.

Following existing practice `var_pinteger' allows extra negative values 
to be used, however unlike `var_zuinteger_unlimited' any number of such 
values can be defined rather than just `-1'.

The "p" in `var_pinteger' stands for "positive", for the lack of a more 
appropriate unambiguous letter, even though 0 obviously is not positive; 
"n" would be confusing as to whether it stands for "non-negative" or 
"negative".

Add a new structure, `literal_def', the entries of which define extra 
keywords allowed for a command and numerical values they correspond to.  
Those values are not verified against the basic range supported by the 
underlying variable type, allowing extra values to be allowed outside 
that range, which may or may not be individually made visible to the 
user.  An optional value translation is possible with the structure to 
follow the existing practice for some commands where user-entered 0 is 
internally translated to UINT_MAX or INT_MAX.  Such translation can now 
be arbitrary.  Literals defined by this structure are automatically used 
for completion as necessary.

So for example:

const literal_def integer_unlimited_literals[] =
  {
    { "unlimited", INT_MAX, 0 },
    { nullptr }
  };

defines an extra `unlimited' keyword and a user-visible 0 value, both of 
which get translated to INT_MAX for the setting to be used with.

Similarly:

const literal_def zuinteger_unlimited_literals[] =
  {
    { "unlimited", -1, -1 },
    { nullptr }
  };

defines the same keyword and a corresponding user-visible -1 value that 
is used for the requested setting.  If the last member were omitted (or 
set to `{}') here, then only the keyword would be allowed for the user 
to enter and while -1 would still be used internally trying to enter it 
as a part of a command would result in an "integer -1 out of range" 
error.

Use said error message in all cases (citing the invalid value requested) 
replacing "only -1 is allowed to set as unlimited" previously used for 
`var_zuinteger_unlimited' settings only rather than propagating it to 
`var_pinteger' type.  It could only be used for the specific case where 
a single extra `unlimited' keyword was defined standing for -1 and the 
use of numeric equivalents is discouraged anyway as it is for historical 
reasons only that they expose GDB internals, confusingly different 
across variable types.  Similarly update the "must be >= -1" Guile error 
message.

Redefine Guile and Python parameter types in terms of the new variable 
types and interpret extra keywords as Scheme keywords and Python strings 
used to communicate corresponding parameter values.  Do not add a new
PARAM_INTEGER Guile parameter type, however do handle the `var_integer' 
variable type now, permitting existing parameters defined by GDB proper, 
such as `listsize', to be accessed from Scheme code.

With these changes in place it should be trivial for a Scheme or Python 
programmer to expand the syntax of the `make-parameter' command and the 
`gdb.Parameter' class initializer to have arbitrary extra literals along 
with their internal representation supplied.

Update the testsuite accordingly.
---
Changes from v5:

- Add a translation layer from Guile and Python parameter types to new
  GDB variable types and remove `var_zuinteger', `var_uinteger', and 
  `var_zuinteger_unlimited' variable types altogether now.

- Add an optional `extra_literals' initialiser to the `setting' class
  constructor.

- Remove the "only -1 is allowed to set as unlimited" error message
  altogether now rather than propagating it to `var_pinteger' type.

- Make the `val' member of `struct literal_def' optional and remove the
  `allow' member; simplify processing accordingly.

- Rename `zuinteger_unlimited_literals' to `pinteger_unlimited_literals',
  making the names of all `*_unlimited_literals' arrays consistent with 
  the corresponding `var_*' variable types.

- Rename `struct integer_option_def' to `struct pinteger_option_def',
  observing it's come from `struct zuinteger_unlimited_option_def' and 
  what used to be the `var_zuinteger_unlimited' now has `var_pinteger' 
  semantics.

- Update the names of test flags used by `maint test-options' accordingly.

- Add constructor variants to `struct uinteger_option_def' and `struct
  pinteger_option_def' that allow one to skip the `extra_literals' 
  initialiser altogether rather than having to pass in `nullptr'.

- Update Python documentation mentioning the use of literal `unlimited'
  with the respective parameter types.

No change from v4.

New change in v4.
---
 gdb/cli/cli-cmds.c       |   56 ++++----
 gdb/cli/cli-decode.c     |  302 ++++++++++++++++++++++++++++++++++++++---------
 gdb/cli/cli-option.c     |  116 +++++++++++-------
 gdb/cli/cli-option.h     |   34 +++--
 gdb/cli/cli-setshow.c    |  249 ++++++++++++++++++--------------------
 gdb/cli/cli-setshow.h    |   20 +--
 gdb/command.h            |  108 ++++++++++++++--
 gdb/guile/scm-param.c    |  102 +++++++++------
 gdb/maint-test-options.c |    4 
 gdb/python/py-param.c    |   39 ++++--
 gdb/python/python.c      |   49 +++----
 gdb/valprint.c           |    9 -
 12 files changed, 716 insertions(+), 372 deletions(-)

gdb-setshow-cmd-extra-literals.diff
Index: src/gdb/cli/cli-cmds.c
===================================================================
--- src.orig/gdb/cli/cli-cmds.c
+++ src/gdb/cli/cli-cmds.c
@@ -2200,22 +2200,37 @@ value_from_setting (const setting &var,
 {
   switch (var.type ())
     {
+    case var_uinteger:
     case var_integer:
-      if (var.get<int> () == INT_MAX)
-	return value_from_longest (builtin_type (gdbarch)->builtin_int,
-				   0);
-      else
-	return value_from_longest (builtin_type (gdbarch)->builtin_int,
-				   var.get<int> ());
-    case var_zinteger:
-      return value_from_longest (builtin_type (gdbarch)->builtin_int,
-				 var.get<int> ());
+    case var_pinteger:
+      {
+	LONGEST value
+	  = (var.type () == var_uinteger
+	     ? static_cast<LONGEST> (var.get<unsigned int> ())
+	     : static_cast<LONGEST> (var.get<int> ()));
+
+	if (var.extra_literals () != nullptr)
+	  for (const literal_def *l = var.extra_literals ();
+	       l->literal != nullptr;
+	       l++)
+	    if (value == l->use)
+	      {
+		value = l->val;
+		break;
+	      }
+
+	if (var.type () == var_uinteger)
+	  return
+	    value_from_ulongest (builtin_type (gdbarch)->builtin_unsigned_int,
+				 static_cast<const unsigned int> (value));
+	else
+	  return
+	    value_from_longest (builtin_type (gdbarch)->builtin_int,
+				static_cast<const int> (value));
+      }
     case var_boolean:
       return value_from_longest (builtin_type (gdbarch)->builtin_int,
 				 var.get<bool> () ? 1 : 0);
-    case var_zuinteger_unlimited:
-      return value_from_longest (builtin_type (gdbarch)->builtin_int,
-				 var.get<int> ());
     case var_auto_boolean:
       {
 	int val;
@@ -2237,17 +2252,6 @@ value_from_setting (const setting &var,
 	return value_from_longest (builtin_type (gdbarch)->builtin_int,
 				   val);
       }
-    case var_uinteger:
-      if (var.get<unsigned int> () == UINT_MAX)
-	return value_from_ulongest
-	  (builtin_type (gdbarch)->builtin_unsigned_int, 0);
-      else
-	return value_from_ulongest
-	  (builtin_type (gdbarch)->builtin_unsigned_int,
-	   var.get<unsigned int> ());
-    case var_zuinteger:
-      return value_from_ulongest (builtin_type (gdbarch)->builtin_unsigned_int,
-				  var.get<unsigned int> ());
     case var_string:
     case var_string_noescape:
     case var_optional_filename:
@@ -2317,13 +2321,11 @@ str_value_from_setting (const setting &v
 {
   switch (var.type ())
     {
+    case var_uinteger:
     case var_integer:
-    case var_zinteger:
+    case var_pinteger:
     case var_boolean:
-    case var_zuinteger_unlimited:
     case var_auto_boolean:
-    case var_uinteger:
-    case var_zuinteger:
       {
 	std::string cmd_val = get_setshow_command_value_string (var);
 
Index: src/gdb/cli/cli-decode.c
===================================================================
--- src.orig/gdb/cli/cli-decode.c
+++ src/gdb/cli/cli-decode.c
@@ -580,11 +580,51 @@ add_setshow_cmd_full_erased (const char
   return {set, show};
 }
 
+/* Completes on integer commands that support extra literals.  */
+
+static void
+integer_literals_completer (struct cmd_list_element *c,
+			    completion_tracker &tracker,
+			    const char *text, const char *word)
+{
+  const literal_def *extra_literals = c->var->extra_literals ();
+
+  if (*text == '\0')
+    {
+      tracker.add_completion (make_unique_xstrdup ("NUMBER"));
+      for (const literal_def *l = extra_literals;
+	   l->literal != nullptr;
+	   l++)
+	tracker.add_completion (make_unique_xstrdup (l->literal));
+    }
+  else
+    for (const literal_def *l = extra_literals;
+	 l->literal != nullptr;
+	 l++)
+      if (startswith (l->literal, text))
+	tracker.add_completion (make_unique_xstrdup (l->literal));
+}
+
+/* Add element named NAME to both the command SET_LIST and SHOW_LIST.
+   THECLASS is as in add_cmd.  VAR_TYPE is the kind of thing we are
+   setting.  VAR is address of the variable being controlled by this
+   command.  EXTRA_LITERALS if non-NULL define extra literals to be
+   accepted in lieu of a number for integer variables.  If nullptr is
+   given as VAR, then both SET_SETTING_FUNC and GET_SETTING_FUNC must
+   be provided. SET_SETTING_FUNC and GET_SETTING_FUNC are callbacks
+   used to access and modify the underlying property, whatever its
+   storage is.  SET_FUNC and SHOW_FUNC are the callback functions
+   (if non-NULL).  SET_DOC, SHOW_DOC and HELP_DOC are the
+   documentation strings.
+
+   Return the newly created set and show commands.  */
+
 template<typename T>
 static set_show_commands
 add_setshow_cmd_full (const char *name,
 		      enum command_class theclass,
 		      var_types var_type, T *var,
+		      const literal_def *extra_literals,
 		      const char *set_doc, const char *show_doc,
 		      const char *help_doc,
 		      typename setting_func_types<T>::set set_setting_func,
@@ -595,18 +635,44 @@ add_setshow_cmd_full (const char *name,
 		      struct cmd_list_element **show_list)
 {
   auto erased_args
-    = setting::erase_args (var_type, var,
+    = setting::erase_args (var_type, var, extra_literals,
 			   set_setting_func, get_setting_func);
+  auto cmds = add_setshow_cmd_full_erased (name,
+					   theclass,
+					   var_type, erased_args,
+					   set_doc, show_doc,
+					   help_doc,
+					   set_func,
+					   show_func,
+					   set_list,
+					   show_list);
 
-  return add_setshow_cmd_full_erased (name,
-				      theclass,
-				      var_type, erased_args,
-				      set_doc, show_doc,
-				      help_doc,
-				      set_func,
-				      show_func,
-				      set_list,
-				      show_list);
+  if (extra_literals != nullptr)
+    set_cmd_completer (cmds.set, integer_literals_completer);
+
+  return cmds;
+}
+
+/* Same as above but omitting EXTRA_LITERALS.  */
+
+template<typename T>
+static set_show_commands
+add_setshow_cmd_full (const char *name,
+		      enum command_class theclass,
+		      var_types var_type, T *var,
+		      const char *set_doc, const char *show_doc,
+		      const char *help_doc,
+		      typename setting_func_types<T>::set set_setting_func,
+		      typename setting_func_types<T>::get get_setting_func,
+		      cmd_func_ftype *set_func,
+		      show_value_ftype *show_func,
+		      struct cmd_list_element **set_list,
+		      struct cmd_list_element **show_list)
+{
+  return add_setshow_cmd_full (name, theclass, var_type, var, nullptr,
+			       set_doc, show_doc, help_doc,
+			       set_setting_func, get_setting_func,
+			       set_func, show_func, set_list, show_list);
 }
 
 /* Add element named NAME to command list LIST (the list for set or
@@ -975,25 +1041,6 @@ add_setshow_optional_filename_cmd (const
   return cmds;
 }
 
-/* Completes on literal "unlimited".  Used by integer commands that
-   support a special "unlimited" value.  */
-
-static void
-integer_unlimited_completer (struct cmd_list_element *ignore,
-			     completion_tracker &tracker,
-			     const char *text, const char *word)
-{
-  static const char * const keywords[] =
-    {
-      "unlimited",
-      NULL,
-    };
-
-  if (*text == '\0')
-    tracker.add_completion (make_unique_xstrdup ("NUMBER"));
-  complete_on_enum (tracker, keywords, text, word);
-}
-
 /* Add element named NAME to both the set and show command LISTs (the
    list for set/show or some sublist thereof).  CLASS is as in
    add_cmd.  VAR is address of the variable which will contain the
@@ -1002,6 +1049,55 @@ integer_unlimited_completer (struct cmd_
 
 set_show_commands
 add_setshow_integer_cmd (const char *name, enum command_class theclass,
+			 int *var, const literal_def *extra_literals,
+			 const char *set_doc, const char *show_doc,
+			 const char *help_doc,
+			 cmd_func_ftype *set_func,
+			 show_value_ftype *show_func,
+			 struct cmd_list_element **set_list,
+			 struct cmd_list_element **show_list)
+{
+  set_show_commands commands
+    = add_setshow_cmd_full<int> (name, theclass, var_integer, var,
+				 extra_literals, set_doc, show_doc,
+				 help_doc, nullptr, nullptr, set_func,
+				 show_func, set_list, show_list);
+  return commands;
+}
+
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_integer_cmd (const char *name, command_class theclass,
+			 const literal_def *extra_literals,
+			 const char *set_doc, const char *show_doc,
+			 const char *help_doc,
+			 setting_func_types<int>::set set_func,
+			 setting_func_types<int>::get get_func,
+			 show_value_ftype *show_func,
+			 cmd_list_element **set_list,
+			 cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<int> (name, theclass, var_integer, nullptr,
+					 extra_literals, set_doc, show_doc,
+					 help_doc, set_func, get_func, nullptr,
+					 show_func, set_list, show_list);
+  return cmds;
+}
+
+/* Accept `unlimited' or 0, translated internally to INT_MAX.  */
+const literal_def integer_unlimited_literals[] =
+  {
+    { "unlimited", 0, INT_MAX, true },
+    { nullptr }
+  };
+
+/* Same as above but using `integer_unlimited_literals', with a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_integer_cmd (const char *name, enum command_class theclass,
 			 int *var,
 			 const char *set_doc, const char *show_doc,
 			 const char *help_doc,
@@ -1012,12 +1108,10 @@ add_setshow_integer_cmd (const char *nam
 {
   set_show_commands commands
     = add_setshow_cmd_full<int> (name, theclass, var_integer, var,
+				 integer_unlimited_literals,
 				 set_doc, show_doc, help_doc,
 				 nullptr, nullptr, set_func,
 				 show_func, set_list, show_list);
-
-  set_cmd_completer (commands.set, integer_unlimited_completer);
-
   return commands;
 }
 
@@ -1035,12 +1129,54 @@ add_setshow_integer_cmd (const char *nam
 			 cmd_list_element **show_list)
 {
   auto cmds = add_setshow_cmd_full<int> (name, theclass, var_integer, nullptr,
+					 integer_unlimited_literals,
 					 set_doc, show_doc, help_doc, set_func,
 					 get_func, nullptr, show_func, set_list,
 					 show_list);
+  return cmds;
+}
 
-  set_cmd_completer (cmds.set, integer_unlimited_completer);
+/* Add element named NAME to both the set and show command LISTs (the
+   list for set/show or some sublist thereof).  CLASS is as in
+   add_cmd.  VAR is address of the variable which will contain the
+   value.  SET_DOC and SHOW_DOC are the documentation strings.  */
+
+set_show_commands
+add_setshow_pinteger_cmd (const char *name, enum command_class theclass,
+			  int *var, const literal_def *extra_literals,
+			  const char *set_doc, const char *show_doc,
+			  const char *help_doc,
+			  cmd_func_ftype *set_func,
+			  show_value_ftype *show_func,
+			  struct cmd_list_element **set_list,
+			  struct cmd_list_element **show_list)
+{
+  set_show_commands commands
+    = add_setshow_cmd_full<int> (name, theclass, var_pinteger, var,
+				 extra_literals, set_doc, show_doc,
+				 help_doc, nullptr, nullptr, set_func,
+				 show_func, set_list, show_list);
+  return commands;
+}
 
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_pinteger_cmd (const char *name, command_class theclass,
+			  const literal_def *extra_literals,
+			  const char *set_doc, const char *show_doc,
+			  const char *help_doc,
+			  setting_func_types<int>::set set_func,
+			  setting_func_types<int>::get get_func,
+			  show_value_ftype *show_func,
+			  cmd_list_element **set_list,
+			  cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<int> (name, theclass, var_pinteger, nullptr,
+					 extra_literals, set_doc, show_doc,
+					 help_doc, set_func, get_func, nullptr,
+					 show_func, set_list, show_list);
   return cmds;
 }
 
@@ -1051,7 +1187,7 @@ add_setshow_integer_cmd (const char *nam
 
 set_show_commands
 add_setshow_uinteger_cmd (const char *name, enum command_class theclass,
-			  unsigned int *var,
+			  unsigned int *var, const literal_def *extra_literals,
 			  const char *set_doc, const char *show_doc,
 			  const char *help_doc,
 			  cmd_func_ftype *set_func,
@@ -1061,12 +1197,9 @@ add_setshow_uinteger_cmd (const char *na
 {
   set_show_commands commands
     = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger, var,
-					  set_doc, show_doc, help_doc,
-					  nullptr, nullptr, set_func,
+					  extra_literals, set_doc, show_doc,
+					  help_doc, nullptr, nullptr, set_func,
 					  show_func, set_list, show_list);
-
-  set_cmd_completer (commands.set, integer_unlimited_completer);
-
   return commands;
 }
 
@@ -1075,6 +1208,7 @@ add_setshow_uinteger_cmd (const char *na
 
 set_show_commands
 add_setshow_uinteger_cmd (const char *name, command_class theclass,
+			  const literal_def *extra_literals,
 			  const char *set_doc, const char *show_doc,
 			  const char *help_doc,
 			  setting_func_types<unsigned int>::set set_func,
@@ -1084,13 +1218,63 @@ add_setshow_uinteger_cmd (const char *na
 			  cmd_list_element **show_list)
 {
   auto cmds = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
-						  nullptr, set_doc, show_doc,
-						  help_doc, set_func, get_func,
-						  nullptr, show_func, set_list,
+						  nullptr, extra_literals,
+						  set_doc, show_doc, help_doc,
+						  set_func, get_func, nullptr,
+						  show_func, set_list,
 						  show_list);
+  return cmds;
+}
 
-  set_cmd_completer (cmds.set, integer_unlimited_completer);
+/* Accept `unlimited' or 0, translated internally to UINT_MAX.  */
+const literal_def uinteger_unlimited_literals[] =
+  {
+    { "unlimited", 0, UINT_MAX, true },
+    { nullptr }
+  };
+
+/* Same as above but using `uinteger_unlimited_literals', with a pointer
+   to a global storage buffer.  */
+
+set_show_commands
+add_setshow_uinteger_cmd (const char *name, enum command_class theclass,
+			  unsigned int *var,
+			  const char *set_doc, const char *show_doc,
+			  const char *help_doc,
+			  cmd_func_ftype *set_func,
+			  show_value_ftype *show_func,
+			  struct cmd_list_element **set_list,
+			  struct cmd_list_element **show_list)
+{
+  set_show_commands commands
+    = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger, var,
+					  uinteger_unlimited_literals,
+					  set_doc, show_doc, help_doc, nullptr,
+					  nullptr, set_func, show_func,
+					  set_list, show_list);
+  return commands;
+}
+
+/* Same as above but using a getter and a setter function instead of a pointer
+   to a global storage buffer.  */
 
+set_show_commands
+add_setshow_uinteger_cmd (const char *name, command_class theclass,
+			  const char *set_doc, const char *show_doc,
+			  const char *help_doc,
+			  setting_func_types<unsigned int>::set set_func,
+			  setting_func_types<unsigned int>::get get_func,
+			  show_value_ftype *show_func,
+			  cmd_list_element **set_list,
+			  cmd_list_element **show_list)
+{
+  auto cmds = add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
+						  nullptr,
+						  uinteger_unlimited_literals,
+						  set_doc, show_doc, help_doc,
+						  set_func, get_func, nullptr,
+						  show_func, set_list,
+						  show_list);
   return cmds;
 }
 
@@ -1109,7 +1293,7 @@ add_setshow_zinteger_cmd (const char *na
 			  struct cmd_list_element **set_list,
 			  struct cmd_list_element **show_list)
 {
-  return add_setshow_cmd_full<int> (name, theclass, var_zinteger, var,
+  return add_setshow_cmd_full<int> (name, theclass, var_integer, var,
 				    set_doc, show_doc, help_doc,
 				    nullptr, nullptr, set_func,
 				    show_func, set_list, show_list);
@@ -1128,12 +1312,22 @@ add_setshow_zinteger_cmd (const char *na
 			  cmd_list_element **set_list,
 			  cmd_list_element **show_list)
 {
-  return add_setshow_cmd_full<int> (name, theclass, var_zinteger, nullptr,
+  return add_setshow_cmd_full<int> (name, theclass, var_integer, nullptr,
 				    set_doc, show_doc, help_doc, set_func,
 				    get_func, nullptr, show_func, set_list,
 				    show_list);
 }
 
+/* Accept `unlimited' or -1, using -1 internally.  */
+const literal_def zuinteger_unlimited_literals[] =
+  {
+    { "unlimited", -1, -1, true },
+    { nullptr }
+  };
+
+/* Same as above but using `zuinteger_unlimited_literals', with a pointer
+   to a global storage buffer.  */
+
 set_show_commands
 add_setshow_zuinteger_unlimited_cmd (const char *name,
 				     enum command_class theclass,
@@ -1147,13 +1341,11 @@ add_setshow_zuinteger_unlimited_cmd (con
 				     struct cmd_list_element **show_list)
 {
   set_show_commands commands
-    = add_setshow_cmd_full<int> (name, theclass, var_zuinteger_unlimited, var,
+    = add_setshow_cmd_full<int> (name, theclass, var_pinteger, var,
+				 zuinteger_unlimited_literals,
 				 set_doc, show_doc, help_doc, nullptr,
 				 nullptr, set_func, show_func, set_list,
 				 show_list);
-
-  set_cmd_completer (commands.set, integer_unlimited_completer);
-
   return commands;
 }
 
@@ -1171,13 +1363,11 @@ add_setshow_zuinteger_unlimited_cmd (con
 				     cmd_list_element **show_list)
 {
   auto cmds
-    = add_setshow_cmd_full<int> (name, theclass, var_zuinteger_unlimited,
-				 nullptr, set_doc, show_doc, help_doc, set_func,
+    = add_setshow_cmd_full<int> (name, theclass, var_pinteger, nullptr,
+				 zuinteger_unlimited_literals,
+				 set_doc, show_doc, help_doc, set_func,
 				 get_func, nullptr, show_func, set_list,
 				 show_list);
-
-  set_cmd_completer (cmds.set, integer_unlimited_completer);
-
   return cmds;
 }
 
@@ -1196,7 +1386,7 @@ add_setshow_zuinteger_cmd (const char *n
 			   struct cmd_list_element **set_list,
 			   struct cmd_list_element **show_list)
 {
-  return add_setshow_cmd_full<unsigned int> (name, theclass, var_zuinteger,
+  return add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
 					     var, set_doc, show_doc, help_doc,
 					     nullptr, nullptr, set_func,
 					     show_func, set_list, show_list);
@@ -1215,7 +1405,7 @@ add_setshow_zuinteger_cmd (const char *n
 			   cmd_list_element **set_list,
 			   cmd_list_element **show_list)
 {
-  return add_setshow_cmd_full<unsigned int> (name, theclass, var_zuinteger,
+  return add_setshow_cmd_full<unsigned int> (name, theclass, var_uinteger,
 					     nullptr, set_doc, show_doc,
 					     help_doc, set_func, get_func,
 					     nullptr, show_func, set_list,
Index: src/gdb/cli/cli-option.c
===================================================================
--- src.orig/gdb/cli/cli-option.c
+++ src/gdb/cli/cli-option.c
@@ -38,7 +38,7 @@ union option_value
   /* For var_uinteger options.  */
   unsigned int uinteger;
 
-  /* For var_zuinteger_unlimited options.  */
+  /* For var_integer and var_pinteger options.  */
   int integer;
 
   /* For var_enum options.  */
@@ -356,42 +356,55 @@ parse_option (gdb::array_view<const opti
 	return option_def_and_value {*match, match_ctx, val};
       }
     case var_uinteger:
-    case var_zuinteger_unlimited:
+    case var_integer:
+    case var_pinteger:
       {
 	if (completion != nullptr)
 	  {
-	    if (**args == '\0')
-	      {
-		/* Convenience to let the user know what the option
-		   can accept.  Note there's no common prefix between
-		   the strings on purpose, so that readline doesn't do
-		   a partial match.  */
-		completion->tracker.add_completion
-		  (make_unique_xstrdup ("NUMBER"));
-		completion->tracker.add_completion
-		  (make_unique_xstrdup ("unlimited"));
-		return {};
-	      }
-	    else if (startswith ("unlimited", *args))
+	    if (match->extra_literals != nullptr)
 	      {
-		completion->tracker.add_completion
-		  (make_unique_xstrdup ("unlimited"));
-		return {};
+		/* Convenience to let the user know what the option can
+		   accept.  Make sure there's no common prefix between
+		   "NUMBER" and all the strings when adding new ones,
+		   so that readline doesn't do a partial match.  */
+		if (**args == '\0')
+		  {
+		    completion->tracker.add_completion
+		      (make_unique_xstrdup ("NUMBER"));
+		    for (const literal_def *l = match->extra_literals;
+			 l->literal != nullptr;
+			 l++)
+		      completion->tracker.add_completion
+			(make_unique_xstrdup (l->literal));
+		    return {};
+		  }
+		else
+		  {
+		    bool completions = false;
+		    for (const literal_def *l = match->extra_literals;
+			 l->literal != nullptr;
+			 l++)
+		      if (startswith (l->literal, *args))
+			{
+			  completion->tracker.add_completion
+			    (make_unique_xstrdup (l->literal));
+			  completions = true;
+			}
+		    if (completions)
+		      return {};
+		  }
 	      }
 	  }
 
-	if (match->type == var_zuinteger_unlimited)
-	  {
-	    option_value val;
-	    val.integer = parse_cli_var_zuinteger_unlimited (args, false);
-	    return option_def_and_value {*match, match_ctx, val};
-	  }
+	LONGEST v = parse_cli_var_integer (match->type,
+					   match->extra_literals,
+					   args, false);
+	option_value val;
+	if (match->type == var_uinteger)
+	  val.uinteger = v;
 	else
-	  {
-	    option_value val;
-	    val.uinteger = parse_cli_var_uinteger (match->type, args, false);
-	    return option_def_and_value {*match, match_ctx, val};
-	  }
+	  val.integer = v;
+	return option_def_and_value {*match, match_ctx, val};
       }
     case var_enum:
       {
@@ -593,7 +606,7 @@ save_option_value_in_ctx (gdb::optional<
       *ov->option.var_address.uinteger (ov->option, ov->ctx)
 	= ov->value->uinteger;
       break;
-    case var_zuinteger_unlimited:
+    case var_integer:
       *ov->option.var_address.integer (ov->option, ov->ctx)
 	= ov->value->integer;
       break;
@@ -664,8 +677,20 @@ get_val_type_str (const option_def &opt,
     case var_boolean:
       return "[on|off]";
     case var_uinteger:
-    case var_zuinteger_unlimited:
-      return "NUMBER|unlimited";
+    case var_integer:
+    case var_pinteger:
+      {
+	buffer = "NUMBER";
+	if (opt.extra_literals != nullptr)
+	  for (const literal_def *l = opt.extra_literals;
+	       l->literal != nullptr;
+	       l++)
+	    {
+	      buffer += '|';
+	      buffer += l->literal;
+	    }
+	return buffer.c_str ();
+      }
     case var_enum:
       {
 	buffer = "";
@@ -789,20 +814,31 @@ add_setshow_cmds_for_options (command_cl
 	{
 	  add_setshow_uinteger_cmd (option.name, cmd_class,
 				    option.var_address.uinteger (option, data),
+				    option.extra_literals,
 				    option.set_doc, option.show_doc,
 				    option.help_doc,
 				    nullptr, option.show_cmd_cb,
 				    set_list, show_list);
 	}
-      else if (option.type == var_zuinteger_unlimited)
+      else if (option.type == var_integer)
 	{
-	  add_setshow_zuinteger_unlimited_cmd
-	    (option.name, cmd_class,
-	     option.var_address.integer (option, data),
-	     option.set_doc, option.show_doc,
-	     option.help_doc,
-	     nullptr, option.show_cmd_cb,
-	     set_list, show_list);
+	  add_setshow_integer_cmd (option.name, cmd_class,
+				   option.var_address.integer (option, data),
+				   option.extra_literals,
+				   option.set_doc, option.show_doc,
+				   option.help_doc,
+				   nullptr, option.show_cmd_cb,
+				   set_list, show_list);
+	}
+      else if (option.type == var_pinteger)
+	{
+	  add_setshow_pinteger_cmd (option.name, cmd_class,
+				    option.var_address.integer (option, data),
+				    option.extra_literals,
+				    option.set_doc, option.show_doc,
+				    option.help_doc,
+				    nullptr, option.show_cmd_cb,
+				    set_list, show_list);
 	}
       else if (option.type == var_enum)
 	{
Index: src/gdb/cli/cli-option.h
===================================================================
--- src.orig/gdb/cli/cli-option.h
+++ src/gdb/cli/cli-option.h
@@ -49,12 +49,13 @@ struct option_def
      used to create the option's "set/show" commands.  */
   constexpr option_def (const char *name_,
 			var_types var_type_,
+			const literal_def *extra_literals_,
 			erased_get_var_address_ftype *erased_get_var_address_,
 			show_value_ftype *show_cmd_cb_,
 			const char *set_doc_,
 			const char *show_doc_,
 			const char *help_doc_)
-    : name (name_), type (var_type_),
+    : name (name_), type (var_type_), extra_literals (extra_literals_),
       erased_get_var_address (erased_get_var_address_),
       var_address {},
       show_cmd_cb (show_cmd_cb_),
@@ -68,6 +69,9 @@ struct option_def
   /* The option's type.  */
   var_types type;
 
+  /* Extra literals, such as `unlimited', accepted in lieu of a number.  */
+  const literal_def *extra_literals;
+
   /* A function that gets the controlling variable's address, type
      erased.  */
   erased_get_var_address_ftype *erased_get_var_address;
@@ -160,7 +164,7 @@ struct boolean_option_def : option_def
 		      const char *set_doc_,
 		      const char *show_doc_ = nullptr,
 		      const char *help_doc_ = nullptr)
-    : option_def (long_option_, var_boolean,
+    : option_def (long_option_, var_boolean, nullptr,
 		  (erased_get_var_address_ftype *) get_var_address_cb_,
 		  show_cmd_cb_,
 		  set_doc_, show_doc_, help_doc_)
@@ -207,11 +211,12 @@ struct uinteger_option_def : option_def
 {
   uinteger_option_def (const char *long_option_,
 		       unsigned int *(*get_var_address_cb_) (Context *),
+		       const literal_def *extra_literals_,
 		       show_value_ftype *show_cmd_cb_,
 		       const char *set_doc_,
 		       const char *show_doc_ = nullptr,
 		       const char *help_doc_ = nullptr)
-    : option_def (long_option_, var_uinteger,
+    : option_def (long_option_, var_uinteger, extra_literals_,
 		  (erased_get_var_address_ftype *) get_var_address_cb_,
 		  show_cmd_cb_,
 		  set_doc_, show_doc_, help_doc_)
@@ -220,18 +225,19 @@ struct uinteger_option_def : option_def
   }
 };
 
-/* A var_zuinteger_unlimited command line option.  */
+/* A var_integer command line option.  */
 
 template<typename Context>
-struct zuinteger_unlimited_option_def : option_def
+struct integer_option_def : option_def
 {
-  zuinteger_unlimited_option_def (const char *long_option_,
-				  int *(*get_var_address_cb_) (Context *),
-				  show_value_ftype *show_cmd_cb_,
-				  const char *set_doc_,
-				  const char *show_doc_ = nullptr,
-				  const char *help_doc_ = nullptr)
-    : option_def (long_option_, var_zuinteger_unlimited,
+  integer_option_def (const char *long_option_,
+		      int *(*get_var_address_cb_) (Context *),
+		      const literal_def *extra_literals_,
+		      show_value_ftype *show_cmd_cb_,
+		      const char *set_doc_,
+		      const char *show_doc_ = nullptr,
+		      const char *help_doc_ = nullptr)
+    : option_def (long_option_, var_integer, extra_literals_,
 		  (erased_get_var_address_ftype *) get_var_address_cb_,
 		  show_cmd_cb_,
 		  set_doc_, show_doc_, help_doc_)
@@ -252,7 +258,7 @@ struct enum_option_def : option_def
 		   const char *set_doc_,
 		   const char *show_doc_ = nullptr,
 		   const char *help_doc_ = nullptr)
-    : option_def (long_option_, var_enum,
+    : option_def (long_option_, var_enum, nullptr,
 		  (erased_get_var_address_ftype *) get_var_address_cb_,
 		  show_cmd_cb_,
 		  set_doc_, show_doc_, help_doc_)
@@ -273,7 +279,7 @@ struct string_option_def : option_def
 		     const char *set_doc_,
 		     const char *show_doc_ = nullptr,
 		     const char *help_doc_ = nullptr)
-    : option_def (long_option_, var_string,
+    : option_def (long_option_, var_string, nullptr,
 		  (erased_get_var_address_ftype *) get_var_address_cb_,
 		  show_cmd_cb_,
 		  set_doc_, show_doc_, help_doc_)
Index: src/gdb/cli/cli-setshow.c
===================================================================
--- src.orig/gdb/cli/cli-setshow.c
+++ src/gdb/cli/cli-setshow.c
@@ -149,10 +149,11 @@ deprecated_show_value_hack (struct ui_fi
     }
 }
 
-/* Returns true if ARG is "unlimited".  */
+/* Returns true and the value in VAL if ARG is an accepted literal.  */
 
 static bool
-is_unlimited_literal (const char **arg, bool expression)
+get_literal_val (LONGEST &val, const literal_def *extra_literals,
+		 const char **arg, bool expression)
 {
   *arg = skip_spaces (*arg);
 
@@ -162,85 +163,108 @@ is_unlimited_literal (const char **arg,
 
   size_t len = p - *arg;
 
-  if (len > 0 && strncmp ("unlimited", *arg, len) == 0)
-    {
-      *arg += len;
-
-      /* If parsing an expression (i.e., parsing for a "set" command),
-	 anything after "unlimited" is junk.  For options, anything
-	 after "unlimited" might be a command argument or another
-	 option.  */
-      if (expression)
+  if (len > 0 && extra_literals != nullptr)
+    for (const literal_def *l = extra_literals;
+	 l->literal != nullptr;
+	 l++)
+      if (strncmp (l->literal, *arg, len) == 0)
 	{
-	  const char *after = skip_spaces (*arg);
-	  if (*after != '\0')
-	    error (_("Junk after \"%.*s\": %s"),
-		   (int) len, unl_start, after);
-	}
+	  *arg += len;
 
-      return true;
-    }
+	  /* If parsing an expression (i.e., parsing for a "set" command),
+	     anything after the literal is junk.  For options, anything
+	     after the literal might be a command argument or another
+	     option.  */
+	  if (expression)
+	    {
+	      const char *after = skip_spaces (*arg);
+	      if (*after != '\0')
+		error (_("Junk after \"%.*s\": %s"),
+		       (int) len, unl_start, after);
+	    }
+
+	  val = l->use;
+	  return true;
+	}
 
   return false;
 }
 
 /* See cli-setshow.h.  */
 
-unsigned int
-parse_cli_var_uinteger (var_types var_type, const char **arg,
-			bool expression)
+LONGEST
+parse_cli_var_integer (var_types var_type, const literal_def *extra_literals,
+		       const char **arg, bool expression)
 {
   LONGEST val;
 
   if (*arg == nullptr || **arg == '\0')
     {
-      if (var_type == var_uinteger)
-	error_no_arg (_("integer to set it to, or \"unlimited\""));
-      else
+      if (extra_literals == nullptr)
 	error_no_arg (_("integer to set it to"));
-    }
-
-  if (var_type == var_uinteger && is_unlimited_literal (arg, expression))
-    val = 0;
-  else if (expression)
-    val = parse_and_eval_long (*arg);
-  else
-    val = get_ulongest (arg);
-
-  if (var_type == var_uinteger && val == 0)
-    val = UINT_MAX;
-  else if (val < 0
-	   /* For var_uinteger, don't let the user set the value
-	      to UINT_MAX directly, as that exposes an
-	      implementation detail to the user interface.  */
-	   || (var_type == var_uinteger && val >= UINT_MAX)
-	   || (var_type == var_zuinteger && val > UINT_MAX))
-    error (_("integer %s out of range"), plongest (val));
-
-  return val;
-}
-
-/* See cli-setshow.h.  */
+      else
+	{
+	  std::string buffer = "";
+	  size_t count = 0;
 
-int
-parse_cli_var_zuinteger_unlimited (const char **arg, bool expression)
-{
-  LONGEST val;
+	  for (const literal_def *l = extra_literals;
+	       l->literal != nullptr;
+	       l++, count++)
+	    {
+	      if (count != 0)
+		buffer += ", ";
+	      buffer = buffer + '"' + l->literal + '"';
+	    }
+	  if (count > 1)
+	    error_no_arg
+	      (string_printf (_("integer to set it to, or one of: %s"),
+			      buffer.c_str ()).c_str ());
+	  else
+	    error_no_arg
+	      (string_printf (_("integer to set it to, or %s"),
+			      buffer.c_str ()).c_str ());
+	}
+    }
 
-  if (*arg == nullptr || **arg == '\0')
-    error_no_arg (_("integer to set it to, or \"unlimited\""));
+  if (!get_literal_val (val, extra_literals, arg, expression))
+    {
+      if (expression)
+	val = parse_and_eval_long (*arg);
+      else
+	val = get_ulongest (arg);
 
-  if (is_unlimited_literal (arg, expression))
-    val = -1;
-  else if (expression)
-    val = parse_and_eval_long (*arg);
-  else
-    val = get_ulongest (arg);
+      enum tribool allowed = TRIBOOL_UNKNOWN;
+      if (extra_literals != nullptr)
+	{
+	  for (const literal_def *l = extra_literals;
+	       l->literal != nullptr;
+	       l++)
+	    if (val == l->val)
+	      {
+		allowed = l->allow ? TRIBOOL_TRUE : TRIBOOL_FALSE;
+		val = l->use;
+		break;
+	      }
+	    else if (val == l->use)
+	      {
+		allowed = TRIBOOL_FALSE;
+		break;
+	      }
+	}
 
-  if (val > INT_MAX)
-    error (_("integer %s out of range"), plongest (val));
-  else if (val < -1)
-    error (_("only -1 is allowed to set as unlimited"));
+      if (allowed == TRIBOOL_UNKNOWN)
+	{
+	  if (var_type == var_pinteger && val < 0)
+	    error (_("only -1 is allowed to set as unlimited"));
+	  else if (val > UINT_MAX || val < INT_MIN
+		   || (var_type == var_uinteger && val < 0)
+		   || (var_type == var_integer && val > INT_MAX)
+		   || (var_type == var_pinteger && val > INT_MAX))
+	    allowed = TRIBOOL_FALSE;
+	}
+      if (allowed == TRIBOOL_FALSE)
+	error (_("integer %s out of range"), plongest (val));
+    }
 
   return val;
 }
@@ -405,41 +429,18 @@ do_set_command (const char *arg, int fro
       option_changed = c->var->set<enum auto_boolean> (parse_auto_binary_operation (arg));
       break;
     case var_uinteger:
-    case var_zuinteger:
       option_changed
-	= c->var->set<unsigned int> (parse_cli_var_uinteger (c->var->type (),
-							     &arg, true));
+	= c->var->set<unsigned int> (parse_cli_var_integer (c->var->type (),
+							    c->var->
+							    extra_literals (),
+							    &arg, true));
       break;
     case var_integer:
-    case var_zinteger:
-      {
-	LONGEST val;
-
-	if (*arg == '\0')
-	  {
-	    if (c->var->type () == var_integer)
-	      error_no_arg (_("integer to set it to, or \"unlimited\""));
-	    else
-	      error_no_arg (_("integer to set it to"));
-	  }
-
-	if (c->var->type () == var_integer && is_unlimited_literal (&arg, true))
-	  val = 0;
-	else
-	  val = parse_and_eval_long (arg);
-
-	if (val == 0 && c->var->type () == var_integer)
-	  val = INT_MAX;
-	else if (val < INT_MIN
-		 /* For var_integer, don't let the user set the value
-		    to INT_MAX directly, as that exposes an
-		    implementation detail to the user interface.  */
-		 || (c->var->type () == var_integer && val >= INT_MAX)
-		 || (c->var->type () == var_zinteger && val > INT_MAX))
-	  error (_("integer %s out of range"), plongest (val));
-
-	option_changed = c->var->set<int> (val);
-      }
+    case var_pinteger:
+      option_changed
+	= c->var->set<int> (parse_cli_var_integer (c->var->type (),
+						   c->var->extra_literals (),
+						   &arg, true));
       break;
     case var_enum:
       {
@@ -454,10 +455,6 @@ do_set_command (const char *arg, int fro
 	option_changed = c->var->set<const char *> (match);
       }
       break;
-    case var_zuinteger_unlimited:
-      option_changed = c->var->set<int>
-	(parse_cli_var_zuinteger_unlimited (&arg, true));
-      break;
     default:
       error (_("gdb internal error: bad var_type in do_setshow_command"));
     }
@@ -551,7 +548,6 @@ do_set_command (const char *arg, int fro
 	  }
 	  break;
 	case var_uinteger:
-	case var_zuinteger:
 	  {
 	    char s[64];
 
@@ -560,8 +556,7 @@ do_set_command (const char *arg, int fro
 	  }
 	  break;
 	case var_integer:
-	case var_zinteger:
-	case var_zuinteger_unlimited:
+	case var_pinteger:
 	  {
 	    char s[64];
 
@@ -623,36 +618,32 @@ get_setshow_command_value_string (const
 	}
       break;
     case var_uinteger:
-    case var_zuinteger:
-      {
-	const unsigned int value = var.get<unsigned int> ();
-
-	if (var.type () == var_uinteger
-	    && value == UINT_MAX)
-	  stb.puts ("unlimited");
-	else
-	  stb.printf ("%u", value);
-      }
-      break;
     case var_integer:
-    case var_zinteger:
+    case var_pinteger:
       {
-	const int value = var.get<int> ();
+	bool printed = false;
+	const LONGEST value
+	  = (var.type () == var_uinteger
+	     ? static_cast<LONGEST> (var.get<unsigned int> ())
+	     : static_cast<LONGEST> (var.get<int> ()));
 
-	if (var.type () == var_integer
-	    && value == INT_MAX)
-	  stb.puts ("unlimited");
-	else
-	  stb.printf ("%d", value);
-      }
-      break;
-    case var_zuinteger_unlimited:
-      {
-	const int value = var.get<int> ();
-	if (value == -1)
-	  stb.puts ("unlimited");
-	else
-	  stb.printf ("%d", value);
+	if (var.extra_literals () != nullptr)
+	  for (const literal_def *l = var.extra_literals ();
+	       l->literal != nullptr;
+	       l++)
+	    if (value == l->use)
+	      {
+		stb.puts (l->literal);
+		printed = true;
+		break;
+	      }
+	if (!printed)
+	  {
+	    if (var.type () == var_uinteger)
+	      stb.printf ("%u", static_cast<const unsigned int> (value));
+	    else
+	      stb.printf ("%d", static_cast<const int> (value));
+	  }
       }
       break;
     default:
Index: src/gdb/cli/cli-setshow.h
===================================================================
--- src.orig/gdb/cli/cli-setshow.h
+++ src/gdb/cli/cli-setshow.h
@@ -29,21 +29,19 @@ extern int parse_cli_boolean_value (cons
    past a successfully parsed value.  */
 extern int parse_cli_boolean_value (const char **arg);
 
-/* Parse ARG, an option to a var_uinteger or var_zuinteger variable.
-   Either returns the parsed value on success or throws an error.  If
-   EXPRESSION is true, *ARG is parsed as an expression; otherwise, it
-   is parsed with get_ulongest.  It's not possible to parse the
+/* Parse ARG, an option to a var_uinteger, var_integer or var_pinteger
+   variable.  Return the parsed value on success or throw an error.  If
+   EXTRA_LITERALS is non-null, then interpret those literals accordingly.
+   If EXPRESSION is true, *ARG is parsed as an expression; otherwise,
+   it is parsed with get_ulongest.  It's not possible to parse the
    integer as an expression when there may be valid input after the
    integer, such as when parsing command options.  E.g., "print
    -elements NUMBER -obj --".  In such case, parsing as an expression
    would parse "-obj --" as part of the expression as well.  */
-extern unsigned int parse_cli_var_uinteger (var_types var_type,
-					    const char **arg,
-					    bool expression);
-
-/* Like parse_cli_var_uinteger, for var_zuinteger_unlimited.  */
-extern int parse_cli_var_zuinteger_unlimited (const char **arg,
-					      bool expression);
+extern LONGEST parse_cli_var_integer (var_types var_type,
+				      const literal_def *extra_literals,
+				      const char **arg,
+				      bool expression);
 
 /* Parse ARG, an option to a var_enum variable.  ENUM is a
    null-terminated array of possible values. Either returns the parsed
Index: src/gdb/command.h
===================================================================
--- src.orig/gdb/command.h
+++ src/gdb/command.h
@@ -84,16 +84,18 @@ typedef enum var_types
        value.  */
     var_auto_boolean,
 
-    /* Unsigned Integer.  *VAR is an unsigned int.  The user can type
-       0 to mean "unlimited", which is stored in *VAR as UINT_MAX.  */
+    /* Unsigned Integer.  *VAR is an unsigned int.  In the Guile and Python
+       APIs 0 means unlimited, which is stored in *VAR as UINT_MAX.  */
     var_uinteger,
 
-    /* Like var_uinteger but signed.  *VAR is an int.  The user can
-       type 0 to mean "unlimited", which is stored in *VAR as
-       INT_MAX.  The only remaining use of it is the Python API.
-       Don't use it elsewhere.  */
+    /* Like var_uinteger but signed.  *VAR is an int.  In the Guile and
+       Python APIs 0 means unlimited, which is stored in *VAR as INT_MAX.  */
     var_integer,
 
+    /* Like var_integer but negative numbers are not allowed,
+       except for special values.  *VAR is an int.  */
+    var_pinteger,
+
     /* String which the user enters with escapes (e.g. the user types
        \n and it is a real newline in the stored string).
        *VAR is a std::string, "" if the string is empty.  */
@@ -106,15 +108,16 @@ typedef enum var_types
     var_optional_filename,
     /* String which stores a filename.  (*VAR) is a std::string.  */
     var_filename,
-    /* ZeroableInteger.  *VAR is an int.  Like var_integer except
-       that zero really means zero.  */
+    /* Like var_integer.  *VAR is an int.  The only remaining uses
+       of it are the Guile and Python APIs.  Don't use it elsewhere.  */
     var_zinteger,
-    /* ZeroableUnsignedInteger.  *VAR is an unsigned int.  Zero really
-       means zero.  */
+    /* Like var_uinteger.  *VAR is an unsigned int.  The only remaining
+       uses of it are the Guile and Python APIs.  Don't use it elsewhere.  */
     var_zuinteger,
-    /* ZeroableUnsignedInteger with unlimited value.  *VAR is an int,
-       but its range is [0, INT_MAX].  -1 stands for unlimited and
-       other negative numbers are not allowed.  */
+    /* Like var_pinteger.  *VAR is an int, but its range is [-1, INT_MAX].
+       -1 stands for unlimited and other negative numbers are not allowed.
+       The only remaining uses of it are the Guile and Python APIs.  Don't
+       use it elsewhere.  */
     var_zuinteger_unlimited,
     /* Enumerated type.  Can only have one of the specified values.
        *VAR is a char pointer to the name of the element that we
@@ -123,6 +126,22 @@ typedef enum var_types
   }
 var_types;
 
+/* A structure describing an extra literal accepted and shown in place
+   of a number.  */
+typedef struct literal_defs
+  {
+    /* The literal to define, e.g. "unlimited".  */
+    const char *literal;
+    /* A number optionally accepted that stands for the literal.  */
+    LONGEST val;
+    /* The number to substitute internally for LITERAL or VAL;
+       the use of this number is not allowed (unless the same as VAL).  */
+    LONGEST use;
+    /* True if the use of VAL is allowed; otherwise only the literal is.  */
+    bool allow;
+  }
+literal_def;
+
 /* Return true if a setting of type VAR_TYPE is backed with type T.
 
    This function is left without definition intentionally.  This template is
@@ -153,15 +172,14 @@ inline bool var_type_uses<enum auto_bool
 template<>
 inline bool var_type_uses<unsigned int> (var_types t)
 {
-  return (t == var_uinteger || t == var_zinteger || t == var_zuinteger);
+  return t == var_uinteger;
 }
 
 /* Return true if a setting of type T is backed by an int variable.  */
 template<>
 inline bool var_type_uses<int> (var_types t)
 {
-  return (t == var_integer || t == var_zinteger
-	  || t == var_zuinteger_unlimited);
+  return t == var_integer || t == var_pinteger;
 }
 
 /* Return true if a setting of type T is backed by a std::string variable.  */
@@ -233,6 +251,7 @@ struct setting
   struct erased_args
   {
     void *var;
+    const void *extra_literals;
     erased_func setter;
     erased_func getter;
   };
@@ -240,6 +259,7 @@ struct setting
   template<typename T>
   static erased_args erase_args (var_types var_type,
 				 T *var,
+				 const literal_def *extra_literals,
 				 typename setting_func_types<T>::set set_setting_func,
 				 typename setting_func_types<T>::get get_setting_func)
   {
@@ -254,6 +274,7 @@ struct setting
 
     return {
 	var,
+	extra_literals,
 	reinterpret_cast<erased_func> (set_setting_func),
 	reinterpret_cast<erased_func> (get_setting_func)
     };
@@ -265,6 +286,7 @@ struct setting
   setting (var_types var_type, const erased_args &args)
     : m_var_type (var_type),
       m_var (args.var),
+      m_extra_literals (args.extra_literals),
       m_getter (args.getter),
       m_setter (args.setter)
   {
@@ -295,6 +317,10 @@ struct setting
   var_types type () const
   { return m_var_type; }
 
+  /* Access any extra literals accepted.  */
+  const literal_def *extra_literals () const
+  { return static_cast<const literal_def *> (m_extra_literals); }
+
   /* Return the current value.
 
      The template parameter T is the type of the variable used to store the
@@ -357,6 +383,9 @@ struct setting
      non-nullptr.  */
   void *m_var = nullptr;
 
+  /* Any extra literals accepted.  */
+  const void *m_extra_literals = nullptr;
+
   /* Pointer to a user provided getter.  */
   erased_func m_getter = nullptr;
 
@@ -652,6 +681,11 @@ typedef void (show_value_ftype) (struct
    instead print the value out directly.  */
 extern show_value_ftype deprecated_show_value_hack;
 
+/* Various sets of extra literals accepted.  */
+extern const literal_def integer_unlimited_literals[];
+extern const literal_def uinteger_unlimited_literals[];
+extern const literal_def zuinteger_unlimited_literals[];
+
 extern set_show_commands add_setshow_enum_cmd
   (const char *name, command_class theclass, const char *const *enumlist,
    const char **var, const char *set_doc, const char *show_doc,
@@ -748,6 +782,20 @@ extern set_show_commands add_setshow_opt
    cmd_list_element **show_list);
 
 extern set_show_commands add_setshow_integer_cmd
+  (const char *name, command_class theclass, int *var,
+   const literal_def *extra_literals, const char *set_doc,
+   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
+   show_value_ftype *show_func, cmd_list_element **set_list,
+   cmd_list_element **show_list);
+
+extern set_show_commands add_setshow_integer_cmd
+  (const char *name, command_class theclass, const literal_def *extra_literals,
+   const char *set_doc, const char *show_doc, const char *help_doc,
+   setting_func_types<int>::set set_func,
+   setting_func_types<int>::get get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
+extern set_show_commands add_setshow_integer_cmd
   (const char *name, command_class theclass, int *var, const char *set_doc,
    const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
    show_value_ftype *show_func, cmd_list_element **set_list,
@@ -760,6 +808,34 @@ extern set_show_commands add_setshow_int
    setting_func_types<int>::get get_func, show_value_ftype *show_func,
    cmd_list_element **set_list, cmd_list_element **show_list);
 
+extern set_show_commands add_setshow_pinteger_cmd
+  (const char *name, command_class theclass, int *var,
+   const literal_def *extra_literals, const char *set_doc,
+   const char *show_doc, const char *help_doc, cmd_func_ftype *set_func,
+   show_value_ftype *show_func, cmd_list_element **set_list,
+   cmd_list_element **show_list);
+
+extern set_show_commands add_setshow_pinteger_cmd
+  (const char *name, command_class theclass, const literal_def *extra_literals,
+   const char *set_doc, const char *show_doc, const char *help_doc,
+   setting_func_types<int>::set set_func,
+   setting_func_types<int>::get get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
+extern set_show_commands add_setshow_uinteger_cmd
+  (const char *name, command_class theclass, unsigned int *var,
+   const literal_def *extra_literals,
+   const char *set_doc, const char *show_doc, const char *help_doc,
+   cmd_func_ftype *set_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
+extern set_show_commands add_setshow_uinteger_cmd
+  (const char *name, command_class theclass, const literal_def *extra_literals,
+   const char *set_doc, const char *show_doc, const char *help_doc,
+   setting_func_types<unsigned int>::set set_func,
+   setting_func_types<unsigned int>::get get_func, show_value_ftype *show_func,
+   cmd_list_element **set_list, cmd_list_element **show_list);
+
 extern set_show_commands add_setshow_uinteger_cmd
   (const char *name, command_class theclass, unsigned int *var,
    const char *set_doc, const char *show_doc, const char *help_doc,
Index: src/gdb/guile/scm-param.c
===================================================================
--- src.orig/gdb/guile/scm-param.c
+++ src/gdb/guile/scm-param.c
@@ -117,18 +117,33 @@ struct param_smob
 static setting
 make_setting (param_smob *s)
 {
-  if (var_type_uses<bool> (s->type))
-    return setting (s->type, &s->value.boolval);
-  else if (var_type_uses<int> (s->type))
-    return setting (s->type, &s->value.intval);
-  else if (var_type_uses<auto_boolean> (s->type))
-    return setting (s->type, &s->value.autoboolval);
-  else if (var_type_uses<unsigned int> (s->type))
-    return setting (s->type, &s->value.uintval);
-  else if (var_type_uses<std::string> (s->type))
-    return setting (s->type, s->value.stringval);
-  else if (var_type_uses<const char *> (s->type))
-    return setting (s->type, &s->value.cstringval);
+  enum var_types type = s->type;
+
+  switch (type)
+    {
+    case var_zinteger:
+      type = var_integer;
+      break;
+    case var_zuinteger:
+      type = var_uinteger;
+      break;
+    case var_zuinteger_unlimited:
+      type = var_pinteger;
+      break;
+    }
+
+  if (var_type_uses<bool> (type))
+    return setting (type, &s->value.boolval);
+  else if (var_type_uses<int> (type))
+    return setting (type, &s->value.intval);
+  else if (var_type_uses<auto_boolean> (type))
+    return setting (type, &s->value.autoboolval);
+  else if (var_type_uses<unsigned int> (type))
+    return setting (type, &s->value.uintval);
+  else if (var_type_uses<std::string> (type))
+    return setting (type, s->value.stringval);
+  else if (var_type_uses<const char *> (type))
+    return setting (type, &s->value.cstringval);
   else
     gdb_assert_not_reached ("unhandled var type");
 }
@@ -588,10 +603,6 @@ pascm_param_type_name (enum var_types pa
 static SCM
 pascm_param_value (const setting &var, int arg_pos, const char *func_name)
 {
-  /* Note: We *could* support var_integer here in case someone is trying to get
-     the value of a Python-created parameter (which is the only place that
-     still supports var_integer).  To further discourage its use we do not.  */
-
   switch (var.type ())
     {
     case var_string:
@@ -631,20 +642,35 @@ pascm_param_value (const setting &var, i
 	  return auto_keyword;
       }
 
-    case var_zuinteger_unlimited:
-      if (var.get<int> () == -1)
-	return unlimited_keyword;
-      gdb_assert (var.get<int> () >= 0);
-      /* Fall through.  */
-    case var_zinteger:
-      return scm_from_int (var.get<int> ());
-
     case var_uinteger:
-      if (var.get<unsigned int> ()== UINT_MAX)
-	return unlimited_keyword;
-      /* Fall through.  */
-    case var_zuinteger:
-      return scm_from_uint (var.get<unsigned int> ());
+    case var_integer:
+    case var_pinteger:
+      {
+	LONGEST value
+	  = (var.type () == var_uinteger
+	     ? static_cast<LONGEST> (var.get<unsigned int> ())
+	     : static_cast<LONGEST> (var.get<int> ()));
+
+	bool literal = false;
+	if (var.extra_literals () != nullptr)
+	  for (const literal_def *l = var.extra_literals ();
+	       l->literal != nullptr;
+	       l++)
+	    if (value == l->use)
+	      {
+		if (strcmp (l->literal, "unlimited") == 0)
+		  return unlimited_keyword;
+		value = l->val;
+		literal = true;
+	      }
+	if (var.type () == var_pinteger && !literal)
+	  gdb_assert (value >= 0);
+
+	if (var.type () == var_uinteger)
+	  return scm_from_uint (static_cast<const unsigned int> (value));
+	else
+	  return scm_from_int (static_cast<const int> (value));
+      }
 
     default:
       break;
@@ -666,14 +692,14 @@ pascm_set_param_value_x (param_smob *p_s
 {
   setting var = make_setting (p_smob);
 
-  switch (var.type ())
+  switch (p_smob->type)
     {
     case var_string:
     case var_string_noescape:
     case var_optional_filename:
     case var_filename:
       SCM_ASSERT_TYPE (scm_is_string (value)
-		       || (var.type () != var_filename
+		       || (p_smob->type != var_filename
 			   && gdbscm_is_false (value)),
 		       value, arg_pos, func_name,
 		       _("string or #f for non-PARAM_FILENAME parameters"));
@@ -739,8 +765,8 @@ pascm_set_param_value_x (param_smob *p_s
     case var_uinteger:
     case var_zuinteger:
     case var_zuinteger_unlimited:
-      if (var.type () == var_uinteger
-	  || var.type () == var_zuinteger_unlimited)
+      if (p_smob->type == var_uinteger
+	  || p_smob->type == var_zuinteger_unlimited)
 	{
 	  SCM_ASSERT_TYPE (gdbscm_is_bool (value)
 			   || scm_is_eq (value, unlimited_keyword),
@@ -748,7 +774,7 @@ pascm_set_param_value_x (param_smob *p_s
 			   _("integer or #:unlimited"));
 	  if (scm_is_eq (value, unlimited_keyword))
 	    {
-	      if (var.type () == var_uinteger)
+	      if (p_smob->type == var_uinteger)
 		var.set<unsigned int> (UINT_MAX);
 	      else
 		var.set<int> (-1);
@@ -761,12 +787,12 @@ pascm_set_param_value_x (param_smob *p_s
 			   _("integer"));
 	}
 
-      if (var.type () == var_uinteger
-	  || var.type () == var_zuinteger)
+      if (p_smob->type == var_uinteger
+	  || p_smob->type == var_zuinteger)
 	{
 	  unsigned int u = scm_to_uint (value);
 
-	  if (var.type () == var_uinteger && u == 0)
+	  if (p_smob->type == var_uinteger && u == 0)
 	    u = UINT_MAX;
 	  var.set<unsigned int> (u);
 	}
@@ -774,7 +800,7 @@ pascm_set_param_value_x (param_smob *p_s
 	{
 	  int i = scm_to_int (value);
 
-	  if (var.type () == var_zuinteger_unlimited && i < -1)
+	  if (p_smob->type == var_zuinteger_unlimited && i < -1)
 	    {
 	      gdbscm_out_of_range_error (func_name, arg_pos, value,
 					 _("must be >= -1"));
Index: src/gdb/maint-test-options.c
===================================================================
--- src.orig/gdb/maint-test-options.c
+++ src/gdb/maint-test-options.c
@@ -207,6 +207,7 @@ static const gdb::option::option_def tes
   gdb::option::uinteger_option_def<test_options_opts> {
     "uinteger",
     [] (test_options_opts *opts) { return &opts->uint_opt; },
+    uinteger_unlimited_literals,
     nullptr, /* show_cmd_cb */
     N_("A uinteger option."),
     nullptr, /* show_doc */
@@ -214,9 +215,10 @@ static const gdb::option::option_def tes
   },
 
   /* A zuinteger_unlimited option.  */
-  gdb::option::zuinteger_unlimited_option_def<test_options_opts> {
+  gdb::option::integer_option_def<test_options_opts> {
     "zuinteger-unlimited",
     [] (test_options_opts *opts) { return &opts->zuint_unl_opt; },
+    zuinteger_unlimited_literals,
     nullptr, /* show_cmd_cb */
     N_("A zuinteger-unlimited option."),
     nullptr, /* show_doc */
Index: src/gdb/python/py-param.c
===================================================================
--- src.orig/gdb/python/py-param.c
+++ src/gdb/python/py-param.c
@@ -96,18 +96,33 @@ struct parmpy_object
 static setting
 make_setting (parmpy_object *s)
 {
-  if (var_type_uses<bool> (s->type))
-    return setting (s->type, &s->value.boolval);
-  else if (var_type_uses<int> (s->type))
-    return setting (s->type, &s->value.intval);
-  else if (var_type_uses<auto_boolean> (s->type))
-    return setting (s->type, &s->value.autoboolval);
-  else if (var_type_uses<unsigned int> (s->type))
-    return setting (s->type, &s->value.uintval);
-  else if (var_type_uses<std::string> (s->type))
-    return setting (s->type, s->value.stringval);
-  else if (var_type_uses<const char *> (s->type))
-    return setting (s->type, &s->value.cstringval);
+  enum var_types type = s->type;
+
+  switch (type)
+    {
+    case var_zinteger:
+      type = var_integer;
+      break;
+    case var_zuinteger:
+      type = var_uinteger;
+      break;
+    case var_zuinteger_unlimited:
+      type = var_pinteger;
+      break;
+    }
+
+  if (var_type_uses<bool> (type))
+    return setting (type, &s->value.boolval);
+  else if (var_type_uses<int> (type))
+    return setting (type, &s->value.intval);
+  else if (var_type_uses<auto_boolean> (type))
+    return setting (type, &s->value.autoboolval);
+  else if (var_type_uses<unsigned int> (type))
+    return setting (type, &s->value.uintval);
+  else if (var_type_uses<std::string> (type))
+    return setting (type, s->value.stringval);
+  else if (var_type_uses<const char *> (type))
+    return setting (type, &s->value.cstringval);
   else
     gdb_assert_not_reached ("unhandled var type");
 }
Index: src/gdb/python/python.c
===================================================================
--- src.orig/gdb/python/python.c
+++ src/gdb/python/python.c
@@ -502,35 +502,34 @@ gdbpy_parameter_value (const setting &va
 	  Py_RETURN_NONE;
       }
 
-    case var_integer:
-      if (var.get<int> () == INT_MAX)
-	Py_RETURN_NONE;
-      /* Fall through.  */
-    case var_zinteger:
-      return gdb_py_object_from_longest (var.get<int> ()).release ();
-
-    case var_zuinteger_unlimited:
-      {
-	int val = var.get<int> ();
-
-	if (val == -1)
-	  Py_RETURN_NONE;
-	return gdb_py_object_from_longest (val).release ();
-      }
-
     case var_uinteger:
+    case var_integer:
+    case var_pinteger:
       {
-	unsigned int val = var.get<unsigned int> ();
+	LONGEST value
+	  = (var.type () == var_uinteger
+	     ? static_cast<LONGEST> (var.get<unsigned int> ())
+	     : static_cast<LONGEST> (var.get<int> ()));
 
-	if (val == UINT_MAX)
-	  Py_RETURN_NONE;
-	return gdb_py_object_from_ulongest (val).release ();
-      }
+	if (var.extra_literals () != nullptr)
+	  for (const literal_def *l = var.extra_literals ();
+	       l->literal != nullptr;
+	       l++)
+	    if (value == l->use)
+	      {
+		if (strcmp (l->literal, "unlimited") == 0)
+		  Py_RETURN_NONE;
+		value = l->val;
+	      }
 
-    case var_zuinteger:
-      {
-	unsigned int val = var.get<unsigned int> ();
-	return gdb_py_object_from_ulongest (val).release ();
+	if (var.type () == var_uinteger)
+	  return
+	    gdb_py_object_from_ulongest
+	      (static_cast<const unsigned int> (value)).release ();
+	else
+	  return
+	    gdb_py_object_from_longest
+	      (static_cast<const int> (value)).release ();
       }
     }
 
Index: src/gdb/valprint.c
===================================================================
--- src.orig/gdb/valprint.c
+++ src/gdb/valprint.c
@@ -2974,8 +2974,8 @@ using boolean_option_def
   = gdb::option::boolean_option_def<value_print_options>;
 using uinteger_option_def
   = gdb::option::uinteger_option_def<value_print_options>;
-using zuinteger_unlimited_option_def
-  = gdb::option::zuinteger_unlimited_option_def<value_print_options>;
+using integer_option_def
+  = gdb::option::integer_option_def<value_print_options>;
 
 /* Definitions of options for the "print" and "compile print"
    commands.  */
@@ -3011,15 +3011,17 @@ static const gdb::option::option_def val
   uinteger_option_def {
     "elements",
     [] (value_print_options *opt) { return &opt->print_max; },
+    uinteger_unlimited_literals,
     show_print_max, /* show_cmd_cb */
     N_("Set limit on string chars or array elements to print."),
     N_("Show limit on string chars or array elements to print."),
     N_("\"unlimited\" causes there to be no limit."),
   },
 
-  zuinteger_unlimited_option_def {
+  integer_option_def {
     "max-depth",
     [] (value_print_options *opt) { return &opt->max_depth; },
+    zuinteger_unlimited_literals,
     show_print_max_depth, /* show_cmd_cb */
     N_("Set maximum print depth for nested structures, unions and arrays."),
     N_("Show maximum print depth for nested structures, unions, and arrays."),
@@ -3079,6 +3081,7 @@ pretty-printers for that value.")
   uinteger_option_def {
     "repeats",
     [] (value_print_options *opt) { return &opt->repeat_count_threshold; },
+    uinteger_unlimited_literals,
     show_repeat_count_threshold, /* show_cmd_cb */
     N_("Set threshold for repeated print elements."),
     N_("Show threshold for repeated print elements."),

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6 7/8] GDB: Add a character string limiting option
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (5 preceding siblings ...)
  2022-08-17 22:04 ` [PATCH v6 6/8] GDB: Allow arbitrary keywords in integer set commands Maciej W. Rozycki
@ 2022-08-17 22:05 ` Maciej W. Rozycki
  2022-08-17 22:05 ` [PATCH v6 8/8] GDB/testsuite: Expand for character string limiting options Maciej W. Rozycki
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:05 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

From: Andrew Burgess <andrew.burgess@embecosm.com>

This commit splits the `set/show print elements' option into two.  We 
retain `set/show print elements' for controlling how many elements of an 
array we print, but a new `set/show print characters' setting is added 
which is used for controlling how many characters of a string are 
printed.

The motivation behind this change is to allow users a finer level of 
control over how data is printed, reflecting that, although strings can 
be thought of as arrays of characters, users often want to treat these 
two things differently.

For compatibility reasons by default the `set/show print characters' 
option is set to `elements', which makes the limit for character strings 
follow the setting of the `set/show print elements' option, as it used 
to.  Using `set print characters' with any other value makes the limit 
independent from the `set/show print elements' setting, however it can 
be restored to the default with the `set print characters elements' 
command at any time.

A corresponding `-characters' option for the `print' command is added, 
with the same semantics, i.e. one can use `elements' to make a given 
`print' invocation follow the limit of elements, be it set with the 
`-elements' option also given with the same invocation or taken from the 
`set/show print elements' setting, for characters as well regardless of 
the current setting of the `set/show print characters' option.

The GDB changes are all pretty straightforward, just changing references 
to the old 'print_max' to use a new `get_print_max_chars' helper which 
figures out which of the two of `print_max' and `print_max_chars' values 
to use.

Likewise, the documentation is just updated to reference the new setting 
where appropriate.

To make people's life easier the message shown by `show print elements' 
now indicates if the setting also applies to character strings:

(gdb) set print characters elements
(gdb) show print elements
Limit on string chars or array elements to print is 200.
(gdb) set print characters unlimited
(gdb) show print elements
Limit on array elements to print is 200.
(gdb) 

which keeps it the same as it used to be, although in other contexts the 
setting is described as applying to array elements only, e.g.:

(gdb) help set print elements
Set limit on array elements to print.
"unlimited" causes there to be no limit.
(gdb) 

In the testsuite there are two minor updates, one to add `-characters' 
to the list of completions now shown for the `print' command, and a bare 
minimum pair of checks for the right handling of `set print characters' 
and `show print characters', copied from the corresponding checks for 
`set print elements' and `show print elements' respectively.

Co-Authored-By: Maciej W. Rozycki <macro@embecosm.com>
---
Changes from v5:

- Allow the use of `set print characters 0' to stand for `unlimited', and 
  likewise via the corresponding Guile and Python APIs.

- Define PRINT_MAX_CHARS_ELEMENTS and PRINT_MAX_CHARS_UNLIMITED macros 
  and use them throughout instead of hardcoded 0/UINT_MAX, making it 
  easier to track usage.

Changes from v4:

- Move the NEWS entry past GDB 12 and describe `print -characters LIMIT'
  separately.

- Clarify the effect on multi-byte and wide character strings in the 
  manual (borrowing from the original NEWS entry that added support for 
  them).

- Fix issues with `@ref' and `@xref' usage in the manual.

Changes from v3:

- Rewrite in terms of flexible literal keyword handling added with 6/8.

- Add a `set print characters elements' setting, which is also the 
  default, to make the string character limit follow that for array 
  elements in backwards-compatible manner.

- Update documentation accordingly.

- Remove testsuite updates delegated to 8/8, guaranteeing that the new 
  command does not influence any preexisting environment (except for 
  obvious cases where it is expected, such as command completion or help 
  messages).

- Amend gdb.base/options.exp for the added completion for `print' 
  command's `-characters' option.

- Expand gdb.base/default.exp with minimal test cases for `set/show print 
  characters'.

Changes from v2:

- Place the new and the changed command at the right places each in NEWS.

Changes from v1:

- Rename `print_smax' setting throughout to `print_max_chars', and
  likewise `show_print_smax' function to `show_print_max_chars'.

- Document the Python part in the manual.

- Update comments for `print_max' and `print_max_chars' in
  `value_print_options'.

- Fix some typos.
---
 gdb/NEWS                           |   14 ++++++
 gdb/ada-valprint.c                 |    6 +-
 gdb/c-lang.c                       |    4 -
 gdb/c-valprint.c                   |    5 +-
 gdb/doc/gdb.texinfo                |   44 +++++++++++++++++--
 gdb/doc/python.texi                |    5 ++
 gdb/language.h                     |    2 
 gdb/m2-lang.c                      |    3 -
 gdb/m2-valprint.c                  |    4 +
 gdb/p-lang.c                       |    3 -
 gdb/p-valprint.c                   |    9 ++-
 gdb/printcmd.c                     |    9 ++-
 gdb/python/py-value.c              |    4 +
 gdb/testsuite/gdb.base/default.exp |    7 +++
 gdb/testsuite/gdb.base/options.exp |    1 
 gdb/tracepoint.c                   |    4 -
 gdb/valprint.c                     |   84 ++++++++++++++++++++++++++++---------
 gdb/valprint.h                     |   26 +++++++++--
 18 files changed, 185 insertions(+), 49 deletions(-)

gdb-aburgess-print-elements-characters.diff
Index: src/gdb/NEWS
===================================================================
--- src.orig/gdb/NEWS
+++ src/gdb/NEWS
@@ -91,6 +91,20 @@ show style disassembler symbol
   The 'disassembler address' and 'disassembler symbol' styles are
   aliases for the 'address' and 'function' styles respectively.
 
+set print characters LIMIT
+show print characters
+  This new setting is like 'set print elements', but controls how many
+  characters of a string are printed.  This functionality used to be
+  covered by 'set print elements', but it can be controlled separately
+  now.  LIMIT can be set to a numerical value to request that particular
+  character count, to 'unlimited' to print all characters of a string,
+  or to 'elements', which is also the default, to follow the setting of
+ 'set print elements' as it used to be.
+
+print -characters LIMIT
+  This new option to the 'print' command has the same effect as a temporary
+  use of 'set print characters'.
+
 * Changed commands
 
 maintenance info line-table
Index: src/gdb/ada-valprint.c
===================================================================
--- src.orig/gdb/ada-valprint.c
+++ src/gdb/ada-valprint.c
@@ -470,7 +470,8 @@ printstr (struct ui_file *stream, struct
       return;
     }
 
-  for (i = 0; i < length && things_printed < options->print_max; i += 1)
+  unsigned int print_max_chars = get_print_max_chars (options);
+  for (i = 0; i < length && things_printed < print_max_chars; i += 1)
     {
       /* Position of the character we are examining
 	 to see whether it is repeated.  */
@@ -706,12 +707,13 @@ ada_val_print_string (struct type *type,
      elements up to it.  */
   if (options->stop_print_at_null)
     {
+      unsigned int print_max_chars = get_print_max_chars (options);
       int temp_len;
 
       /* Look for a NULL char.  */
       for (temp_len = 0;
 	   (temp_len < len
-	    && temp_len < options->print_max
+	    && temp_len < print_max_chars
 	    && char_at (valaddr + offset_aligned,
 			temp_len, eltlen, byte_order) != 0);
 	   temp_len += 1);
Index: src/gdb/c-lang.c
===================================================================
--- src.orig/gdb/c-lang.c
+++ src/gdb/c-lang.c
@@ -185,8 +185,8 @@ language_defn::printchar (int c, struct
 /* Print the character string STRING, printing at most LENGTH
    characters.  LENGTH is -1 if the string is nul terminated.  Each
    character is WIDTH bytes long.  Printing stops early if the number
-   hits print_max; repeat counts are printed as appropriate.  Print
-   ellipses at the end if we had to stop before printing LENGTH
+   hits print_max_chars; repeat counts are printed as appropriate.
+   Print ellipses at the end if we had to stop before printing LENGTH
    characters, or if FORCE_ELLIPSES.  */
 
 void
Index: src/gdb/c-valprint.c
===================================================================
--- src.orig/gdb/c-valprint.c
+++ src/gdb/c-valprint.c
@@ -267,11 +267,12 @@ c_value_print_array (struct value *val,
 	     print elements up to it.  */
 	  if (options->stop_print_at_null)
 	    {
+	      unsigned int print_max_chars = get_print_max_chars (options);
 	      unsigned int temp_len;
 
 	      for (temp_len = 0;
 		   (temp_len < len
-		    && temp_len < options->print_max
+		    && temp_len < print_max_chars
 		    && extract_unsigned_integer (valaddr + temp_len * eltlen,
 						 eltlen, byte_order) != 0);
 		   ++temp_len)
@@ -280,7 +281,7 @@ c_value_print_array (struct value *val,
 	      /* Force printstr to print ellipses if
 		 we've printed the maximum characters and
 		 the next character is not \000.  */
-	      if (temp_len == options->print_max && temp_len < len)
+	      if (temp_len == print_max_chars && temp_len < len)
 		{
 		  ULONGEST ival
 		    = extract_unsigned_integer (valaddr + temp_len * eltlen,
Index: src/gdb/doc/gdb.texinfo
===================================================================
--- src.orig/gdb/doc/gdb.texinfo
+++ src/gdb/doc/gdb.texinfo
@@ -10180,10 +10180,18 @@ Related setting: @ref{set print array}.
 Set printing of array indexes.
 Related setting: @ref{set print array-indexes}.
 
-@item -elements @var{number-of-elements}|@code{unlimited}
-Set limit on string chars or array elements to print.  The value
+@item -characters @var{number-of-characters}|@code{elements}|@code{unlimited}
+Set limit on string characters to print.  The value @code{elements}
+causes the limit on array elements to print to be used.  The value
 @code{unlimited} causes there to be no limit.  Related setting:
-@ref{set print elements}.
+@ref{set print characters}.
+
+@item -elements @var{number-of-elements}|@code{unlimited}
+Set limit on array elements and optionally string characters to print.
+See @ref{set print characters}, and the @code{-characters} option above
+for when this option applies to strings.  The value @code{unlimited}
+causes there to be no limit.  @xref{set print elements}, for a related
+CLI command.
 
 @item -max-depth @var{depth}|@code{unlimited}
 Set the threshold after which nested structures are replaced with
@@ -11580,6 +11588,31 @@ Don't printing binary values in groups.
 @item show print nibbles
 Show whether to print binary values in groups of four bits.
 
+@anchor{set print characters}
+@item set print characters @var{number-of-characters}
+@itemx set print characters elements
+@itemx set print characters unlimited
+@cindex number of string characters to print
+@cindex limit on number of printed string characters
+Set a limit on how many characters of a string @value{GDBN} will print.
+If @value{GDBN} is printing a large string, it stops printing after it
+has printed the number of characters set by the @code{set print
+characters} command.  This equally applies to multi-byte and wide
+character strings, that is for strings whose character type is
+@code{wchar_t}, @code{char16_t}, or @code{char32_t} it is the number of
+actual characters rather than underlying bytes the encoding uses that
+this setting controls.
+Setting @var{number-of-characters} to @code{elements} means that the
+limit on the number of characters to print follows one for array
+elements; see @ref{set print elements}.
+Setting @var{number-of-characters} to @code{unlimited} means that the
+number of characters to print is unlimited.
+When @value{GDBN} starts, this limit is set to @code{elements}.
+
+@item show print characters
+Display the number of characters of a large string that @value{GDBN}
+will print.
+
 @anchor{set print elements}
 @item set print elements @var{number-of-elements}
 @itemx set print elements unlimited
@@ -11588,7 +11621,8 @@ Show whether to print binary values in g
 Set a limit on how many elements of an array @value{GDBN} will print.
 If @value{GDBN} is printing a large array, it stops printing after it has
 printed the number of elements set by the @code{set print elements} command.
-This limit also applies to the display of strings.
+By default this limit also applies to the display of strings; see
+@ref{set print characters}.
 When @value{GDBN} starts, this limit is set to 200.
 Setting @var{number-of-elements} to @code{unlimited} or zero means
 that the number of elements to print is unlimited.
@@ -15101,7 +15135,7 @@ The optional @var{mods} changes the usua
 @code{s} requests that pointers to chars be handled as strings, in
 particular collecting the contents of the memory being pointed at, up
 to the first zero.  The upper bound is by default the value of the
-@code{print elements} variable; if @code{s} is followed by a decimal
+@code{print characters} variable; if @code{s} is followed by a decimal
 number, that is the upper bound instead.  So for instance
 @samp{collect/s25 mystr} collects as many as 25 characters at
 @samp{mystr}.
Index: src/gdb/doc/python.texi
===================================================================
--- src.orig/gdb/doc/python.texi
+++ src/gdb/doc/python.texi
@@ -1135,6 +1135,11 @@ the @emph{declared} type should be used.
 representation of a C@t{++} object, @code{False} if they shouldn't (see
 @code{set print static-members} in @ref{Print Settings}).
 
+@item max_characters
+Number of string characters to print, @code{0} to follow
+@code{max_elements}, or @code{UINT_MAX} to print an unlimited number
+of characters (see @code{set print characters} in @ref{Print Settings}).
+
 @item max_elements
 Number of array elements to print, or @code{0} to print an unlimited
 number of elements (see @code{set print elements} in @ref{Print
Index: src/gdb/language.h
===================================================================
--- src.orig/gdb/language.h
+++ src/gdb/language.h
@@ -541,7 +541,7 @@ struct language_defn
 			  struct ui_file * stream) const;
 
 /* Print the character string STRING, printing at most LENGTH characters.
-   Printing stops early if the number hits print_max; repeat counts
+   Printing stops early if the number hits print_max_chars; repeat counts
    are printed as appropriate.  Print ellipses at the end if we
    had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.  */
 
Index: src/gdb/m2-lang.c
===================================================================
--- src.orig/gdb/m2-lang.c
+++ src/gdb/m2-lang.c
@@ -169,7 +169,8 @@ m2_language::printstr (struct ui_file *s
       return;
     }
 
-  for (i = 0; i < length && things_printed < options->print_max; ++i)
+  unsigned int print_max_chars = get_print_max_chars (options);
+  for (i = 0; i < length && things_printed < print_max_chars; ++i)
     {
       /* Position of the character we are examining
 	 to see whether it is repeated.  */
Index: src/gdb/m2-valprint.c
===================================================================
--- src.orig/gdb/m2-valprint.c
+++ src/gdb/m2-valprint.c
@@ -327,12 +327,14 @@ m2_language::value_print_inner (struct v
 		 elements up to it.  */
 	      if (options->stop_print_at_null)
 		{
+		  unsigned int print_max_chars = get_print_max_chars (options);
 		  unsigned int temp_len;
 
 		  /* Look for a NULL char.  */
 		  for (temp_len = 0;
 		       (valaddr[temp_len]
-			&& temp_len < len && temp_len < options->print_max);
+			&& temp_len < len
+			&& temp_len < print_max_chars);
 		       temp_len++);
 		  len = temp_len;
 		}
Index: src/gdb/p-lang.c
===================================================================
--- src.orig/gdb/p-lang.c
+++ src/gdb/p-lang.c
@@ -253,7 +253,8 @@ pascal_language::printstr (struct ui_fil
       return;
     }
 
-  for (i = 0; i < length && things_printed < options->print_max; ++i)
+  unsigned int print_max_chars = get_print_max_chars (options);
+  for (i = 0; i < length && things_printed < print_max_chars; ++i)
     {
       /* Position of the character we are examining
 	 to see whether it is repeated.  */
Index: src/gdb/p-valprint.c
===================================================================
--- src.orig/gdb/p-valprint.c
+++ src/gdb/p-valprint.c
@@ -105,13 +105,16 @@ pascal_language::value_print_inner (stru
 		   elements up to it.  */
 		if (options->stop_print_at_null)
 		  {
+		    unsigned int print_max_chars
+		      = get_print_max_chars (options);
 		    unsigned int temp_len;
 
 		    /* Look for a NULL char.  */
 		    for (temp_len = 0;
-			 extract_unsigned_integer (valaddr + temp_len * eltlen,
-						   eltlen, byte_order)
-			   && temp_len < len && temp_len < options->print_max;
+			 (extract_unsigned_integer
+			    (valaddr + temp_len * eltlen, eltlen, byte_order)
+			  && temp_len < len
+			  && temp_len < print_max_chars);
 			 temp_len++);
 		    len = temp_len;
 		  }
Index: src/gdb/printcmd.c
===================================================================
--- src.orig/gdb/printcmd.c
+++ src/gdb/printcmd.c
@@ -957,17 +957,18 @@ find_string_backward (struct gdbarch *gd
 					 chars_to_read * char_size);
       chars_read /= char_size;
       read_error = (chars_read == chars_to_read) ? 0 : 1;
+      unsigned int print_max_chars = get_print_max_chars (options);
       /* Searching for '\0' from the end of buffer in backward direction.  */
       for (i = 0; i < chars_read && count > 0 ; ++i, ++chars_counted)
 	{
 	  int offset = (chars_to_read - i - 1) * char_size;
 
 	  if (integer_is_zero (&buffer[offset], char_size)
-	      || chars_counted == options->print_max)
+	      || chars_counted == print_max_chars)
 	    {
-	      /* Found '\0' or reached print_max.  As OFFSET is the offset to
-		 '\0', we add CHAR_SIZE to return the start address of
-		 a string.  */
+	      /* Found '\0' or reached `print_max_chars'.  As OFFSET
+		 is the offset to '\0', we add CHAR_SIZE to return
+		 the start address of a string.  */
 	      --count;
 	      string_start_addr = addr + offset + char_size;
 	      chars_counted = 0;
Index: src/gdb/python/py-value.c
===================================================================
--- src.orig/gdb/python/py-value.c
+++ src/gdb/python/py-value.c
@@ -647,6 +647,7 @@ valpy_format_string (PyObject *self, PyO
       "actual_objects",		/* See set print object on|off.  */
       "static_members",		/* See set print static-members on|off.  */
       /* C non-bool options.  */
+      "max_characters", 	/* See set print characters N.  */
       "max_elements", 		/* See set print elements N.  */
       "max_depth",		/* See set print max-depth N.  */
       "repeat_threshold",	/* See set print repeats.  */
@@ -695,7 +696,7 @@ valpy_format_string (PyObject *self, PyO
   char *format = NULL;
   if (!gdb_PyArg_ParseTupleAndKeywords (args,
 					kw,
-					"|O!O!O!O!O!O!O!O!O!O!O!O!O!IIIs",
+					"|O!O!O!O!O!O!O!O!O!O!O!O!O!IIIIs",
 					keywords,
 					&PyBool_Type, &raw_obj,
 					&PyBool_Type, &pretty_arrays_obj,
@@ -710,6 +711,7 @@ valpy_format_string (PyObject *self, PyO
 					&PyBool_Type, &deref_refs_obj,
 					&PyBool_Type, &actual_objects_obj,
 					&PyBool_Type, &static_members_obj,
+					&opts.print_max_chars,
 					&opts.print_max,
 					&opts.max_depth,
 					&opts.repeat_count_threshold,
Index: src/gdb/testsuite/gdb.base/default.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/default.exp
+++ src/gdb/testsuite/gdb.base/default.exp
@@ -522,6 +522,10 @@ gdb_test_no_output "set print address" "
 gdb_test_no_output "set print array" "set print array"
 #test set print asm-demangle
 gdb_test_no_output "set print asm-demangle" "set print asm-demangle"
+#test set print characters
+gdb_test "set print characters" \
+	 "Argument required \\(integer to set it to, or one of:\
+	  \"elements\", \"unlimited\"\\)\\."
 #test set print demangle
 gdb_test_no_output "set print demangle" "set print demangle"
 #test set print elements
@@ -665,6 +669,9 @@ gdb_test "show print address" "Printing
 gdb_test "show print array" "Pretty formatting of arrays is on."
 #test show print asm-demangle
 gdb_test "show print asm-demangle" "Demangling of C\[+\]+/ObjC names in disassembly listings is on."
+#test show print characters
+gdb_test "show print characters" \
+	 "Limit on string characters to print is elements\\."
 #test show print demangle
 gdb_test "show print demangle" "Demangling of encoded C\[+\]+/ObjC names when displaying symbols is on."
 #test show print elements
Index: src/gdb/testsuite/gdb.base/options.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/options.exp
+++ src/gdb/testsuite/gdb.base/options.exp
@@ -171,6 +171,7 @@ proc_with_prefix test-print {{prefix ""}
 	"-address"
 	"-array"
 	"-array-indexes"
+	"-characters"
 	"-elements"
 	"-max-depth"
 	"-memory-tag-violations"
Index: src/gdb/tracepoint.c
===================================================================
--- src.orig/gdb/tracepoint.c
+++ src/gdb/tracepoint.c
@@ -541,9 +541,9 @@ decode_agent_options (const char *exp, i
       if (target_supports_string_tracing ())
 	{
 	  /* Allow an optional decimal number giving an explicit maximum
-	     string length, defaulting it to the "print elements" value;
+	     string length, defaulting it to the "print characters" value;
 	     so "collect/s80 mystr" gets at most 80 bytes of string.  */
-	  *trace_string = opts.print_max;
+	  *trace_string = get_print_max_chars (&opts);
 	  exp++;
 	  if (*exp >= '0' && *exp <= '9')
 	    *trace_string = atoi (exp);
Index: src/gdb/valprint.c
===================================================================
--- src.orig/gdb/valprint.c
+++ src/gdb/valprint.c
@@ -94,8 +94,14 @@ static void val_print_type_code_flags (s
 				       int embedded_offset,
 				       struct ui_file *stream);
 
-#define PRINT_MAX_DEFAULT 200	/* Start print_max off at this value.  */
-#define PRINT_MAX_DEPTH_DEFAULT 20	/* Start print_max_depth off at this value. */
+/* Start print_max at this value.  */
+#define PRINT_MAX_DEFAULT 200
+
+/* Start print_max_chars at this value (meaning follow print_max).  */
+#define PRINT_MAX_CHARS_DEFAULT PRINT_MAX_CHARS_ELEMENTS
+
+/* Start print_max_depth at this value. */
+#define PRINT_MAX_DEPTH_DEFAULT 20
 
 struct value_print_options user_print_options =
 {
@@ -108,6 +114,7 @@ struct value_print_options user_print_op
   false,			/* nibblesprint */
   0,				/* objectprint */
   PRINT_MAX_DEFAULT,		/* print_max */
+  PRINT_MAX_CHARS_DEFAULT,	/* print_max_chars */
   10,				/* repeat_count_threshold */
   0,				/* output_format */
   0,				/* format */
@@ -149,17 +156,31 @@ get_formatted_print_options (struct valu
   opts->format = format;
 }
 
+/* Implement 'show print elements'.  */
+
 static void
 show_print_max (struct ui_file *file, int from_tty,
 		struct cmd_list_element *c, const char *value)
 {
+  gdb_printf
+    (file,
+     (user_print_options.print_max_chars != PRINT_MAX_CHARS_ELEMENTS
+      ? _("Limit on array elements to print is %s.\n")
+      : _("Limit on string chars or array elements to print is %s.\n")),
+     value);
+}
+
+/* Implement 'show print characters'.  */
+
+static void
+show_print_max_chars (struct ui_file *file, int from_tty,
+		      struct cmd_list_element *c, const char *value)
+{
   gdb_printf (file,
-	      _("Limit on string chars or array "
-		"elements to print is %s.\n"),
+	      _("Limit on string characters to print is %s.\n"),
 	      value);
 }
 
-
 /* Default input and output radixes, and output format letter.  */
 
 unsigned input_radix = 10;
@@ -2459,9 +2480,9 @@ print_converted_chars_to_obstack (struct
 /* Print the character string STRING, printing at most LENGTH
    characters.  LENGTH is -1 if the string is nul terminated.  TYPE is
    the type of each character.  OPTIONS holds the printing options;
-   printing stops early if the number hits print_max; repeat counts
-   are printed as appropriate.  Print ellipses at the end if we had to
-   stop before printing LENGTH characters, or if FORCE_ELLIPSES.
+   printing stops early if the number hits print_max_chars; repeat
+   counts are printed as appropriate.  Print ellipses at the end if we
+   had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.
    QUOTE_CHAR is the character to print at each end of the string.  If
    C_STYLE_TERMINATOR is true, and the last character is 0, then it is
    omitted.  */
@@ -2515,7 +2536,8 @@ generic_printstr (struct ui_file *stream
   /* Convert characters until the string is over or the maximum
      number of printed characters has been reached.  */
   i = 0;
-  while (i < options->print_max)
+  unsigned int print_max_chars = get_print_max_chars (options);
+  while (i < print_max_chars)
     {
       int r;
 
@@ -2567,7 +2589,7 @@ generic_printstr (struct ui_file *stream
 /* Print a string from the inferior, starting at ADDR and printing up to LEN
    characters, of WIDTH bytes a piece, to STREAM.  If LEN is -1, printing
    stops at the first null byte, otherwise printing proceeds (including null
-   bytes) until either print_max or LEN characters have been printed,
+   bytes) until either print_max_chars or LEN characters have been printed,
    whichever is smaller.  ENCODING is the name of the string's
    encoding.  It can be NULL, in which case the target encoding is
    assumed.  */
@@ -2589,15 +2611,17 @@ val_print_string (struct type *elttype,
   int width = TYPE_LENGTH (elttype);
 
   /* First we need to figure out the limit on the number of characters we are
-     going to attempt to fetch and print.  This is actually pretty simple.  If
-     LEN >= zero, then the limit is the minimum of LEN and print_max.  If
-     LEN is -1, then the limit is print_max.  This is true regardless of
-     whether print_max is zero, UINT_MAX (unlimited), or something in between,
-     because finding the null byte (or available memory) is what actually
-     limits the fetch.  */
+     going to attempt to fetch and print.  This is actually pretty simple.
+     If LEN >= zero, then the limit is the minimum of LEN and print_max_chars.
+     If LEN is -1, then the limit is print_max_chars.  This is true regardless
+     of whether print_max_chars is zero, UINT_MAX (unlimited), or something in
+     between, because finding the null byte (or available memory) is what
+     actually limits the fetch.  */
 
-  fetchlimit = (len == -1 ? options->print_max : std::min ((unsigned) len,
-							   options->print_max));
+  unsigned int print_max_chars = get_print_max_chars (options);
+  fetchlimit = (len == -1
+		? print_max_chars
+		: std::min ((unsigned) len, print_max_chars));
 
   err = target_read_string (addr, len, width, fetchlimit,
 			    &buffer, &bytes_read);
@@ -2842,6 +2866,15 @@ using uinteger_option_def
 using pinteger_option_def
   = gdb::option::pinteger_option_def<value_print_options>;
 
+/* Extra literals supported with the `set print characters' and
+   `print -characters' commands.  */
+static const literal_def print_characters_literals[] =
+  {
+    { "elements", PRINT_MAX_CHARS_ELEMENTS },
+    { "unlimited", PRINT_MAX_CHARS_UNLIMITED, 0 },
+    { nullptr }
+  };
+
 /* Definitions of options for the "print" and "compile print"
    commands.  */
 static const gdb::option::option_def value_print_option_defs[] = {
@@ -2883,12 +2916,23 @@ static const gdb::option::option_def val
   },
 
   uinteger_option_def {
+    "characters",
+    [] (value_print_options *opt) { return &opt->print_max_chars; },
+    print_characters_literals,
+    show_print_max_chars, /* show_cmd_cb */
+    N_("Set limit on string chars to print."),
+    N_("Show limit on string chars to print."),
+    N_("\"elements\" causes the array element limit to be used.\n"
+       "\"unlimited\" causes there to be no limit."),
+  },
+
+  uinteger_option_def {
     "elements",
     [] (value_print_options *opt) { return &opt->print_max; },
     uinteger_unlimited_literals,
     show_print_max, /* show_cmd_cb */
-    N_("Set limit on string chars or array elements to print."),
-    N_("Show limit on string chars or array elements to print."),
+    N_("Set limit on array elements to print."),
+    N_("Show limit on array elements to print."),
     N_("\"unlimited\" causes there to be no limit."),
   },
 
Index: src/gdb/valprint.h
===================================================================
--- src.orig/gdb/valprint.h
+++ src/gdb/valprint.h
@@ -51,12 +51,15 @@ struct value_print_options
      in its vtables.  */
   bool objectprint;
 
-  /* Maximum number of chars to print for a string pointer value or vector
-     contents, or UINT_MAX for no limit.  Note that "set print elements 0"
-     stores UINT_MAX in print_max, which displays in a show command as
-     "unlimited".  */
+  /* Maximum number of elements to print for vector contents, or UINT_MAX
+     for no limit.  Note that "set print elements 0" stores UINT_MAX in
+     print_max, which displays in a show command as "unlimited".  */
   unsigned int print_max;
 
+  /* Maximum number of string chars to print for a string pointer value,
+     zero if to follow the value of print_max, or UINT_MAX for no limit.  */
+  unsigned int print_max_chars;
+
   /* Print repeat counts if there are more than this many repetitions
      of an element in an array.  */
   unsigned int repeat_count_threshold;
@@ -105,6 +108,21 @@ struct value_print_options
   int max_depth;
 };
 
+/* The value to use for `print_max_chars' to follow `print_max'.  */
+#define PRINT_MAX_CHARS_ELEMENTS 0
+
+/* The value to use for `print_max_chars' for no limit.  */
+#define PRINT_MAX_CHARS_UNLIMITED UINT_MAX
+
+/* Return the character count limit for printing strings.  */
+
+static inline unsigned int
+get_print_max_chars (const struct value_print_options *options)
+{
+  return (options->print_max_chars != PRINT_MAX_CHARS_ELEMENTS
+	  ? options->print_max_chars : options->print_max);
+}
+
 /* Create an option_def_group for the value_print options, with OPTS
    as context.  */
 extern gdb::option::option_def_group make_value_print_options_def_group

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6 8/8] GDB/testsuite: Expand for character string limiting options
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (6 preceding siblings ...)
  2022-08-17 22:05 ` [PATCH v6 7/8] GDB: Add a character string limiting option Maciej W. Rozycki
@ 2022-08-17 22:05 ` Maciej W. Rozycki
  2022-08-18  0:07   ` [PATCH v6.1 " Maciej W. Rozycki
  2022-09-01 10:32 ` [PING][PATCH v6 0/8] gdb: split array and " Maciej W. Rozycki
                   ` (6 subsequent siblings)
  14 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-17 22:05 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

From: Andrew Burgess <andrew.burgess@embecosm.com>

Modify test cases that verify the operation of the array element limit 
with character strings such that they are executed twice, once with the 
`set print characters' option set to `elements' and the limit controlled 
with the `set print elements' option, and then again with the limit 
controlled with the `set print characters' option instead.  Similarly 
with the `-elements' and `-characters' options for the `print' command. 
Additionally verify that said `print' command options combined yield the 
expected result.

Add Guile and Python coverage for the `print characters' GDB setting.

There are new tests for Ada and Pascal, as the string printing code for 
these languages is different than the generic string printing code used 
by other languages.  Modula2 also has different string printing code, 
but (a) this is similar to Pascal, and (b) there are no existing modula2 
tests written in Modula2, so I'm not sure how I'd even test the Modula2 
string printing.

Co-Authored-By: Maciej W. Rozycki <macro@embecosm.com>
---
Changes from v5:

- Update testing for the use of `set print characters 0' now permitted.

- Add Guile and Python `print characters' testing.

No changes from v4.

Changes from v3:

- Split off from what is now 7/8; see the change log there for earlier 
  changes.

- Remove test case modifications to switch from the `set print elements' 
  command to `set print characters'; instead run them twice with each of 
  the two commands verified.

- Likewise with the `print -elements' and `print -characters' commands.

- Also cover `print -elements ... -characters ...', i.e. both options 
  combined.

- Expand the Ada and Pascal test cases to cover `set print characters
  elements' too.
---
 gdb/testsuite/gdb.ada/str_chars.exp           |   70 ++++++++++++++++++++++++++
 gdb/testsuite/gdb.ada/str_chars/foo.adb       |   26 +++++++++
 gdb/testsuite/gdb.base/printcmds.exp          |   65 +++++++++++++++++-------
 gdb/testsuite/gdb.guile/scm-parameter.exp     |   11 +++-
 gdb/testsuite/gdb.pascal/str-chars.exp        |   56 ++++++++++++++++++++
 gdb/testsuite/gdb.pascal/str-chars.pas        |   28 ++++++++++
 gdb/testsuite/gdb.python/py-format-string.exp |   47 +++++++++++------
 gdb/testsuite/gdb.python/py-parameter.exp     |   13 ++++
 8 files changed, 279 insertions(+), 37 deletions(-)

gdb-aburgess-print-elements-characters-test.diff
Index: src/gdb/testsuite/gdb.ada/str_chars.exp
===================================================================
--- /dev/null
+++ src/gdb/testsuite/gdb.ada/str_chars.exp
@@ -0,0 +1,70 @@
+# Copyright 2022 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test GDB's 'set print characters' setting works for Ada strings.
+
+load_lib "ada.exp"
+
+if { [skip_ada_tests] } { return -1 }
+
+standard_ada_testfile foo
+
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
+  return -1
+}
+
+clean_restart ${testfile}
+
+set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
+if ![runto "foo.adb:$bp_location" ] then {
+  return -1
+}
+
+gdb_test "print Arg" \
+    " = \"abcdefghijklmnopqrstuvwxyz\"" \
+    "print with default settings"
+
+gdb_test_no_output "set print characters 26"
+gdb_test "print Arg" \
+    " = \"abcdefghijklmnopqrstuvwxyz\"" \
+    "print with character limit of 26"
+
+gdb_test "print -characters 11 -- Arg" \
+    " = \"abcdefghijk\"\\.\\.\\." \
+    "print with character limit of 11"
+
+gdb_test_no_output "set print characters 10"
+gdb_test "print Arg" \
+    " = \"abcdefghij\"\\.\\.\\." \
+    "print with character limit of 10"
+
+gdb_test_no_output "set print characters unlimited"
+gdb_test "print Arg" \
+    " = \"abcdefghijklmnopqrstuvwxyz\"" \
+    "print with unlimited character limit"
+
+# The 'set print elements' command used to control printing of characters
+# in a string, before we created 'set print characters'.  This test makes
+# sure that 'set print elements' doens't effect string printing any more.
+gdb_test_no_output "set print elements 12"
+gdb_test "print Arg" \
+    " = \"abcdefghijklmnopqrstuvwxyz\"" \
+    "print with unlimited character limit, but lower element limit"
+
+# Except when 'set print characters elements' has been used.
+gdb_test_no_output "set print characters elements"
+gdb_test "print Arg" \
+    " = \"abcdefghijkl\"\\.\\.\\." \
+    "print with character limit of elements"
Index: src/gdb/testsuite/gdb.ada/str_chars/foo.adb
===================================================================
--- /dev/null
+++ src/gdb/testsuite/gdb.ada/str_chars/foo.adb
@@ -0,0 +1,26 @@
+--  Copyright 2022 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+procedure Foo is
+
+   procedure Blah (Arg : String) is
+   begin
+     null; -- STOP
+   end;
+
+begin
+
+   Blah ("abcdefghijklmnopqrstuvwxyz");
+end Foo;
Index: src/gdb/testsuite/gdb.base/printcmds.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/printcmds.exp
+++ src/gdb/testsuite/gdb.base/printcmds.exp
@@ -451,11 +451,11 @@ proc test_print_all_chars {} {
 # Test interaction of the number of print elements to print and the
 # repeat count, set to the default of 10.
 
-proc test_print_repeats_10 {} {
+proc test_print_repeats_10_one { setting } {
     global gdb_prompt decimal
 
     for { set x 1 } { $x <= 16 } { incr x } {
-	gdb_test_no_output "set print elements $x" "elements $x repeats"
+	gdb_test_no_output "set print $setting $x" "$setting $x repeats"
 	for { set e 1 } { $e <= 16 } {incr e } {
 	    set v [expr $e - 1]
 	    set command "p &ctable2\[${v}*16\]"
@@ -495,11 +495,18 @@ proc test_print_repeats_10 {} {
 		set xstr "${xstr}\[.\]\[.\]\[.\]"
 	    }
 	    set string " = \[(\]unsigned char \[*\]\[)\] <ctable2(\\+$decimal)?> ${a}${xstr}"
-	    gdb_test "$command" "$string" "$command with print elements set to $x"
+	    gdb_test "$command" "$string" "$command with print $setting set to $x"
 	}
     }
 }
 
+proc test_print_repeats_10 {} {
+    foreach_with_prefix setting { "elements" "characters" } {
+	test_print_repeats_10_one $setting
+    }
+    gdb_test_no_output "set print characters elements"
+}
+
 # This tests whether GDB uses the correct element content offsets
 # (relative to the complete `some_struct' value) when counting value
 # repetitions.
@@ -512,7 +519,7 @@ proc test_print_repeats_embedded_array {
 	"correct element repeats in array embedded at offset > 0"
 }
 
-proc test_print_strings {} {
+proc test_print_strings_one { setting } {
     global gdb_prompt decimal
 
     # We accept "(unsigned char *) " before the string.  char vs. unsigned char
@@ -520,35 +527,35 @@ proc test_print_strings {} {
 
     # Test that setting print elements unlimited doesn't completely suppress
     # printing; this was a bug in older gdb's.
-    gdb_test_no_output "set print elements 0"
+    gdb_test_no_output "set print $setting 0"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 0"
-    gdb_test_no_output "set print elements 1"
+	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with $setting set to 0"
+    gdb_test_no_output "set print $setting 1"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"t\"\\.\\.\\." "p teststring with elements set to 1"
-    gdb_test_no_output "set print elements 5"
+	" = (.unsigned char .. )?\"t\"\\.\\.\\." "p teststring with $setting set to 1"
+    gdb_test_no_output "set print $setting 5"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"tests\"\\.\\.\\." "p teststring with elements set to 5"
-    gdb_test_no_output "set print elements 19"
+	" = (.unsigned char .. )?\"tests\"\\.\\.\\." "p teststring with $setting set to 5"
+    gdb_test_no_output "set print $setting 19"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 19"
-    gdb_test_no_output "set print elements 20"
+	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with $setting set to 19"
+    gdb_test_no_output "set print $setting 20"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 20"
+	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with $setting set to 20"
 
-    gdb_test "p -elements 1 -- teststring" \
+    gdb_test "p -$setting 1 -- teststring" \
 	" = (.unsigned char .. )?\"t\"\\.\\.\\."
-    gdb_test "p -elements 5 -- teststring" \
+    gdb_test "p -$setting 5 -- teststring" \
 	" = (.unsigned char .. )?\"tests\"\\.\\.\\."
-    gdb_test "p -elements 19 -- teststring" \
+    gdb_test "p -$setting 19 -- teststring" \
 	" = (.unsigned char .. )?\"teststring contents\""
-    gdb_test "p -elements 20 -- teststring" \
+    gdb_test "p -$setting 20 -- teststring" \
 	" = (.unsigned char .. )?\"teststring contents\""
 
     gdb_test "print teststring2" \
 	" = \\(charptr\\) \"more contents\""
 
-    gdb_test_no_output "set print elements 8"
+    gdb_test_no_output "set print $setting 8"
 
     # Set the target-charset to ASCII, because the output varies from
     # different charset.
@@ -620,6 +627,26 @@ proc test_print_strings {} {
 	gdb_test "p &ctable1\[31*8\]" \
 	    " = \\(unsigned char \\*\\) <ctable1\\+$decimal> \"\\\\370\\\\371\\\\372\\\\373\\\\374\\\\375\\\\376\\\\377\"..."
     }
+
+    gdb_test_no_output "set print $setting unlimited"
+}
+
+proc test_print_strings {} {
+
+    foreach_with_prefix setting { "elements" "characters" } {
+	test_print_strings_one $setting
+    }
+
+    gdb_test "p -elements 8 -- teststring" \
+	" = (.unsigned char .. )?\"teststring contents\""
+    gdb_test "p -characters 8 -- teststring" \
+	" = (.unsigned char .. )?\"teststri\"\\.\\.\\."
+    gdb_test "p -elements 8 -characters elements -- teststring" \
+	" = (.unsigned char .. )?\"teststri\"\\.\\.\\."
+
+    with_test_prefix strings {
+	gdb_test_no_output "set print characters elements"
+    }
 }
 
 proc test_print_int_arrays {} {
Index: src/gdb/testsuite/gdb.guile/scm-parameter.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.guile/scm-parameter.exp
+++ src/gdb/testsuite/gdb.guile/scm-parameter.exp
@@ -105,6 +105,7 @@ foreach_with_prefix param {
     "listsize"
     "print elements"
     "max-completions"
+    "print characters"
 } {
     set param_range_error "integer -1 out of range"
     set param_type_error \
@@ -118,7 +119,8 @@ foreach_with_prefix param {
 	    set param_get_minus_one -1
 	    set param_set_minus_one ""
 	}
-	"print elements" {
+	"print elements" -
+	"print characters" {
 	    set param_get_zero "#:unlimited"
 	    set param_get_minus_one "#:unlimited"
 	    set param_set_minus_one $param_range_error
@@ -153,6 +155,13 @@ foreach_with_prefix param {
 
     gdb_test "guile (print (parameter-value \"$param\"))" \
 	"#:unlimited" "test value of 'unlimited'"
+
+    if {$param == "print characters"} {
+	gdb_test_no_output "set $param elements" "test set to 'elements'"
+
+	gdb_test "guile (print (parameter-value \"$param\"))" \
+	    "#:elements" "test value of 'elements'"
+    }
 }
 
 foreach_with_prefix kind {
Index: src/gdb/testsuite/gdb.pascal/str-chars.exp
===================================================================
--- /dev/null
+++ src/gdb/testsuite/gdb.pascal/str-chars.exp
@@ -0,0 +1,56 @@
+# Copyright 2022 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "pascal.exp"
+
+standard_testfile .pas
+
+if {[gdb_compile_pascal "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug ]] != "" } {
+  return -1
+}
+
+clean_restart ${testfile}
+gdb_breakpoint ${srcfile}:[gdb_get_line_number "set breakpoint 1 here"]
+
+# Verify that "start" lands inside the right procedure.
+if { [gdb_start_cmd] < 0 } {
+    untested start
+    return -1
+}
+
+gdb_continue_to_breakpoint "continue to breakpoint"
+
+gdb_test "print message" " = 'abcdefghijklmnopqrstuvwxyz'" \
+    "print message with the default settings"
+
+gdb_test_no_output "set print elements 10"
+gdb_test "print message" " = 'abcdefghij'\\.\\.\\." \
+    "print message with 'print elements' set to 10"
+
+gdb_test_no_output "set print characters 20"
+gdb_test "print message" " = 'abcdefghijklmnopqrst'\\.\\.\\." \
+    "print message with 'print characters' set to 20"
+
+gdb_test_no_output "set print elements 15"
+gdb_test "print message" " = 'abcdefghijklmnopqrst'\\.\\.\\." \
+    "print message with 'print elements' set to 15"
+
+gdb_test_no_output "set print characters unlimited"
+gdb_test "print message" " = 'abcdefghijklmnopqrstuvwxyz'" \
+    "print message with 'print characters' set to unlimited"
+
+gdb_test_no_output "set print characters elements"
+gdb_test "print message" " = 'abcdefghijklmno'\\.\\.\\." \
+    "print message with 'print characters' set to elements"
Index: src/gdb/testsuite/gdb.pascal/str-chars.pas
===================================================================
--- /dev/null
+++ src/gdb/testsuite/gdb.pascal/str-chars.pas
@@ -0,0 +1,28 @@
+{
+ Copyright 2022 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+}
+
+program str_char;
+
+var
+   message : string;
+
+begin
+
+   message := 'abcdefghijklmnopqrstuvwxyz';
+   writeln (message)	{ set breakpoint 1 here }
+
+end.
Index: src/gdb/testsuite/gdb.python/py-format-string.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.python/py-format-string.exp
+++ src/gdb/testsuite/gdb.python/py-format-string.exp
@@ -705,13 +705,13 @@ proc_with_prefix test_static_members {}
 }
 
 # Test the max_elements option for gdb.Value.format_string.
-proc_with_prefix test_max_elements {} {
+proc test_max_string_one { setting unlimited } {
   global current_lang
   global default_pointer_regexp
 
   # 200 is the default maximum number of elements, so setting it should
   # not change the output.
-  set opts "max_elements=200"
+  set opts "max_$setting=200"
   with_test_prefix $opts {
     check_format_string "a_point_t" $opts
     check_format_string "a_point_t_pointer" $opts
@@ -722,8 +722,10 @@ proc_with_prefix test_max_elements {} {
     check_format_string "a_binary_string" $opts
     check_format_string "a_binary_string_array" $opts
     check_format_string "a_big_string" $opts
-    check_format_string "an_array" $opts
-    check_format_string "an_array_with_repetition" $opts
+    if { $setting == "elements"} {
+      check_format_string "an_array" $opts
+      check_format_string "an_array_with_repetition" $opts
+    }
     check_format_string "a_symbol_pointer" $opts
 
     if { $current_lang == "c++" } {
@@ -732,7 +734,7 @@ proc_with_prefix test_max_elements {} {
     }
   }
 
-  set opts "max_elements=3"
+  set opts "max_$setting=3"
   with_test_prefix $opts {
     check_format_string "a_point_t" $opts
     check_format_string "a_point_t_pointer" $opts
@@ -749,9 +751,11 @@ proc_with_prefix test_max_elements {} {
       "\"hell\"..."
     check_format_string "a_big_string" $opts \
       [get_cut_big_string 3]
-    check_format_string "an_array" $opts
-    check_format_string "an_array_with_repetition" $opts \
-      "\\{1, 3 <repeats 12 times>...\\}"
+    if { $setting == "elements"} {
+      check_format_string "an_array" $opts
+      check_format_string "an_array_with_repetition" $opts \
+	"\\{1, 3 <repeats 12 times>...\\}"
+    }
     check_format_string "a_symbol_pointer" $opts
 
     if { $current_lang == "c++" } {
@@ -760,9 +764,9 @@ proc_with_prefix test_max_elements {} {
     }
   }
 
-  # Both 1,000 (we don't have that many elements) and 0 (unlimited) should
+  # Both 1,000 (we don't have that many elements) and unlimited should
   # mean no truncation.
-  foreach opts { "max_elements=1000" "max_elements=0" } {
+  foreach opts [list "max_$setting=1000" "max_$setting=$unlimited"] {
     with_test_prefix $opts {
       check_format_string "a_point_t" $opts
       check_format_string "a_point_t_pointer" $opts
@@ -774,8 +778,10 @@ proc_with_prefix test_max_elements {} {
       check_format_string "a_binary_string_array" $opts
       check_format_string "a_big_string" $opts \
         [get_cut_big_string 1000]
-      check_format_string "an_array" $opts
-      check_format_string "an_array_with_repetition" $opts
+      if { $setting == "elements"} {
+	check_format_string "an_array" $opts
+	check_format_string "an_array_with_repetition" $opts
+      }
       check_format_string "a_symbol_pointer" $opts
 
       if { $current_lang == "c++" } {
@@ -785,15 +791,24 @@ proc_with_prefix test_max_elements {} {
     }
   }
 
-  with_temp_option "set print elements 4" "set print elements 200" {
+  with_temp_option "set print $setting 4" "set print $setting 200" {
     check_format_string "a_string" "" \
       "${default_pointer_regexp} \"hell\"..."
     check_format_string "a_binary_string" "" \
       "${default_pointer_regexp} \"hell\"..."
     check_format_string "a_binary_string_array" "" \
       "\"hell\"..."
-    check_format_string "an_array_with_repetition" "" \
-      "\\{1, 3 <repeats 12 times>...\\}"
+    if { $setting == "elements"} {
+      check_format_string "an_array_with_repetition" "" \
+	"\\{1, 3 <repeats 12 times>...\\}"
+    }
+  }
+}
+
+proc_with_prefix test_max_string {} {
+  foreach_with_prefix setting { "elements" "characters" } {
+    test_max_string_one $setting \
+      [string map {elements 0 characters 4294967295} $setting]
   }
 }
 
@@ -1153,7 +1168,7 @@ proc_with_prefix test_all_common {} {
   test_deref_refs
   test_actual_objects
   test_static_members
-  test_max_elements
+  test_max_string
   test_max_depth
   test_repeat_threshold
   test_format
Index: src/gdb/testsuite/gdb.python/py-parameter.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.python/py-parameter.exp
+++ src/gdb/testsuite/gdb.python/py-parameter.exp
@@ -338,6 +338,7 @@ proc_with_prefix test_gdb_parameter { }
 	"listsize"
 	"print elements"
 	"max-completions"
+	"print characters"
     } {
 	clean_restart
 
@@ -348,7 +349,8 @@ proc_with_prefix test_gdb_parameter { }
 		set param_get_minus_one -1
 		set param_set_minus_one ""
 	    }
-	    "print elements" {
+	    "print elements" -
+	    "print characters" {
 		set param_get_zero None
 		set param_get_minus_one None
 		set param_set_minus_one $param_range_error
@@ -393,6 +395,15 @@ proc_with_prefix test_gdb_parameter { }
 
 	gdb_test "python print(gdb.parameter('$param'))" \
 	    None "test value of 'unlimited'"
+
+	if {$param == "print characters"} {
+	    gdb_test_no_output \
+		"python gdb.set_parameter('$param', 'elements')" \
+		"test set to 'elements'"
+
+	    gdb_test "python print(gdb.parameter('$param'))" \
+		elements "test value of 'elements'"
+	}
     }
 
     clean_restart

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PATCH v6.1 8/8] GDB/testsuite: Expand for character string limiting options
  2022-08-17 22:05 ` [PATCH v6 8/8] GDB/testsuite: Expand for character string limiting options Maciej W. Rozycki
@ 2022-08-18  0:07   ` Maciej W. Rozycki
  0 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-08-18  0:07 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

From: Andrew Burgess <andrew.burgess@embecosm.com>

Modify test cases that verify the operation of the array element limit 
with character strings such that they are executed twice, once with the 
`set print characters' option set to `elements' and the limit controlled 
with the `set print elements' option, and then again with the limit 
controlled with the `set print characters' option instead.  Similarly 
with the `-elements' and `-characters' options for the `print' command. 
Additionally verify that said `print' command options combined yield the 
expected result.

Verify correct $_gdb_setting and $_gdb_setting_str values for the `print  
characters' setting, in particular the `void' value for the `elements' 
default, which has no corresponding integer value exposed.

Add Guile and Python coverage for the `print characters' GDB setting.

There are new tests for Ada and Pascal, as the string printing code for 
these languages is different than the generic string printing code used 
by other languages.  Modula2 also has different string printing code, 
but (a) this is similar to Pascal, and (b) there are no existing modula2 
tests written in Modula2, so I'm not sure how I'd even test the Modula2 
string printing.

Co-Authored-By: Maciej W. Rozycki <macro@embecosm.com>
---
Changes from v6:

- Add tests for $_gdb_setting and $_gdb_setting_str values with `print
  characters' to cover the `void' value in particular.

Changes from v5:

- Update testing for the use of `set print characters 0' now permitted.

- Add Guile and Python `print characters' testing.

No changes from v4.

Changes from v3:

- Split off from what is now 7/8; see the change log there for earlier 
  changes.

- Remove test case modifications to switch from the `set print elements' 
  command to `set print characters'; instead run them twice with each of 
  the two commands verified.

- Likewise with the `print -elements' and `print -characters' commands.

- Also cover `print -elements ... -characters ...', i.e. both options 
  combined.

- Expand the Ada and Pascal test cases to cover `set print characters
  elements' too.
---
 gdb/testsuite/gdb.ada/str_chars.exp           |   70 ++++++++++++++++++++++++++
 gdb/testsuite/gdb.ada/str_chars/foo.adb       |   26 +++++++++
 gdb/testsuite/gdb.base/printcmds.exp          |   65 +++++++++++++++++-------
 gdb/testsuite/gdb.base/setshow.exp            |   22 ++++++++
 gdb/testsuite/gdb.guile/scm-parameter.exp     |   11 +++-
 gdb/testsuite/gdb.pascal/str-chars.exp        |   56 ++++++++++++++++++++
 gdb/testsuite/gdb.pascal/str-chars.pas        |   28 ++++++++++
 gdb/testsuite/gdb.python/py-format-string.exp |   47 +++++++++++------
 gdb/testsuite/gdb.python/py-parameter.exp     |   13 ++++
 9 files changed, 301 insertions(+), 37 deletions(-)

gdb-aburgess-print-elements-characters-test.diff
Index: src/gdb/testsuite/gdb.ada/str_chars.exp
===================================================================
--- /dev/null
+++ src/gdb/testsuite/gdb.ada/str_chars.exp
@@ -0,0 +1,70 @@
+# Copyright 2022 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test GDB's 'set print characters' setting works for Ada strings.
+
+load_lib "ada.exp"
+
+if { [skip_ada_tests] } { return -1 }
+
+standard_ada_testfile foo
+
+if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
+  return -1
+}
+
+clean_restart ${testfile}
+
+set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
+if ![runto "foo.adb:$bp_location" ] then {
+  return -1
+}
+
+gdb_test "print Arg" \
+    " = \"abcdefghijklmnopqrstuvwxyz\"" \
+    "print with default settings"
+
+gdb_test_no_output "set print characters 26"
+gdb_test "print Arg" \
+    " = \"abcdefghijklmnopqrstuvwxyz\"" \
+    "print with character limit of 26"
+
+gdb_test "print -characters 11 -- Arg" \
+    " = \"abcdefghijk\"\\.\\.\\." \
+    "print with character limit of 11"
+
+gdb_test_no_output "set print characters 10"
+gdb_test "print Arg" \
+    " = \"abcdefghij\"\\.\\.\\." \
+    "print with character limit of 10"
+
+gdb_test_no_output "set print characters unlimited"
+gdb_test "print Arg" \
+    " = \"abcdefghijklmnopqrstuvwxyz\"" \
+    "print with unlimited character limit"
+
+# The 'set print elements' command used to control printing of characters
+# in a string, before we created 'set print characters'.  This test makes
+# sure that 'set print elements' doens't effect string printing any more.
+gdb_test_no_output "set print elements 12"
+gdb_test "print Arg" \
+    " = \"abcdefghijklmnopqrstuvwxyz\"" \
+    "print with unlimited character limit, but lower element limit"
+
+# Except when 'set print characters elements' has been used.
+gdb_test_no_output "set print characters elements"
+gdb_test "print Arg" \
+    " = \"abcdefghijkl\"\\.\\.\\." \
+    "print with character limit of elements"
Index: src/gdb/testsuite/gdb.ada/str_chars/foo.adb
===================================================================
--- /dev/null
+++ src/gdb/testsuite/gdb.ada/str_chars/foo.adb
@@ -0,0 +1,26 @@
+--  Copyright 2022 Free Software Foundation, Inc.
+--
+--  This program is free software; you can redistribute it and/or modify
+--  it under the terms of the GNU General Public License as published by
+--  the Free Software Foundation; either version 3 of the License, or
+--  (at your option) any later version.
+--
+--  This program is distributed in the hope that it will be useful,
+--  but WITHOUT ANY WARRANTY; without even the implied warranty of
+--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+--  GNU General Public License for more details.
+--
+--  You should have received a copy of the GNU General Public License
+--  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+procedure Foo is
+
+   procedure Blah (Arg : String) is
+   begin
+     null; -- STOP
+   end;
+
+begin
+
+   Blah ("abcdefghijklmnopqrstuvwxyz");
+end Foo;
Index: src/gdb/testsuite/gdb.base/printcmds.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/printcmds.exp
+++ src/gdb/testsuite/gdb.base/printcmds.exp
@@ -451,11 +451,11 @@ proc test_print_all_chars {} {
 # Test interaction of the number of print elements to print and the
 # repeat count, set to the default of 10.
 
-proc test_print_repeats_10 {} {
+proc test_print_repeats_10_one { setting } {
     global gdb_prompt decimal
 
     for { set x 1 } { $x <= 16 } { incr x } {
-	gdb_test_no_output "set print elements $x" "elements $x repeats"
+	gdb_test_no_output "set print $setting $x" "$setting $x repeats"
 	for { set e 1 } { $e <= 16 } {incr e } {
 	    set v [expr $e - 1]
 	    set command "p &ctable2\[${v}*16\]"
@@ -495,11 +495,18 @@ proc test_print_repeats_10 {} {
 		set xstr "${xstr}\[.\]\[.\]\[.\]"
 	    }
 	    set string " = \[(\]unsigned char \[*\]\[)\] <ctable2(\\+$decimal)?> ${a}${xstr}"
-	    gdb_test "$command" "$string" "$command with print elements set to $x"
+	    gdb_test "$command" "$string" "$command with print $setting set to $x"
 	}
     }
 }
 
+proc test_print_repeats_10 {} {
+    foreach_with_prefix setting { "elements" "characters" } {
+	test_print_repeats_10_one $setting
+    }
+    gdb_test_no_output "set print characters elements"
+}
+
 # This tests whether GDB uses the correct element content offsets
 # (relative to the complete `some_struct' value) when counting value
 # repetitions.
@@ -512,7 +519,7 @@ proc test_print_repeats_embedded_array {
 	"correct element repeats in array embedded at offset > 0"
 }
 
-proc test_print_strings {} {
+proc test_print_strings_one { setting } {
     global gdb_prompt decimal
 
     # We accept "(unsigned char *) " before the string.  char vs. unsigned char
@@ -520,35 +527,35 @@ proc test_print_strings {} {
 
     # Test that setting print elements unlimited doesn't completely suppress
     # printing; this was a bug in older gdb's.
-    gdb_test_no_output "set print elements 0"
+    gdb_test_no_output "set print $setting 0"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 0"
-    gdb_test_no_output "set print elements 1"
+	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with $setting set to 0"
+    gdb_test_no_output "set print $setting 1"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"t\"\\.\\.\\." "p teststring with elements set to 1"
-    gdb_test_no_output "set print elements 5"
+	" = (.unsigned char .. )?\"t\"\\.\\.\\." "p teststring with $setting set to 1"
+    gdb_test_no_output "set print $setting 5"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"tests\"\\.\\.\\." "p teststring with elements set to 5"
-    gdb_test_no_output "set print elements 19"
+	" = (.unsigned char .. )?\"tests\"\\.\\.\\." "p teststring with $setting set to 5"
+    gdb_test_no_output "set print $setting 19"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 19"
-    gdb_test_no_output "set print elements 20"
+	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with $setting set to 19"
+    gdb_test_no_output "set print $setting 20"
     gdb_test "p teststring" \
-	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 20"
+	" = (.unsigned char .. )?\"teststring contents\"" "p teststring with $setting set to 20"
 
-    gdb_test "p -elements 1 -- teststring" \
+    gdb_test "p -$setting 1 -- teststring" \
 	" = (.unsigned char .. )?\"t\"\\.\\.\\."
-    gdb_test "p -elements 5 -- teststring" \
+    gdb_test "p -$setting 5 -- teststring" \
 	" = (.unsigned char .. )?\"tests\"\\.\\.\\."
-    gdb_test "p -elements 19 -- teststring" \
+    gdb_test "p -$setting 19 -- teststring" \
 	" = (.unsigned char .. )?\"teststring contents\""
-    gdb_test "p -elements 20 -- teststring" \
+    gdb_test "p -$setting 20 -- teststring" \
 	" = (.unsigned char .. )?\"teststring contents\""
 
     gdb_test "print teststring2" \
 	" = \\(charptr\\) \"more contents\""
 
-    gdb_test_no_output "set print elements 8"
+    gdb_test_no_output "set print $setting 8"
 
     # Set the target-charset to ASCII, because the output varies from
     # different charset.
@@ -620,6 +627,26 @@ proc test_print_strings {} {
 	gdb_test "p &ctable1\[31*8\]" \
 	    " = \\(unsigned char \\*\\) <ctable1\\+$decimal> \"\\\\370\\\\371\\\\372\\\\373\\\\374\\\\375\\\\376\\\\377\"..."
     }
+
+    gdb_test_no_output "set print $setting unlimited"
+}
+
+proc test_print_strings {} {
+
+    foreach_with_prefix setting { "elements" "characters" } {
+	test_print_strings_one $setting
+    }
+
+    gdb_test "p -elements 8 -- teststring" \
+	" = (.unsigned char .. )?\"teststring contents\""
+    gdb_test "p -characters 8 -- teststring" \
+	" = (.unsigned char .. )?\"teststri\"\\.\\.\\."
+    gdb_test "p -elements 8 -characters elements -- teststring" \
+	" = (.unsigned char .. )?\"teststri\"\\.\\.\\."
+
+    with_test_prefix strings {
+	gdb_test_no_output "set print characters elements"
+    }
 }
 
 proc test_print_int_arrays {} {
Index: src/gdb/testsuite/gdb.base/setshow.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/setshow.exp
+++ src/gdb/testsuite/gdb.base/setshow.exp
@@ -374,6 +374,27 @@ proc_with_prefix test_setshow_listsize {
     gdb_test "show listsize" "Number of source lines gdb will list by default is 100..*" "show listsize (100)"
 }
 
+proc_with_prefix test_setshow_print_characters {} {
+    clean_restart
+
+    gdb_test "p \$_gdb_setting(\"print characters\")" " = void" \
+	"_gdb_setting print characters default"
+    gdb_test "p \$_gdb_setting_str(\"print characters\")" " = \"elements\"" \
+	"_gdb_setting_str print characters default"
+
+    gdb_test_no_output "set print characters unlimited"
+    gdb_test "p \$_gdb_setting(\"print characters\")" " = 0" \
+	"_gdb_setting print characters unlimited"
+    gdb_test "p \$_gdb_setting_str(\"print characters\")" " = \"unlimited\"" \
+	"_gdb_setting_str print characters unlimited"
+
+    gdb_test_no_output "set print characters 1"
+    gdb_test "p \$_gdb_setting(\"print characters\")" " = 1" \
+	"_gdb_setting print characters 1"
+    gdb_test "p \$_gdb_setting_str(\"print characters\")" " = \"1\"" \
+	"_gdb_setting_str print characters 1"
+}
+
 proc_with_prefix test_setshow_prompt {} {
     clean_restart
 
@@ -493,6 +514,7 @@ test_setshow_height
 test_setshow_history
 test_setshow_language
 test_setshow_listsize
+test_setshow_print_characters
 test_setshow_prompt
 test_setshow_radix
 test_setshow_width
Index: src/gdb/testsuite/gdb.guile/scm-parameter.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.guile/scm-parameter.exp
+++ src/gdb/testsuite/gdb.guile/scm-parameter.exp
@@ -105,6 +105,7 @@ foreach_with_prefix param {
     "listsize"
     "print elements"
     "max-completions"
+    "print characters"
 } {
     set param_range_error "integer -1 out of range"
     set param_type_error \
@@ -118,7 +119,8 @@ foreach_with_prefix param {
 	    set param_get_minus_one -1
 	    set param_set_minus_one ""
 	}
-	"print elements" {
+	"print elements" -
+	"print characters" {
 	    set param_get_zero "#:unlimited"
 	    set param_get_minus_one "#:unlimited"
 	    set param_set_minus_one $param_range_error
@@ -153,6 +155,13 @@ foreach_with_prefix param {
 
     gdb_test "guile (print (parameter-value \"$param\"))" \
 	"#:unlimited" "test value of 'unlimited'"
+
+    if {$param == "print characters"} {
+	gdb_test_no_output "set $param elements" "test set to 'elements'"
+
+	gdb_test "guile (print (parameter-value \"$param\"))" \
+	    "#:elements" "test value of 'elements'"
+    }
 }
 
 foreach_with_prefix kind {
Index: src/gdb/testsuite/gdb.pascal/str-chars.exp
===================================================================
--- /dev/null
+++ src/gdb/testsuite/gdb.pascal/str-chars.exp
@@ -0,0 +1,56 @@
+# Copyright 2022 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib "pascal.exp"
+
+standard_testfile .pas
+
+if {[gdb_compile_pascal "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug ]] != "" } {
+  return -1
+}
+
+clean_restart ${testfile}
+gdb_breakpoint ${srcfile}:[gdb_get_line_number "set breakpoint 1 here"]
+
+# Verify that "start" lands inside the right procedure.
+if { [gdb_start_cmd] < 0 } {
+    untested start
+    return -1
+}
+
+gdb_continue_to_breakpoint "continue to breakpoint"
+
+gdb_test "print message" " = 'abcdefghijklmnopqrstuvwxyz'" \
+    "print message with the default settings"
+
+gdb_test_no_output "set print elements 10"
+gdb_test "print message" " = 'abcdefghij'\\.\\.\\." \
+    "print message with 'print elements' set to 10"
+
+gdb_test_no_output "set print characters 20"
+gdb_test "print message" " = 'abcdefghijklmnopqrst'\\.\\.\\." \
+    "print message with 'print characters' set to 20"
+
+gdb_test_no_output "set print elements 15"
+gdb_test "print message" " = 'abcdefghijklmnopqrst'\\.\\.\\." \
+    "print message with 'print elements' set to 15"
+
+gdb_test_no_output "set print characters unlimited"
+gdb_test "print message" " = 'abcdefghijklmnopqrstuvwxyz'" \
+    "print message with 'print characters' set to unlimited"
+
+gdb_test_no_output "set print characters elements"
+gdb_test "print message" " = 'abcdefghijklmno'\\.\\.\\." \
+    "print message with 'print characters' set to elements"
Index: src/gdb/testsuite/gdb.pascal/str-chars.pas
===================================================================
--- /dev/null
+++ src/gdb/testsuite/gdb.pascal/str-chars.pas
@@ -0,0 +1,28 @@
+{
+ Copyright 2022 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program.  If not, see <http://www.gnu.org/licenses/>.
+}
+
+program str_char;
+
+var
+   message : string;
+
+begin
+
+   message := 'abcdefghijklmnopqrstuvwxyz';
+   writeln (message)	{ set breakpoint 1 here }
+
+end.
Index: src/gdb/testsuite/gdb.python/py-format-string.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.python/py-format-string.exp
+++ src/gdb/testsuite/gdb.python/py-format-string.exp
@@ -705,13 +705,13 @@ proc_with_prefix test_static_members {}
 }
 
 # Test the max_elements option for gdb.Value.format_string.
-proc_with_prefix test_max_elements {} {
+proc test_max_string_one { setting unlimited } {
   global current_lang
   global default_pointer_regexp
 
   # 200 is the default maximum number of elements, so setting it should
   # not change the output.
-  set opts "max_elements=200"
+  set opts "max_$setting=200"
   with_test_prefix $opts {
     check_format_string "a_point_t" $opts
     check_format_string "a_point_t_pointer" $opts
@@ -722,8 +722,10 @@ proc_with_prefix test_max_elements {} {
     check_format_string "a_binary_string" $opts
     check_format_string "a_binary_string_array" $opts
     check_format_string "a_big_string" $opts
-    check_format_string "an_array" $opts
-    check_format_string "an_array_with_repetition" $opts
+    if { $setting == "elements"} {
+      check_format_string "an_array" $opts
+      check_format_string "an_array_with_repetition" $opts
+    }
     check_format_string "a_symbol_pointer" $opts
 
     if { $current_lang == "c++" } {
@@ -732,7 +734,7 @@ proc_with_prefix test_max_elements {} {
     }
   }
 
-  set opts "max_elements=3"
+  set opts "max_$setting=3"
   with_test_prefix $opts {
     check_format_string "a_point_t" $opts
     check_format_string "a_point_t_pointer" $opts
@@ -749,9 +751,11 @@ proc_with_prefix test_max_elements {} {
       "\"hell\"..."
     check_format_string "a_big_string" $opts \
       [get_cut_big_string 3]
-    check_format_string "an_array" $opts
-    check_format_string "an_array_with_repetition" $opts \
-      "\\{1, 3 <repeats 12 times>...\\}"
+    if { $setting == "elements"} {
+      check_format_string "an_array" $opts
+      check_format_string "an_array_with_repetition" $opts \
+	"\\{1, 3 <repeats 12 times>...\\}"
+    }
     check_format_string "a_symbol_pointer" $opts
 
     if { $current_lang == "c++" } {
@@ -760,9 +764,9 @@ proc_with_prefix test_max_elements {} {
     }
   }
 
-  # Both 1,000 (we don't have that many elements) and 0 (unlimited) should
+  # Both 1,000 (we don't have that many elements) and unlimited should
   # mean no truncation.
-  foreach opts { "max_elements=1000" "max_elements=0" } {
+  foreach opts [list "max_$setting=1000" "max_$setting=$unlimited"] {
     with_test_prefix $opts {
       check_format_string "a_point_t" $opts
       check_format_string "a_point_t_pointer" $opts
@@ -774,8 +778,10 @@ proc_with_prefix test_max_elements {} {
       check_format_string "a_binary_string_array" $opts
       check_format_string "a_big_string" $opts \
         [get_cut_big_string 1000]
-      check_format_string "an_array" $opts
-      check_format_string "an_array_with_repetition" $opts
+      if { $setting == "elements"} {
+	check_format_string "an_array" $opts
+	check_format_string "an_array_with_repetition" $opts
+      }
       check_format_string "a_symbol_pointer" $opts
 
       if { $current_lang == "c++" } {
@@ -785,15 +791,24 @@ proc_with_prefix test_max_elements {} {
     }
   }
 
-  with_temp_option "set print elements 4" "set print elements 200" {
+  with_temp_option "set print $setting 4" "set print $setting 200" {
     check_format_string "a_string" "" \
       "${default_pointer_regexp} \"hell\"..."
     check_format_string "a_binary_string" "" \
       "${default_pointer_regexp} \"hell\"..."
     check_format_string "a_binary_string_array" "" \
       "\"hell\"..."
-    check_format_string "an_array_with_repetition" "" \
-      "\\{1, 3 <repeats 12 times>...\\}"
+    if { $setting == "elements"} {
+      check_format_string "an_array_with_repetition" "" \
+	"\\{1, 3 <repeats 12 times>...\\}"
+    }
+  }
+}
+
+proc_with_prefix test_max_string {} {
+  foreach_with_prefix setting { "elements" "characters" } {
+    test_max_string_one $setting \
+      [string map {elements 0 characters 4294967295} $setting]
   }
 }
 
@@ -1153,7 +1168,7 @@ proc_with_prefix test_all_common {} {
   test_deref_refs
   test_actual_objects
   test_static_members
-  test_max_elements
+  test_max_string
   test_max_depth
   test_repeat_threshold
   test_format
Index: src/gdb/testsuite/gdb.python/py-parameter.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.python/py-parameter.exp
+++ src/gdb/testsuite/gdb.python/py-parameter.exp
@@ -338,6 +338,7 @@ proc_with_prefix test_gdb_parameter { }
 	"listsize"
 	"print elements"
 	"max-completions"
+	"print characters"
     } {
 	clean_restart
 
@@ -348,7 +349,8 @@ proc_with_prefix test_gdb_parameter { }
 		set param_get_minus_one -1
 		set param_set_minus_one ""
 	    }
-	    "print elements" {
+	    "print elements" -
+	    "print characters" {
 		set param_get_zero None
 		set param_get_minus_one None
 		set param_set_minus_one $param_range_error
@@ -393,6 +395,15 @@ proc_with_prefix test_gdb_parameter { }
 
 	gdb_test "python print(gdb.parameter('$param'))" \
 	    None "test value of 'unlimited'"
+
+	if {$param == "print characters"} {
+	    gdb_test_no_output \
+		"python gdb.set_parameter('$param', 'elements')" \
+		"test set to 'elements'"
+
+	    gdb_test "python print(gdb.parameter('$param'))" \
+		elements "test value of 'elements'"
+	}
     }
 
     clean_restart

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 2/8] GDB/doc: Document the Guile `#:unlimited' keyword
  2022-08-17 22:03 ` [PATCH v6 2/8] GDB/doc: Document the Guile `#:unlimited' keyword Maciej W. Rozycki
@ 2022-08-18  6:06   ` Eli Zaretskii
  2022-09-01 10:31     ` Maciej W. Rozycki
  0 siblings, 1 reply; 42+ messages in thread
From: Eli Zaretskii @ 2022-08-18  6:06 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches, simonsobisch, tom, aburgess

> Date: Wed, 17 Aug 2022 23:03:54 +0100 (BST)
> From: "Maciej W. Rozycki" <macro@embecosm.com>
> Cc: Simon Sobisch <simonsobisch@web.de>, Tom Tromey <tom@tromey.com>,
>  Andrew Burgess <aburgess@redhat.com>
> 
> Document the Guile `#:unlimited' keyword and deprecate the internal 
> integer representation it corresponds to for integer parameters.
> ---
> New change in v6.
> ---
>  gdb/doc/guile.texi |   12 +++++++-----
>  1 file changed, 7 insertions(+), 5 deletions(-)

This is OK, thanks.

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-08-17 22:04 ` [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited' Maciej W. Rozycki
@ 2022-08-18  6:08   ` Eli Zaretskii
  2022-10-17 15:02   ` Simon Marchi
  2022-10-26 11:58   ` Luis Machado
  2 siblings, 0 replies; 42+ messages in thread
From: Eli Zaretskii @ 2022-08-18  6:08 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches, simonsobisch, tom, aburgess

> Date: Wed, 17 Aug 2022 23:04:38 +0100 (BST)
> From: "Maciej W. Rozycki" <macro@embecosm.com>
> Cc: Simon Sobisch <simonsobisch@web.de>, Tom Tromey <tom@tromey.com>,
>  Andrew Burgess <aburgess@redhat.com>
> 
> New change in v4.
> ---
>  gdb/NEWS                                  |    7 +++++++
>  gdb/doc/python.texi                       |   30 +++++++++++++++++++-----------
>  gdb/python/python.c                       |   10 +++++++++-
>  gdb/testsuite/gdb.python/py-parameter.exp |   16 +++++-----------
>  4 files changed, 40 insertions(+), 23 deletions(-)

Thanks, the documentation parts are OK.

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 2/8] GDB/doc: Document the Guile `#:unlimited' keyword
  2022-08-18  6:06   ` Eli Zaretskii
@ 2022-09-01 10:31     ` Maciej W. Rozycki
  0 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-09-01 10:31 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: gdb-patches, simonsobisch, Tom Tromey, Andrew Burgess

On Thu, 18 Aug 2022, Eli Zaretskii wrote:

> > Document the Guile `#:unlimited' keyword and deprecate the internal 
> > integer representation it corresponds to for integer parameters.
> > ---
> > New change in v6.
> > ---
> >  gdb/doc/guile.texi |   12 +++++++-----
> >  1 file changed, 7 insertions(+), 5 deletions(-)
> 
> This is OK, thanks.

 I have committed this change now, thank you for your review.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PING][PATCH v6 0/8] gdb: split array and string limiting options
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (7 preceding siblings ...)
  2022-08-17 22:05 ` [PATCH v6 8/8] GDB/testsuite: Expand for character string limiting options Maciej W. Rozycki
@ 2022-09-01 10:32 ` Maciej W. Rozycki
  2022-09-08  9:37 ` [PING^2][PATCH " Maciej W. Rozycki
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-09-01 10:32 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

On Wed, 17 Aug 2022, Maciej W. Rozycki wrote:

>  Here is v6 of the series to split array and string limiting options.
> 
>  I believe I have addressed one way or another all the issues Andrew has 
> raised in the review.  In the course I have discovered more issues that I 
> concluded need to be addressed in preparation, so the series has gone back 
> to 8 patches even though some of the 8 patches from v5 have been approved 
> and committed.

 Ping for: 
<https://sourceware.org/pipermail/gdb-patches/2022-August/191435.html>.

 Thanks, Eli, for reviewing the documentation parts.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PING^2][PATCH v6 0/8] gdb: split array and string limiting options
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (8 preceding siblings ...)
  2022-09-01 10:32 ` [PING][PATCH v6 0/8] gdb: split array and " Maciej W. Rozycki
@ 2022-09-08  9:37 ` Maciej W. Rozycki
  2022-09-14 17:43 ` [PING^3][PATCH " Maciej W. Rozycki
                   ` (4 subsequent siblings)
  14 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-09-08  9:37 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

On Wed, 17 Aug 2022, Maciej W. Rozycki wrote:

>  Here is v6 of the series to split array and string limiting options.
> 
>  I believe I have addressed one way or another all the issues Andrew has 
> raised in the review.  In the course I have discovered more issues that I 
> concluded need to be addressed in preparation, so the series has gone back 
> to 8 patches even though some of the 8 patches from v5 have been approved 
> and committed.

 Ping for:
<https://sourceware.org/pipermail/gdb-patches/2022-August/191435.html>.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PING^3][PATCH v6 0/8] gdb: split array and string limiting options
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (9 preceding siblings ...)
  2022-09-08  9:37 ` [PING^2][PATCH " Maciej W. Rozycki
@ 2022-09-14 17:43 ` Maciej W. Rozycki
  2022-09-22 22:07 ` [PING^4][PATCH " Maciej W. Rozycki
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-09-14 17:43 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

On Wed, 17 Aug 2022, Maciej W. Rozycki wrote:

>  Here is v6 of the series to split array and string limiting options.
> 
>  I believe I have addressed one way or another all the issues Andrew has 
> raised in the review.  In the course I have discovered more issues that I 
> concluded need to be addressed in preparation, so the series has gone back 
> to 8 patches even though some of the 8 patches from v5 have been approved 
> and committed.

 Ping for:
<https://sourceware.org/pipermail/gdb-patches/2022-August/191435.html>.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PING^4][PATCH v6 0/8] gdb: split array and string limiting options
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (10 preceding siblings ...)
  2022-09-14 17:43 ` [PING^3][PATCH " Maciej W. Rozycki
@ 2022-09-22 22:07 ` Maciej W. Rozycki
  2022-09-29  7:09 ` [PING^5][PATCH " Maciej W. Rozycki
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-09-22 22:07 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

On Wed, 17 Aug 2022, Maciej W. Rozycki wrote:

>  Here is v6 of the series to split array and string limiting options.
> 
>  I believe I have addressed one way or another all the issues Andrew has 
> raised in the review.  In the course I have discovered more issues that I 
> concluded need to be addressed in preparation, so the series has gone back 
> to 8 patches even though some of the 8 patches from v5 have been approved 
> and committed.

 Ping for:
<https://sourceware.org/pipermail/gdb-patches/2022-August/191435.html>.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PING^5][PATCH v6 0/8] gdb: split array and string limiting options
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (11 preceding siblings ...)
  2022-09-22 22:07 ` [PING^4][PATCH " Maciej W. Rozycki
@ 2022-09-29  7:09 ` Maciej W. Rozycki
  2022-09-29  7:12   ` Simon Sobisch
  2022-10-06 15:46 ` [PING^6][PATCH " Maciej W. Rozycki
  2022-10-12 21:19 ` [PING^7][PATCH " Maciej W. Rozycki
  14 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-09-29  7:09 UTC (permalink / raw)
  To: gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey, Simon Sobisch

On Wed, 17 Aug 2022, Maciej W. Rozycki wrote:

>  Here is v6 of the series to split array and string limiting options.
> 
>  I believe I have addressed one way or another all the issues Andrew has 
> raised in the review.  In the course I have discovered more issues that I 
> concluded need to be addressed in preparation, so the series has gone back 
> to 8 patches even though some of the 8 patches from v5 have been approved 
> and committed.

 Ping for:
<https://sourceware.org/pipermail/gdb-patches/2022-August/191435.html>.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PING^5][PATCH v6 0/8] gdb: split array and string limiting options
  2022-09-29  7:09 ` [PING^5][PATCH " Maciej W. Rozycki
@ 2022-09-29  7:12   ` Simon Sobisch
  0 siblings, 0 replies; 42+ messages in thread
From: Simon Sobisch @ 2022-09-29  7:12 UTC (permalink / raw)
  To: Maciej W. Rozycki, gdb-patches; +Cc: Andrew Burgess, Simon Marchi, Tom Tromey


Am 29.09.2022 um 09:09 schrieb Maciej W. Rozycki:
> On Wed, 17 Aug 2022, Maciej W. Rozycki wrote:
>
>>   Here is v6 of the series to split array and string limiting options.
>>
>>   I believe I have addressed one way or another all the issues Andrew has
>> raised in the review.  In the course I have discovered more issues that I
>> concluded need to be addressed in preparation, so the series has gone back
>> to 8 patches even though some of the 8 patches from v5 have been approved
>> and committed.
>
>   Ping for:
> <https://sourceware.org/pipermail/gdb-patches/2022-August/191435.html>.
>
>    Maciej

Looks good to me - and overdue for getting in.
No "no" over several months EQUALS yes, doesn't it?

Thanks again for your time and your endurance on this topic,
Simon

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PING^6][PATCH v6 0/8] gdb: split array and string limiting options
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (12 preceding siblings ...)
  2022-09-29  7:09 ` [PING^5][PATCH " Maciej W. Rozycki
@ 2022-10-06 15:46 ` Maciej W. Rozycki
  2022-10-12 21:19 ` [PING^7][PATCH " Maciej W. Rozycki
  14 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-06 15:46 UTC (permalink / raw)
  To: gdb-patches

On Wed, 17 Aug 2022, Maciej W. Rozycki wrote:

>  Here is v6 of the series to split array and string limiting options.
> 
>  I believe I have addressed one way or another all the issues Andrew has 
> raised in the review.  In the course I have discovered more issues that I 
> concluded need to be addressed in preparation, so the series has gone back 
> to 8 patches even though some of the 8 patches from v5 have been approved 
> and committed.

 Ping for:
<https://sourceware.org/pipermail/gdb-patches/2022-August/191435.html>.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* [PING^7][PATCH v6 0/8] gdb: split array and string limiting options
  2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
                   ` (13 preceding siblings ...)
  2022-10-06 15:46 ` [PING^6][PATCH " Maciej W. Rozycki
@ 2022-10-12 21:19 ` Maciej W. Rozycki
  14 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-12 21:19 UTC (permalink / raw)
  To: gdb-patches

On Wed, 17 Aug 2022, Maciej W. Rozycki wrote:

>  Here is v6 of the series to split array and string limiting options.
> 
>  I believe I have addressed one way or another all the issues Andrew has 
> raised in the review.  In the course I have discovered more issues that I 
> concluded need to be addressed in preparation, so the series has gone back 
> to 8 patches even though some of the 8 patches from v5 have been approved 
> and committed.

 Ping for:
<https://sourceware.org/pipermail/gdb-patches/2022-August/191435.html>.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean
  2022-08-17 22:03 ` [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean Maciej W. Rozycki
@ 2022-10-17 13:43   ` Simon Marchi
  2022-10-21  7:58     ` Maciej W. Rozycki
  2022-10-21 18:44   ` Simon Marchi
  1 sibling, 1 reply; 42+ messages in thread
From: Simon Marchi @ 2022-10-17 13:43 UTC (permalink / raw)
  To: Maciej W. Rozycki, gdb-patches; +Cc: Andrew Burgess, Tom Tromey, Simon Sobisch



> gdb-guile-scm-param-is-integer.diff
> Index: src/gdb/guile/scm-param.c
> ===================================================================
> --- src.orig/gdb/guile/scm-param.c
> +++ src/gdb/guile/scm-param.c
> @@ -742,7 +742,7 @@ pascm_set_param_value_x (param_smob *p_s
>        if (var.type () == var_uinteger
>  	  || var.type () == var_zuinteger_unlimited)
>  	{
> -	  SCM_ASSERT_TYPE (gdbscm_is_bool (value)
> +	  SCM_ASSERT_TYPE (scm_is_integer (value)

Was this just a brainfart when the code was initially written?

> @@ -206,3 +380,5 @@ with_test_prefix "previously-ambiguous"
>      gdb_test "help set print s" "This command is not documented." "set help"
>      gdb_test "help set print" "set print s -- This command is not documented.*" "general help"
>  }
> +
> +rename scm_param_test_maybe_no_output ""

Just wondering, what is the intention here, to avoid polluting the
global namespace?  If so, I appreciate the intention, but given we don't
do that in thousands of other tests, I'm not sure if it's really useful.

Anyhow, this patch LGTM:

Approved-By: Simon Marchi <simon.marchi@polymtl.ca>

Simon

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 3/8] GDB/testsuite: Expand Python integer parameter coverage across all types
  2022-08-17 22:04 ` [PATCH v6 3/8] GDB/testsuite: Expand Python integer parameter coverage across all types Maciej W. Rozycki
@ 2022-10-17 13:56   ` Simon Marchi
  2022-10-21  7:59     ` Maciej W. Rozycki
  0 siblings, 1 reply; 42+ messages in thread
From: Simon Marchi @ 2022-10-17 13:56 UTC (permalink / raw)
  To: Maciej W. Rozycki, gdb-patches; +Cc: Andrew Burgess, Tom Tromey, Simon Sobisch



On 2022-08-17 18:04, Maciej W. Rozycki wrote:
> Also verify PARAM_UINTEGER, PARAM_INTEGER, and PARAM_ZINTEGER parameter 
> types, in addition to PARAM_ZUINTEGER and PARAM_ZUINTEGER_UNLIMITED 
> already covered, and verify a choice of existing GDB parameters.  Add 
> verification for reading parameters via `<parameter>.value' in addition 
> to `gdb.parameter('<parameter>')' as this covers different code paths.
> ---
> New change in v6.
> ---

Thanks:

Approved-By: Simon Marchi <simon.marchi@polymtl.ca>

Simon

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 4/8] GDB/Python: Make `None' stand for `unlimited' in setting integer parameters
  2022-08-17 22:04 ` [PATCH v6 4/8] GDB/Python: Make `None' stand for `unlimited' in setting integer parameters Maciej W. Rozycki
@ 2022-10-17 14:26   ` Simon Marchi
  2022-10-21  8:03     ` Maciej W. Rozycki
  0 siblings, 1 reply; 42+ messages in thread
From: Simon Marchi @ 2022-10-17 14:26 UTC (permalink / raw)
  To: Maciej W. Rozycki, gdb-patches; +Cc: Andrew Burgess, Tom Tromey, Simon Sobisch



On 2022-08-17 18:04, Maciej W. Rozycki wrote:
> Similarly to booleans and following the fix for PR python/29217 make 
> `gdb.parameter' accept `None' for `unlimited' with parameters of the 
> PARAM_UINTEGER, PARAM_INTEGER, and PARAM_ZUINTEGER_UNLIMITED types, as 
> `None' is already returned by parameters of the two former types, so 
> one might expect to be able to feed it back.  It also makes it possible 
> to avoid the need to know what the internal integer representation is 
> for the special setting of `unlimited'.

If I understand correctly, assigning None used to just raise an
exception, and now it will be accepted for those kinds of parameters.
So, I don't think there are backwards compatibility concerns here.  If
so:

Approved-By: Simon Marchi <simon.marchi@polymtl.ca>

Simon

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-08-17 22:04 ` [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited' Maciej W. Rozycki
  2022-08-18  6:08   ` Eli Zaretskii
@ 2022-10-17 15:02   ` Simon Marchi
  2022-10-29 15:58     ` Maciej W. Rozycki
  2022-10-26 11:58   ` Luis Machado
  2 siblings, 1 reply; 42+ messages in thread
From: Simon Marchi @ 2022-10-17 15:02 UTC (permalink / raw)
  To: Maciej W. Rozycki, gdb-patches; +Cc: Andrew Burgess, Tom Tromey, Simon Sobisch



On 2022-08-17 18:04, Maciej W. Rozycki wrote:
> Consistently with parameters of the PARAM_UINTEGER and PARAM_INTEGER 
> types, return the special value of `None' for a PARAM_ZUINTEGER_UNLIMITED 

I had trouble parsing this sentence, I think adding a comma between
"types" and "return" would help.

> parameter set to `unlimited', fixing an inconsistency introduced with 
> commit 0489430a0e1a ("Handle var_zuinteger and var_zuinteger_unlimited 
> from Python"); cf. PR python/20084.  Adjust the testsuite accordingly.
> 
> This makes all the three parameter types consistent with each other as 
> far as the use of `None' is concerned, and similar to the Guile/Scheme 
> interface where the `#:unlimited' keyword is likewise used.  We have a 
> precedent already documented for a similar API correction:
> 
>  -- Function: gdb.breakpoints ()
>      Return a sequence holding all of GDB's breakpoints.  *Note
>      Breakpoints In Python::, for more information.  In GDB version 7.11
>      and earlier, this function returned 'None' if there were no
>      breakpoints.  This peculiarity was subsequently fixed, and now
>      'gdb.breakpoints' returns an empty sequence in this case.
> 
> made in the past.
> 
> And then we have documentation not matching the interface as far as the 
> value of `None' already returned for parameters of the PARAM_UINTEGER 
> and PARAM_INTEGER types is concerned, and the case of an incorrect 
> assertion for PARAM_UINTEGER and PARAM_ZUINTEGER_UNLIMITED parameters in 
> the sibling Guile/Scheme module making such parameters unusable that has 
> never been reported, both indicating that these features may indeed not 
> be heavily used, and therefore that the risk from such an API change is 
> likely lower than the long-term burden of the inconsistency.

To rephrase, just to make sure I understand right, this is the
inconsistency you'd like to fix:

(gdb) set an-integer unlimited 
(gdb) set an-uinteger unlimited 
(gdb) set a-zuinteger-unlimited unlimited 
(gdb) python print(gdb.parameter('an-integer'))
None
(gdb) python print(gdb.parameter('an-uinteger'))
None
(gdb) python print(gdb.parameter('a-zuinteger-unlimited'))
-1

I'm hesitant about this kind of of breaking changes.  I don't agree with
your reasoning leading you to claim that these features are not heavily
used.  We had and have all kinds of inconsistencies in our MI and Python
API, where the actual API doesn't match the doc, and people usually just
silently work around them.  Also, the fact that Guile was broken doesn't
mean people don't use the equivalent in Python.

The closest thing to empirical data we can have if searching to
occurences on Github.  I just did this search, and there are no hits:

  https://github.com/search?q=PARAM_ZUINTEGER_UNLIMITED+extension%3Apy&type=Code&ref=advsearch&l=&l=

That is, searching for PARAM_ZUINTEGER_UNLIMITED in all the .py files on
Github.  As opposed to PARAM_ZINTEGER, for instance:

  https://github.com/search?q=PARAM_ZINTEGER+extension%3Apy&type=Code&ref=advsearch&l=&l=

Of course, that's not all the code in the world, but that gives an idea.

And I do agree that fixing the API once will reduce the long-term costs
for everybody (us and users bumping in the inconsistency and losing
time).  So, I am fine with fixing PARAM_ZUINTEGER_UNLIMITED in this
case.

However, I am unable to apply your patch locally in order to properly
review it.  Can you send an updated version of the series, after perhaps
pushing the already approved patches that make sense on their own?

Thanks,

Simon

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean
  2022-10-17 13:43   ` Simon Marchi
@ 2022-10-21  7:58     ` Maciej W. Rozycki
  0 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-21  7:58 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, Andrew Burgess, Tom Tromey, Simon Sobisch

On Mon, 17 Oct 2022, Simon Marchi wrote:

> > @@ -742,7 +742,7 @@ pascm_set_param_value_x (param_smob *p_s
> >        if (var.type () == var_uinteger
> >  	  || var.type () == var_zuinteger_unlimited)
> >  	{
> > -	  SCM_ASSERT_TYPE (gdbscm_is_bool (value)
> > +	  SCM_ASSERT_TYPE (scm_is_integer (value)
> 
> Was this just a brainfart when the code was initially written?

 Based on the switch cases immediately above it looks like a copy-&-paste 
or a repeated-pattern mistake to me.

> > @@ -206,3 +380,5 @@ with_test_prefix "previously-ambiguous"
> >      gdb_test "help set print s" "This command is not documented." "set help"
> >      gdb_test "help set print" "set print s -- This command is not documented.*" "general help"
> >  }
> > +
> > +rename scm_param_test_maybe_no_output ""
> 
> Just wondering, what is the intention here, to avoid polluting the
> global namespace?  If so, I appreciate the intention, but given we don't
> do that in thousands of other tests, I'm not sure if it's really useful.

 Yep, just cleaning up after oneself.  I think the knowledge of the more 
obscure TCL features is not so great among people as to expect everyone to 
know this can be done in the first place.

> Anyhow, this patch LGTM:
> 
> Approved-By: Simon Marchi <simon.marchi@polymtl.ca>

 Applied now, thank you for your review.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 3/8] GDB/testsuite: Expand Python integer parameter coverage across all types
  2022-10-17 13:56   ` Simon Marchi
@ 2022-10-21  7:59     ` Maciej W. Rozycki
  0 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-21  7:59 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, Andrew Burgess, Tom Tromey, Simon Sobisch

On Mon, 17 Oct 2022, Simon Marchi wrote:

> > Also verify PARAM_UINTEGER, PARAM_INTEGER, and PARAM_ZINTEGER parameter 
> > types, in addition to PARAM_ZUINTEGER and PARAM_ZUINTEGER_UNLIMITED 
> > already covered, and verify a choice of existing GDB parameters.  Add 
> > verification for reading parameters via `<parameter>.value' in addition 
> > to `gdb.parameter('<parameter>')' as this covers different code paths.
> 
> Thanks:
> 
> Approved-By: Simon Marchi <simon.marchi@polymtl.ca>

 I have pushed this change now, thank you for your review.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 4/8] GDB/Python: Make `None' stand for `unlimited' in setting integer parameters
  2022-10-17 14:26   ` Simon Marchi
@ 2022-10-21  8:03     ` Maciej W. Rozycki
  0 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-21  8:03 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, Andrew Burgess, Tom Tromey, Simon Sobisch

On Mon, 17 Oct 2022, Simon Marchi wrote:

> > Similarly to booleans and following the fix for PR python/29217 make 
> > `gdb.parameter' accept `None' for `unlimited' with parameters of the 
> > PARAM_UINTEGER, PARAM_INTEGER, and PARAM_ZUINTEGER_UNLIMITED types, as 
> > `None' is already returned by parameters of the two former types, so 
> > one might expect to be able to feed it back.  It also makes it possible 
> > to avoid the need to know what the internal integer representation is 
> > for the special setting of `unlimited'.
> 
> If I understand correctly, assigning None used to just raise an
> exception, and now it will be accepted for those kinds of parameters.

 Yes, we currently have:

(gdb) python gdb.set_parameter('listsize', None)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File ".../gdb/data-directory/python/gdb/__init__.py", line 245, in set_parameter
    execute("set " + name + " " + str(value), to_string=True)
gdb.error: No symbol table is loaded.  Use the "file" command.
Error while executing Python code.
(gdb) python test_param_PARAM_UINTEGER.value = None
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError: The value must be integer.
Error while executing Python code.
(gdb) 

etc.  With my change in place these commands silently succeed.

 The only concern I can think of might be where there is an actual symbol 
called `None' in the debuggee.  I guess it can be handled by assigning its 
value to a convenience variable outside Python.

> So, I don't think there are backwards compatibility concerns here.  If
> so:
> 
> Approved-By: Simon Marchi <simon.marchi@polymtl.ca>

 I have also committed this change then, thanks!

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean
  2022-08-17 22:03 ` [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean Maciej W. Rozycki
  2022-10-17 13:43   ` Simon Marchi
@ 2022-10-21 18:44   ` Simon Marchi
  2022-10-21 20:54     ` Maciej W. Rozycki
  1 sibling, 1 reply; 42+ messages in thread
From: Simon Marchi @ 2022-10-21 18:44 UTC (permalink / raw)
  To: Maciej W. Rozycki, gdb-patches; +Cc: Andrew Burgess, Tom Tromey, Simon Sobisch



On 2022-08-17 18:03, Maciej W. Rozycki wrote:
> Do not assert that a value intended for an integer parameter, of either 
> the PARAM_UINTEGER or the PARAM_ZUINTEGER_UNLIMITED type, is boolean,
> causing error messages such as:
> 
> ERROR: In procedure make-parameter:
> ERROR: In procedure gdbscm_make_parameter: Wrong type argument in position 15 (expecting integer or #:unlimited): 3
> Error while executing Scheme code.
> 
> when initialization with a number is attempted.  Instead assert that it 
> is integer.  Keep matching `#:unlimited' keyword as an alternative.  Add 
> suitable test cases.
> ---
> Hi,
> 
>  Probably obvious, and shows how much use this code gets.
> 
>   Maciej
> 
> New change in v6.

Hmm, I see this failure now:

    guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)^M
    ERROR: In procedure set-parameter-value!:^M
    In procedure gdbscm_set_parameter_value_x: Wrong type argument in position 2 (expecting integer): #:unlimited^M
    Error while executing Scheme code.^M
    (gdb) FAIL: gdb.guile/scm-parameter.exp: kind=PARAM_ZINTEGER: test-PARAM_ZINTEGER-param: guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)

This is with Guile 3.0, if that matters.

Simon


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean
  2022-10-21 18:44   ` Simon Marchi
@ 2022-10-21 20:54     ` Maciej W. Rozycki
  2022-10-22  0:48       ` Simon Marchi
  0 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-21 20:54 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, Andrew Burgess, Tom Tromey, Simon Sobisch

On Fri, 21 Oct 2022, Simon Marchi wrote:

> Hmm, I see this failure now:
> 
>     guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)^M
>     ERROR: In procedure set-parameter-value!:^M
>     In procedure gdbscm_set_parameter_value_x: Wrong type argument in position 2 (expecting integer): #:unlimited^M
>     Error while executing Scheme code.^M
>     (gdb) FAIL: gdb.guile/scm-parameter.exp: kind=PARAM_ZINTEGER: test-PARAM_ZINTEGER-param: guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)
> 
> This is with Guile 3.0, if that matters.

 It's not a failure, the "ERROR: ..." message, perhaps confusingly, comes 
from GDB under test rather than the DejaGNU test harness and therefore it 
doesn't score as a test error or count towards test results.  The context 
is:

(gdb) PASS: gdb.guile/scm-parameter.exp: kind=PARAM_ZINTEGER: test-PARAM_ZINTEGER-param: PARAM_ZINTEGER parameter value (2)
guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)
ERROR: In procedure set-parameter-value!:
ERROR: In procedure gdbscm_set_parameter_value_x: Wrong type argument in position 2 (expecting integer): #:unlimited
Error while executing Scheme code.
(gdb) PASS: gdb.guile/scm-parameter.exp: kind=PARAM_ZINTEGER: test-PARAM_ZINTEGER-param: guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)

and the test case requires that message to be there to pass:

    set param_integer_error \
	"ERROR: In procedure set-parameter-value!:\r\nERROR: In procedure\
	 gdbscm_set_parameter_value_x: Wrong type argument in position 2\
	 \\(expecting integer\\): #:unlimited\r\nError while executing Scheme\
	 code\\."

so there's nothing to worry about.  In other words the test case verifies 
that a particular error message is printed by GDB when supplied with a 
bogus command.  Thanks for your meticulousness though!

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean
  2022-10-21 20:54     ` Maciej W. Rozycki
@ 2022-10-22  0:48       ` Simon Marchi
  0 siblings, 0 replies; 42+ messages in thread
From: Simon Marchi @ 2022-10-22  0:48 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches, Andrew Burgess, Tom Tromey, Simon Sobisch



On 2022-10-21 16:54, Maciej W. Rozycki wrote:
> On Fri, 21 Oct 2022, Simon Marchi wrote:
> 
>> Hmm, I see this failure now:
>>
>>     guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)^M
>>     ERROR: In procedure set-parameter-value!:^M
>>     In procedure gdbscm_set_parameter_value_x: Wrong type argument in position 2 (expecting integer): #:unlimited^M
>>     Error while executing Scheme code.^M
>>     (gdb) FAIL: gdb.guile/scm-parameter.exp: kind=PARAM_ZINTEGER: test-PARAM_ZINTEGER-param: guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)
>>
>> This is with Guile 3.0, if that matters.
> 
>  It's not a failure, the "ERROR: ..." message, perhaps confusingly, comes 
> from GDB under test rather than the DejaGNU test harness and therefore it 
> doesn't score as a test error or count towards test results.  The context 
> is:
> 
> (gdb) PASS: gdb.guile/scm-parameter.exp: kind=PARAM_ZINTEGER: test-PARAM_ZINTEGER-param: PARAM_ZINTEGER parameter value (2)
> guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)
> ERROR: In procedure set-parameter-value!:
> ERROR: In procedure gdbscm_set_parameter_value_x: Wrong type argument in position 2 (expecting integer): #:unlimited
> Error while executing Scheme code.
> (gdb) PASS: gdb.guile/scm-parameter.exp: kind=PARAM_ZINTEGER: test-PARAM_ZINTEGER-param: guile (set-parameter-value! test-PARAM_ZINTEGER-param #:unlimited)
> 
> and the test case requires that message to be there to pass:
> 
>     set param_integer_error \
> 	"ERROR: In procedure set-parameter-value!:\r\nERROR: In procedure\
> 	 gdbscm_set_parameter_value_x: Wrong type argument in position 2\
> 	 \\(expecting integer\\): #:unlimited\r\nError while executing Scheme\
> 	 code\\."
> 
> so there's nothing to worry about.  In other words the test case verifies 
> that a particular error message is printed by GDB when supplied with a 
> bogus command.  Thanks for your meticulousness though!

But in my case, it's really a DejaGNU FAIL.

If you look carefully at the differences between our outputs, yours has
this line:

  ERROR: In procedure gdbscm_set_parameter_value_x: Wrong type argument in position 2 (expecting integer): #:unlimited

while mine has:

  In procedure gdbscm_set_parameter_value_x: Wrong type argument in position 2 (expecting integer): #:unlimited^M

In other words, mine doesn't have ERROR printed on that line, for some
reason.

Simon

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-08-17 22:04 ` [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited' Maciej W. Rozycki
  2022-08-18  6:08   ` Eli Zaretskii
  2022-10-17 15:02   ` Simon Marchi
@ 2022-10-26 11:58   ` Luis Machado
  2022-10-29 13:52     ` Maciej W. Rozycki
  2 siblings, 1 reply; 42+ messages in thread
From: Luis Machado @ 2022-10-26 11:58 UTC (permalink / raw)
  To: Maciej W. Rozycki, gdb-patches; +Cc: Simon Sobisch, Tom Tromey, Andrew Burgess

Hi,

I'm seeing a number of new failures on armhf Ubuntu 20.04 for both gdb.python/py-format-address.exp and gdb.python/py-parameter.exp.

Since this series touched those, I'm wondering if those are known.

FAIL: gdb.python/py-format-address.exp: symbol_filename=off: gdb.format_address, result should have an offset
FAIL: gdb.python/py-format-address.exp: symbol_filename=on: gdb.format_address, result should have an offset
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test default value
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test default value via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 0
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 1
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 5
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -1
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -1 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -5 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 0 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 1
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 1 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 5 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of None
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of None via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to -1}
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to -5}
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to None}

On 8/17/22 23:04, Maciej W. Rozycki wrote:
> Consistently with parameters of the PARAM_UINTEGER and PARAM_INTEGER
> types return the special value of `None' for a PARAM_ZUINTEGER_UNLIMITED
> parameter set to `unlimited', fixing an inconsistency introduced with
> commit 0489430a0e1a ("Handle var_zuinteger and var_zuinteger_unlimited
> from Python"); cf. PR python/20084.  Adjust the testsuite accordingly.
> 
> This makes all the three parameter types consistent with each other as
> far as the use of `None' is concerned, and similar to the Guile/Scheme
> interface where the `#:unlimited' keyword is likewise used.  We have a
> precedent already documented for a similar API correction:
> 
>   -- Function: gdb.breakpoints ()
>       Return a sequence holding all of GDB's breakpoints.  *Note
>       Breakpoints In Python::, for more information.  In GDB version 7.11
>       and earlier, this function returned 'None' if there were no
>       breakpoints.  This peculiarity was subsequently fixed, and now
>       'gdb.breakpoints' returns an empty sequence in this case.
> 
> made in the past.
> 
> And then we have documentation not matching the interface as far as the
> value of `None' already returned for parameters of the PARAM_UINTEGER
> and PARAM_INTEGER types is concerned, and the case of an incorrect
> assertion for PARAM_UINTEGER and PARAM_ZUINTEGER_UNLIMITED parameters in
> the sibling Guile/Scheme module making such parameters unusable that has
> never been reported, both indicating that these features may indeed not
> be heavily used, and therefore that the risk from such an API change is
> likely lower than the long-term burden of the inconsistency.
> 
> And where the value read from a parameter is only used for presentation
> purposes, then such a change is expected to be transparent.
> ---
> Changes from v5:
> 
> - Refer to Python parameter types in the change description rather than
>    underlying GDB variable types in preparation for breaking the tight
>    coupling between the two later in this series.
> 
> - Document existing and updated semantics in the GDB manual.
> 
> - Update the testsuite adjustment to fit in the now expanded test case.
> 
> - Add a NEWS entry.
> 
> No change from v4.
> 
> New change in v4.
> ---
>   gdb/NEWS                                  |    7 +++++++
>   gdb/doc/python.texi                       |   30 +++++++++++++++++++-----------
>   gdb/python/python.c                       |   10 +++++++++-
>   gdb/testsuite/gdb.python/py-parameter.exp |   16 +++++-----------
>   4 files changed, 40 insertions(+), 23 deletions(-)
> 
> Index: src/gdb/NEWS
> ===================================================================
> --- src.orig/gdb/NEWS
> +++ src/gdb/NEWS
> @@ -175,6 +175,13 @@ GNU/Linux/LoongArch (gdbserver)	loongarc
>        gdb.BreakpointLocation objects specifying the locations where the
>        breakpoint is inserted into the debuggee.
>   
> +  ** Parameters of gdb.PARAM_ZUINTEGER_UNLIMITED type now return the
> +     value of None for the 'unlimited' setting, consistently with
> +     parameters of gdb.PARAM_UINTEGER and gdb.PARAM_INTEGER types.
> +     Parameters of all the three types now accept the value of None
> +     to mean 'unlimited'.  The use of internal integer representation
> +     for the 'unlimited' setting is now deprecated.
> +
>   * New features in the GDB remote stub, GDBserver
>   
>     ** GDBserver is now supported on LoongArch GNU/Linux.
> Index: src/gdb/doc/python.texi
> ===================================================================
> --- src.orig/gdb/doc/python.texi
> +++ src/gdb/doc/python.texi
> @@ -4598,14 +4598,16 @@ Python, true and false are represented u
>   @findex PARAM_UINTEGER
>   @findex gdb.PARAM_UINTEGER
>   @item gdb.PARAM_UINTEGER
> -The value is an unsigned integer.  The value of 0 should be
> -interpreted to mean ``unlimited''.
> +The value is an unsigned integer.  The value of @code{None} should be
> +interpreted to mean ``unlimited'', and the value of 0 is reserved and
> +should not be used.
>   
>   @findex PARAM_INTEGER
>   @findex gdb.PARAM_INTEGER
>   @item gdb.PARAM_INTEGER
> -The value is a signed integer.  The value of 0 should be interpreted
> -to mean ``unlimited''.
> +The value is a signed integer.  The value of @code{None} should be
> +interpreted to mean ``unlimited'', and the value of 0 is reserved and
> +should not be used.
>   
>   @findex PARAM_STRING
>   @findex gdb.PARAM_STRING
> @@ -4635,21 +4637,27 @@ The value is a filename.  This is just l
>   @findex PARAM_ZINTEGER
>   @findex gdb.PARAM_ZINTEGER
>   @item gdb.PARAM_ZINTEGER
> -The value is an integer.  This is like @code{PARAM_INTEGER}, except 0
> -is interpreted as itself.
> +The value is a signed integer.  This is like @code{PARAM_INTEGER},
> +except that 0 is allowed and the value of @code{None} is not supported.
>   
>   @findex PARAM_ZUINTEGER
>   @findex gdb.PARAM_ZUINTEGER
>   @item gdb.PARAM_ZUINTEGER
> -The value is an unsigned integer.  This is like @code{PARAM_INTEGER},
> -except 0 is interpreted as itself, and the value cannot be negative.
> +The value is an unsigned integer.  This is like @code{PARAM_UINTEGER},
> +except that 0 is allowed and the value of @code{None} is not supported.
>   
>   @findex PARAM_ZUINTEGER_UNLIMITED
>   @findex gdb.PARAM_ZUINTEGER_UNLIMITED
>   @item gdb.PARAM_ZUINTEGER_UNLIMITED
> -The value is a signed integer.  This is like @code{PARAM_ZUINTEGER},
> -except the special value -1 should be interpreted to mean
> -``unlimited''.  Other negative values are not allowed.
> +The value is a signed integer.  This is like @code{PARAM_INTEGER}
> +including that the value of @code{None} should be interpreted to mean
> +``unlimited'', except that 0 is allowed, and the value cannot be negative.
> +
> +In GDB version 12 and earlier, a parameter of this type when read would
> +return -1 rather than @code{None} for the setting of ``unlimited''.
> +This peculiarity was subsequently fixed, for consistency with parameters
> +of @code{PARAM_UINTEGER} and @code{PARAM_INTEGER} types, so that all the
> +three types return the value of @code{None} for ``unlimited''.
>   
>   @findex PARAM_ENUM
>   @findex gdb.PARAM_ENUM
> Index: src/gdb/python/python.c
> ===================================================================
> --- src.orig/gdb/python/python.c
> +++ src/gdb/python/python.c
> @@ -509,9 +509,17 @@ gdbpy_parameter_value (const setting &va
>   	Py_RETURN_NONE;
>         /* Fall through.  */
>       case var_zinteger:
> -    case var_zuinteger_unlimited:
>         return gdb_py_object_from_longest (var.get<int> ()).release ();
>   
> +    case var_zuinteger_unlimited:
> +      {
> +	int val = var.get<int> ();
> +
> +	if (val == -1)
> +	  Py_RETURN_NONE;
> +	return gdb_py_object_from_longest (val).release ();
> +      }
> +
>       case var_uinteger:
>         {
>   	unsigned int val = var.get<unsigned int> ();
> Index: src/gdb/testsuite/gdb.python/py-parameter.exp
> ===================================================================
> --- src.orig/gdb/testsuite/gdb.python/py-parameter.exp
> +++ src/gdb/testsuite/gdb.python/py-parameter.exp
> @@ -346,22 +346,16 @@ proc_with_prefix test_gdb_parameter { }
>   	    "listsize" {
>   		set param_get_zero None
>   		set param_get_minus_one -1
> -		set param_get_none None
> -		set param_get_unlimited None
>   		set param_set_minus_one ""
>   	    }
>   	    "print elements" {
>   		set param_get_zero None
>   		set param_get_minus_one None
> -		set param_get_none None
> -		set param_get_unlimited None
>   		set param_set_minus_one $param_range_error
>   	    }
>   	    "max-completions" {
>   		set param_get_zero 0
> -		set param_get_minus_one -1
> -		set param_get_none -1
> -		set param_get_unlimited -1
> +		set param_get_minus_one None
>   		set param_set_minus_one ""
>   	    }
>   	    default {
> @@ -392,13 +386,13 @@ proc_with_prefix test_gdb_parameter { }
>   	    "test set to None"
>   
>   	gdb_test "python print(gdb.parameter('$param'))" \
> -	    $param_get_none "test value of None"
> +	    None "test value of None"
>   
>   	gdb_test_no_output "python gdb.set_parameter('$param', 'unlimited')" \
>   	    "test set to 'unlimited'"
>   
>   	gdb_test "python print(gdb.parameter('$param'))" \
> -	    $param_get_unlimited "test value of 'unlimited'"
> +	    None "test value of 'unlimited'"
>       }
>   
>       clean_restart
> @@ -468,9 +462,9 @@ proc_with_prefix test_integer_parameter
>   	    }
>   	    PARAM_ZUINTEGER_UNLIMITED {
>   		set param_get_zero 0
> -		set param_get_minus_one -1
> +		set param_get_minus_one None
>   		set param_get_minus_five 1
> -		set param_get_none -1
> +		set param_get_none None
>   		set param_set_minus_one ""
>   		set param_set_minus_five $param_range_error
>   		set param_set_none ""


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-26 11:58   ` Luis Machado
@ 2022-10-29 13:52     ` Maciej W. Rozycki
  2022-10-31  8:14       ` Luis Machado
  0 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-29 13:52 UTC (permalink / raw)
  To: Luis Machado; +Cc: gdb-patches, Simon Sobisch, Tom Tromey, Andrew Burgess

Hi Luis,

> I'm seeing a number of new failures on armhf Ubuntu 20.04 for both
> gdb.python/py-format-address.exp and gdb.python/py-parameter.exp.
> 
> Since this series touched those, I'm wondering if those are known.
> 
> FAIL: gdb.python/py-format-address.exp: symbol_filename=off:
> gdb.format_address, result should have an offset
> FAIL: gdb.python/py-format-address.exp: symbol_filename=on:
> gdb.format_address, result should have an offset
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test default value
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test default value via gdb.parameter
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test set to 0
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test set to 1
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test set to 5
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of -1
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of -1 via gdb.parameter
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of -5 via gdb.parameter
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of 0 via gdb.parameter
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of 1
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of 1 via gdb.parameter
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of 5 via gdb.parameter
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of None
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: test value of None via gdb.parameter
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: {test set to -1}
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: {test set to -5}
> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
> kind=PARAM_UINTEGER: {test set to None}

 I haven't gone through all of them in detail, but based on my contents 
of gdb.log the first three are surely not related.  Please post the full 
gdb.log contents for these failures or run `git bisect' on GDB to track 
down the likely offender.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-17 15:02   ` Simon Marchi
@ 2022-10-29 15:58     ` Maciej W. Rozycki
  2022-10-31 13:00       ` Simon Marchi
  0 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-29 15:58 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, Andrew Burgess, Tom Tromey, Simon Sobisch

On Mon, 17 Oct 2022, Simon Marchi wrote:

> > Consistently with parameters of the PARAM_UINTEGER and PARAM_INTEGER 
> > types, return the special value of `None' for a PARAM_ZUINTEGER_UNLIMITED 
> 
> I had trouble parsing this sentence, I think adding a comma between
> "types" and "return" would help.

 Fixed in v7.

> > parameter set to `unlimited', fixing an inconsistency introduced with 
> > commit 0489430a0e1a ("Handle var_zuinteger and var_zuinteger_unlimited 
> > from Python"); cf. PR python/20084.  Adjust the testsuite accordingly.
> > 
> > This makes all the three parameter types consistent with each other as 
> > far as the use of `None' is concerned, and similar to the Guile/Scheme 
> > interface where the `#:unlimited' keyword is likewise used.  We have a 
> > precedent already documented for a similar API correction:
> > 
> >  -- Function: gdb.breakpoints ()
> >      Return a sequence holding all of GDB's breakpoints.  *Note
> >      Breakpoints In Python::, for more information.  In GDB version 7.11
> >      and earlier, this function returned 'None' if there were no
> >      breakpoints.  This peculiarity was subsequently fixed, and now
> >      'gdb.breakpoints' returns an empty sequence in this case.
> > 
> > made in the past.
> > 
> > And then we have documentation not matching the interface as far as the 
> > value of `None' already returned for parameters of the PARAM_UINTEGER 
> > and PARAM_INTEGER types is concerned, and the case of an incorrect 
> > assertion for PARAM_UINTEGER and PARAM_ZUINTEGER_UNLIMITED parameters in 
> > the sibling Guile/Scheme module making such parameters unusable that has 
> > never been reported, both indicating that these features may indeed not 
> > be heavily used, and therefore that the risk from such an API change is 
> > likely lower than the long-term burden of the inconsistency.
> 
> To rephrase, just to make sure I understand right, this is the
> inconsistency you'd like to fix:
> 
> (gdb) set an-integer unlimited 
> (gdb) set an-uinteger unlimited 
> (gdb) set a-zuinteger-unlimited unlimited 
> (gdb) python print(gdb.parameter('an-integer'))
> None
> (gdb) python print(gdb.parameter('an-uinteger'))
> None
> (gdb) python print(gdb.parameter('a-zuinteger-unlimited'))
> -1

 Correct.  Please note that the -1 value for PARAM_ZUINTEGER_UNLIMITED was 
also only added when `None' had been already used for PARAM_UINTEGER and 
PARAM_ZINTEGER types, so it was wrong right from the beginning.

> I'm hesitant about this kind of of breaking changes.  I don't agree with
> your reasoning leading you to claim that these features are not heavily
> used.  We had and have all kinds of inconsistencies in our MI and Python
> API, where the actual API doesn't match the doc, and people usually just
> silently work around them.  Also, the fact that Guile was broken doesn't
> mean people don't use the equivalent in Python.

 Fair enough, especially on the last point.

 My overall impression of the Python technical culture has sadly been that 
things largely happen on an ad-hoc basis there, with little structure or 
consistency.  I guess this is an unfortunate side effect resulting from 
the low entry barrier, not by itself bad, Python presents to newcomers to 
computer programming.

> The closest thing to empirical data we can have if searching to
> occurences on Github.  I just did this search, and there are no hits:
> 
>   https://github.com/search?q=PARAM_ZUINTEGER_UNLIMITED+extension%3Apy&type=Code&ref=advsearch&l=&l=
> 
> That is, searching for PARAM_ZUINTEGER_UNLIMITED in all the .py files on
> Github.  As opposed to PARAM_ZINTEGER, for instance:
> 
>   https://github.com/search?q=PARAM_ZINTEGER+extension%3Apy&type=Code&ref=advsearch&l=&l=
> 
> Of course, that's not all the code in the world, but that gives an idea.

 Thank you for doing this research.  I wasn't aware of this Github's 
feature (I don't usually use Github).

> And I do agree that fixing the API once will reduce the long-term costs
> for everybody (us and users bumping in the inconsistency and losing
> time).  So, I am fine with fixing PARAM_ZUINTEGER_UNLIMITED in this
> case.

 Good.  Given that you are in favour to making this change and Andrew was 
against, do you think we need another opinion?  Have we reached consensus?

> However, I am unable to apply your patch locally in order to properly
> review it.  Can you send an updated version of the series, after perhaps
> pushing the already approved patches that make sense on their own?

 I'm not sure what happened here, I had no conflicts in the rebase (but 
then maybe I rebased already after I posted v6 and forgot about it).  I 
have now posted the remaining parts of the series rebased against current 
master.

 Thank you for your review.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-29 13:52     ` Maciej W. Rozycki
@ 2022-10-31  8:14       ` Luis Machado
  2022-10-31 12:37         ` Luis Machado
  0 siblings, 1 reply; 42+ messages in thread
From: Luis Machado @ 2022-10-31  8:14 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches, Simon Sobisch, Tom Tromey, Andrew Burgess

Hi Maciej,

On 10/29/22 14:52, Maciej W. Rozycki wrote:
> Hi Luis,
> 
>> I'm seeing a number of new failures on armhf Ubuntu 20.04 for both
>> gdb.python/py-format-address.exp and gdb.python/py-parameter.exp.
>>
>> Since this series touched those, I'm wondering if those are known.
>>
>> FAIL: gdb.python/py-format-address.exp: symbol_filename=off:
>> gdb.format_address, result should have an offset
>> FAIL: gdb.python/py-format-address.exp: symbol_filename=on:
>> gdb.format_address, result should have an offset
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test default value
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test default value via gdb.parameter
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test set to 0
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test set to 1
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test set to 5
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of -1
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of -1 via gdb.parameter
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of -5 via gdb.parameter
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of 0 via gdb.parameter
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of 1
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of 1 via gdb.parameter
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of 5 via gdb.parameter
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of None
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: test value of None via gdb.parameter
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: {test set to -1}
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: {test set to -5}
>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>> kind=PARAM_UINTEGER: {test set to None}
> 
>   I haven't gone through all of them in detail, but based on my contents
> of gdb.log the first three are surely not related.  Please post the full
> gdb.log contents for these failures or run `git bisect' on GDB to track
> down the likely offender.

No worries. Let me do some bisecting to find out more. I thought I'd check in
case these were known.

Thanks,
Luis

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-31  8:14       ` Luis Machado
@ 2022-10-31 12:37         ` Luis Machado
  2022-10-31 13:08           ` Maciej W. Rozycki
  0 siblings, 1 reply; 42+ messages in thread
From: Luis Machado @ 2022-10-31 12:37 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches, Simon Sobisch, Tom Tromey, Andrew Burgess

[-- Attachment #1: Type: text/plain, Size: 3323 bytes --]

On 10/31/22 08:14, Luis Machado wrote:
> Hi Maciej,
> 
> On 10/29/22 14:52, Maciej W. Rozycki wrote:
>> Hi Luis,
>>
>>> I'm seeing a number of new failures on armhf Ubuntu 20.04 for both
>>> gdb.python/py-format-address.exp and gdb.python/py-parameter.exp.
>>>
>>> Since this series touched those, I'm wondering if those are known.
>>>
>>> FAIL: gdb.python/py-format-address.exp: symbol_filename=off:
>>> gdb.format_address, result should have an offset
>>> FAIL: gdb.python/py-format-address.exp: symbol_filename=on:
>>> gdb.format_address, result should have an offset
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test default value
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test default value via gdb.parameter
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test set to 0
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test set to 1
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test set to 5
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of -1
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of -1 via gdb.parameter
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of -5 via gdb.parameter
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of 0 via gdb.parameter
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of 1
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of 1 via gdb.parameter
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of 5 via gdb.parameter
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of None
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: test value of None via gdb.parameter
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: {test set to -1}
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: {test set to -5}
>>> FAIL: gdb.python/py-parameter.exp: test_integer_parameter:
>>> kind=PARAM_UINTEGER: {test set to None}
>>
>>   I haven't gone through all of them in detail, but based on my contents
>> of gdb.log the first three are surely not related.  Please post the full
>> gdb.log contents for these failures or run `git bisect' on GDB to track
>> down the likely offender.
> 
> No worries. Let me do some bisecting to find out more. I thought I'd check in
> case these were known.
> 
> Thanks,
> Luis

A bisect confirmed commit e7e1f2034567207e5e01cb75ea2ffd568a64e84d changed the gdb.python/py-parameter.exp behavior from PASS to FAIL. gdb.python/py-format.exp was failing before.

I've attached the relevant gdb.log and gdb.sum.

I don't fully understand the issue here, so I can't be sure this is a real regression or something that was broken before but this patch just happened to uncover it.

Do let me know if you need some more info.

Regards,
Luis

[-- Attachment #2: gdb.log --]
[-- Type: text/x-log, Size: 88939 bytes --]

Native configuration is armv8l-unknown-linux-gnueabihf

		=== gdb tests ===

Schedule of variations:
    unix

Running target unix
Using /usr/share/dejagnu/baseboards/unix.exp as board description file for target.
Using /usr/share/dejagnu/config/unix.exp as generic interface file for target.
Using /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/config/unix.exp as tool-and-target-specific interface file.
Running /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python/py-parameter.exp ...
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python print ('test')
test
(gdb) python print (gdb.parameter ('directories'))
/builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) PASS: gdb.python/py-parameter.exp: test_directories: python print (gdb.parameter ('directories'))
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) show data-directory
GDB's data directory is "/builds/binutils-gdb-armhf-jammy/gdb/data-directory".
(gdb) PASS: gdb.python/py-parameter.exp: test_data_directory: find the initial data-directory value
python print (gdb.parameter ('data-directory'))
/builds/binutils-gdb-armhf-jammy/gdb/data-directory
(gdb) PASS: gdb.python/py-parameter.exp: test_data_directory: python print (gdb.parameter ('data-directory'))
set data-directory ./outputs/gdb.python/py-parameter
(gdb) PASS: gdb.python/py-parameter.exp: test_data_directory: set data-directory ./outputs/gdb.python/py-parameter
python print (gdb.parameter ('data-directory'))
/builds/binutils-gdb-armhf-jammy/gdb/testsuite/outputs/gdb.python/py-parameter
(gdb) PASS: gdb.python/py-parameter.exp: test_data_directory: python sees absolute version of data-directory path
show data-directory
GDB's data directory is "/builds/binutils-gdb-armhf-jammy/gdb/testsuite/outputs/gdb.python/py-parameter".
(gdb) PASS: gdb.python/py-parameter.exp: test_data_directory: check modified data-directory at the CLI
set data-directory /builds/binutils-gdb-armhf-jammy/gdb/data-directory
(gdb) PASS: gdb.python/py-parameter.exp: test_data_directory: set data-directory back to its original value
show data-directory
GDB's data directory is "/builds/binutils-gdb-armhf-jammy/gdb/data-directory".
(gdb) PASS: gdb.python/py-parameter.exp: test_data_directory: check original data-directory was restored at the CLI
python print (gdb.parameter ('data-directory'))
/builds/binutils-gdb-armhf-jammy/gdb/data-directory
(gdb) PASS: gdb.python/py-parameter.exp: test_data_directory: python sees restored data-directory value
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 1: python
class TestParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 2: class TestParam (gdb.Parameter):
   """When enabled, test param does something useful. When disabled, does nothing."""
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 3:    """When enabled, test param does something useful. When disabled, does nothing."""
   show_doc = "Show the state of the boolean test-param"
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 4:    show_doc = "Show the state of the boolean test-param"
   set_doc = "Set the state of the boolean test-param"
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 5:    set_doc = "Set the state of the boolean test-param"
   def get_show_string (self, pvalue):
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 6:    def get_show_string (self, pvalue):
      return "The state of the Test Parameter is " + pvalue
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 7:       return "The state of the Test Parameter is " + pvalue
   def get_set_string (self):
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 8:    def get_set_string (self):
      val = "on"
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 9:       val = "on"
      if (self.value == False):
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 10:       if (self.value == False):
         val = "off"
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 11:          val = "off"
      return "Test Parameter has been set to " + val
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 12:       return "Test Parameter has been set to " + val
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 13:    def __init__ (self, name):
      super (TestParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 14:       super (TestParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
      self.value = True
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 15:       self.value = True
test_param = TestParam ('print test-param')
>PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 16: test_param = TestParam ('print test-param')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 17: end
python print (test_param.value)
True
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test boolean parameter value is True
show print test-param
The state of the Test Parameter is on
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: show parameter on
set print test-param off
Test Parameter has been set to off
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: turn off parameter
show print test-param
The state of the Test Parameter is off
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: show parameter off
python print (test_param.value)
False
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test boolean parameter value is False
python gdb.set_parameter('print test-param', True)
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: set boolean parameter using set_parameter
python print(gdb.parameter('print test-param'))
True
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: get boolean parameter using gdb.parameter
help show print test-param
Show the state of the boolean test-param
When enabled, test param does something useful. When disabled, does nothing.
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test show help
help set print test-param
Set the state of the boolean test-param
When enabled, test param does something useful. When disabled, does nothing.
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test set help
help set print
set print, set pr, set p
Generic command for setting how things print.

List of set print subcommands:

set print address -- Set printing of addresses.
set print array -- Set pretty formatting of arrays.
set print array-indexes -- Set printing of array indexes.
set print asm-demangle -- Set demangling of C++/ObjC names in disassembly listings.
set print demangle -- Set demangling of encoded C++/ObjC names when displaying symbols.
set print elements -- Set limit on string chars or array elements to print.
set print entry-values -- Set printing of function arguments at function entry.
set print finish -- Set whether `finish' prints the return value.
set print frame-arguments -- Set printing of non-scalar frame arguments.
set print frame-info -- Set printing of frame information.
set print inferior-events -- Set printing of inferior events (such as inferior start and exit).
set print max-depth -- Set maximum print depth for nested structures, unions and arrays.
set print max-symbolic-offset -- Set the largest offset that will be printed in <SYMBOL+1234> form.
set print memory-tag-violations -- Set printing of memory tag violations for pointers.
set print nibbles -- Set whether to print binary values in groups of four bits.
set print null-stop -- Set printing of char arrays to stop at first null char.
set print object -- Set printing of C++ virtual function tables.
set print pascal_static-members -- Set printing of pascal static members.
set print pretty -- Set pretty formatting of structures.
set print raw-frame-arguments -- Set whether to print frame arguments in raw form.
set print raw-values -- Set whether to print values in raw form.
set print repeats -- Set threshold for repeated print elements.
set print sevenbit-strings -- Set printing of 8-bit characters in strings as \nnn.
set print static-members -- Set printing of C++ static members.
set print symbol -- Set printing of symbol names when printing pointers.
set print symbol-filename -- Set printing of source filename and line number with <SYMBOL>.
set print symbol-loading -- Set printing of symbol loading messages.
set print test-param -- Set the state of the boolean test-param
set print thread-events -- Set printing of thread events (such as thread start and exit).
set print type -- Generic command for showing type-printing settings.
set print union -- Set printing of unions interior to structures.
set print vtbl -- Set printing of C++ virtual function tables.

Type "help set print" followed by set print subcommand name for full documentation.
Type "apropos word" to search for commands related to "word".
Type "apropos -v word" for full documentation of commands related to "word".
Command name abbreviations are allowed if unambiguous.
(gdb) PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test general help
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 1: python
class TestEnumParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 2: class TestEnumParam (gdb.Parameter):
   """When set, test param does something useful. When disabled, does nothing."""
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 3:    """When set, test param does something useful. When disabled, does nothing."""
   show_doc = "Show the state of the enum"
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 4:    show_doc = "Show the state of the enum"
   set_doc = "Set the state of the enum"
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 5:    set_doc = "Set the state of the enum"
   def get_show_string (self, pvalue):
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 6:    def get_show_string (self, pvalue):
      return "The state of the enum is " + pvalue
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 7:       return "The state of the enum is " + pvalue
   def get_set_string (self):
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 8:    def get_set_string (self):
      return "The state of the enum has been set to " + self.value
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 9:       return "The state of the enum has been set to " + self.value
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 10:    def __init__ (self, name):
      super (TestEnumParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ENUM, ["one", "two"])
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 11:       super (TestEnumParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ENUM, ["one", "two"])
      self.value = "one"
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 12:       self.value = "one"
test_enum_param = TestEnumParam ('print test-enum-param')
>PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 13: test_enum_param = TestEnumParam ('print test-enum-param')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 14: end
python print (test_enum_param.value)
one
(gdb) PASS: gdb.python/py-parameter.exp: test_enum_parameter: test enum parameter value is one
show print test-enum-param
The state of the enum is one
(gdb) PASS: gdb.python/py-parameter.exp: test_enum_parameter: show parameter is initial value
set print test-enum-param two
The state of the enum has been set to two
(gdb) PASS: gdb.python/py-parameter.exp: test_enum_parameter: set enum to two
show print test-enum-param
The state of the enum is two
(gdb) PASS: gdb.python/py-parameter.exp: test_enum_parameter: show parameter is new value
python print (test_enum_param.value)
two
(gdb) PASS: gdb.python/py-parameter.exp: test_enum_parameter: test enum parameter value is two
set print test-enum-param three
Undefined item: "three".
(gdb) PASS: gdb.python/py-parameter.exp: test_enum_parameter: set invalid enum parameter
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 1: python
class TestFileParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 2: class TestFileParam (gdb.Parameter):
   """When set, test param does something useful. When disabled, does nothing."""
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 3:    """When set, test param does something useful. When disabled, does nothing."""
   show_doc = "Show the name of the file"
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 4:    show_doc = "Show the name of the file"
   set_doc = "Set the name of the file"
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 5:    set_doc = "Set the name of the file"
   def get_show_string (self, pvalue):
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 6:    def get_show_string (self, pvalue):
      return "The name of the file is " + pvalue
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 7:       return "The name of the file is " + pvalue
   def get_set_string (self):
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 8:    def get_set_string (self):
      return "The name of the file has been changed to " + self.value
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 9:       return "The name of the file has been changed to " + self.value
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 10:    def __init__ (self, name):
      super (TestFileParam, self).__init__ (name, gdb.COMMAND_FILES, gdb.PARAM_FILENAME)
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 11:       super (TestFileParam, self).__init__ (name, gdb.COMMAND_FILES, gdb.PARAM_FILENAME)
      self.value = "foo.txt"
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 12:       self.value = "foo.txt"
test_file_param = TestFileParam ('test-file-param')
>PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 13: test_file_param = TestFileParam ('test-file-param')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 14: end
python print (test_file_param.value)
foo.txt
(gdb) PASS: gdb.python/py-parameter.exp: test_file_parameter: test file parameter value
show test-file-param
The name of the file is foo.txt
(gdb) PASS: gdb.python/py-parameter.exp: test_file_parameter: show initial file value
set test-file-param bar.txt
The name of the file has been changed to bar.txt
(gdb) PASS: gdb.python/py-parameter.exp: test_file_parameter: set new file parameter
show test-file-param
The name of the file is bar.txt
(gdb) PASS: gdb.python/py-parameter.exp: test_file_parameter: show new file value
python print (test_file_param.value)
bar.txt
(gdb) PASS: gdb.python/py-parameter.exp: test_file_parameter: test new file parameter value
set test-file-param
Argument required (filename to set it to.).
(gdb) PASS: gdb.python/py-parameter.exp: test_file_parameter: set test-file-param
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 1: python
class TestUndocParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 2: class TestUndocParam (gdb.Parameter):
   def get_show_string (self, pvalue):
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 3:    def get_show_string (self, pvalue):
      return "The state of the Test Parameter is " + pvalue
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 4:       return "The state of the Test Parameter is " + pvalue
   def get_set_string (self):
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 5:    def get_set_string (self):
      val = "on"
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 6:       val = "on"
      if (self.value == False):
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 7:       if (self.value == False):
         val = "off"
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 8:          val = "off"
      return "Test Parameter has been set to " + val
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 9:       return "Test Parameter has been set to " + val
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 10:    def __init__ (self, name):
      super (TestUndocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 11:       super (TestUndocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
      self.value = True
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 12:       self.value = True
test_undoc_param = TestUndocParam ('print test-undoc-param')
>PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 13: test_undoc_param = TestUndocParam ('print test-undoc-param')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 14: end
show print test-undoc-param
The state of the Test Parameter is on
(gdb) PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: show parameter on
set print test-undoc-param off
Test Parameter has been set to off
(gdb) PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: turn off parameter
show print test-undoc-param
The state of the Test Parameter is off
(gdb) PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: show parameter off
python print (test_undoc_param.value)
False
(gdb) PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: test undocumented parameter value is False
help show print test-undoc-param
Show the current value of 'print test-undoc-param'.
This command is not documented.
(gdb) PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: test show help
help set print test-undoc-param
Set the current value of 'print test-undoc-param'.
This command is not documented.
(gdb) PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: test set help
help set print
set print, set pr, set p
Generic command for setting how things print.

List of set print subcommands:

set print address -- Set printing of addresses.
set print array -- Set pretty formatting of arrays.
set print array-indexes -- Set printing of array indexes.
set print asm-demangle -- Set demangling of C++/ObjC names in disassembly listings.
set print demangle -- Set demangling of encoded C++/ObjC names when displaying symbols.
set print elements -- Set limit on string chars or array elements to print.
set print entry-values -- Set printing of function arguments at function entry.
set print finish -- Set whether `finish' prints the return value.
set print frame-arguments -- Set printing of non-scalar frame arguments.
set print frame-info -- Set printing of frame information.
set print inferior-events -- Set printing of inferior events (such as inferior start and exit).
set print max-depth -- Set maximum print depth for nested structures, unions and arrays.
set print max-symbolic-offset -- Set the largest offset that will be printed in <SYMBOL+1234> form.
set print memory-tag-violations -- Set printing of memory tag violations for pointers.
set print nibbles -- Set whether to print binary values in groups of four bits.
set print null-stop -- Set printing of char arrays to stop at first null char.
set print object -- Set printing of C++ virtual function tables.
set print pascal_static-members -- Set printing of pascal static members.
set print pretty -- Set pretty formatting of structures.
set print raw-frame-arguments -- Set whether to print frame arguments in raw form.
set print raw-values -- Set whether to print values in raw form.
set print repeats -- Set threshold for repeated print elements.
set print sevenbit-strings -- Set printing of 8-bit characters in strings as \nnn.
set print static-members -- Set printing of C++ static members.
set print symbol -- Set printing of symbol names when printing pointers.
set print symbol-filename -- Set printing of source filename and line number with <SYMBOL>.
set print symbol-loading -- Set printing of symbol loading messages.
set print test-undoc-param -- Set the current value of 'print test-undoc-param'.
set print thread-events -- Set printing of thread events (such as thread start and exit).
set print type -- Generic command for showing type-printing settings.
set print union -- Set printing of unions interior to structures.
set print vtbl -- Set printing of C++ virtual function tables.

Type "help set print" followed by set print subcommand name for full documentation.
Type "apropos word" to search for commands related to "word".
Type "apropos -v word" for full documentation of commands related to "word".
Command name abbreviations are allowed if unambiguous.
(gdb) PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: test general help
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 1: python
class TestNodocParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 2: class TestNodocParam (gdb.Parameter):
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 3:    def __init__ (self, name):
      super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
>PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
      self.value = True
>PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 5:       self.value = True
test_nodoc_param = TestNodocParam ('print test-nodoc-param')
>PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 6: test_nodoc_param = TestNodocParam ('print test-nodoc-param')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 7: end
show print test-nodoc-param
The current value of 'print test-nodoc-param' is "on".
(gdb) PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: show parameter on
set print test-nodoc-param off
(gdb) PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: turn off parameter
show print test-nodoc-param
The current value of 'print test-nodoc-param' is "off".
(gdb) PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: show parameter off
python print (test_nodoc_param.value)
False
(gdb) PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: test really undocumented parameter value is False
help show print test-nodoc-param
Show the current value of 'print test-nodoc-param'.
This command is not documented.
(gdb) PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: test show help
help set print test-nodoc-param
Set the current value of 'print test-nodoc-param'.
This command is not documented.
(gdb) PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: test set help
help set print
set print, set pr, set p
Generic command for setting how things print.

List of set print subcommands:

set print address -- Set printing of addresses.
set print array -- Set pretty formatting of arrays.
set print array-indexes -- Set printing of array indexes.
set print asm-demangle -- Set demangling of C++/ObjC names in disassembly listings.
set print demangle -- Set demangling of encoded C++/ObjC names when displaying symbols.
set print elements -- Set limit on string chars or array elements to print.
set print entry-values -- Set printing of function arguments at function entry.
set print finish -- Set whether `finish' prints the return value.
set print frame-arguments -- Set printing of non-scalar frame arguments.
set print frame-info -- Set printing of frame information.
set print inferior-events -- Set printing of inferior events (such as inferior start and exit).
set print max-depth -- Set maximum print depth for nested structures, unions and arrays.
set print max-symbolic-offset -- Set the largest offset that will be printed in <SYMBOL+1234> form.
set print memory-tag-violations -- Set printing of memory tag violations for pointers.
set print nibbles -- Set whether to print binary values in groups of four bits.
set print null-stop -- Set printing of char arrays to stop at first null char.
set print object -- Set printing of C++ virtual function tables.
set print pascal_static-members -- Set printing of pascal static members.
set print pretty -- Set pretty formatting of structures.
set print raw-frame-arguments -- Set whether to print frame arguments in raw form.
set print raw-values -- Set whether to print values in raw form.
set print repeats -- Set threshold for repeated print elements.
set print sevenbit-strings -- Set printing of 8-bit characters in strings as \nnn.
set print static-members -- Set printing of C++ static members.
set print symbol -- Set printing of symbol names when printing pointers.
set print symbol-filename -- Set printing of source filename and line number with <SYMBOL>.
set print symbol-loading -- Set printing of symbol loading messages.
set print test-nodoc-param -- Set the current value of 'print test-nodoc-param'.
set print thread-events -- Set printing of thread events (such as thread start and exit).
set print type -- Generic command for showing type-printing settings.
set print union -- Set printing of unions interior to structures.
set print vtbl -- Set printing of C++ virtual function tables.

Type "help set print" followed by set print subcommand name for full documentation.
Type "apropos word" to search for commands related to "word".
Type "apropos -v word" for full documentation of commands related to "word".
Command name abbreviations are allowed if unambiguous.
(gdb) PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: test general help
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 1: python
class TestParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 2: class TestParam (gdb.Parameter):
   """When enabled, test param does something useful. When disabled, does nothing."""
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 3:    """When enabled, test param does something useful. When disabled, does nothing."""
   show_doc = "State of the Test Parameter"
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 4:    show_doc = "State of the Test Parameter"
   set_doc = "Set the state of the Test Parameter"
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 5:    set_doc = "Set the state of the Test Parameter"
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 6:    def __init__ (self, name):
      super (TestParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 7:       super (TestParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
      self.value = True
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 8:       self.value = True
test_param = TestParam ('print test-param')
>PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 9: test_param = TestParam ('print test-param')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 10: end
python print (test_param.value)
True
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test deprecated API parameter value is True
show print test-param
The current value of 'print test-param' is "on".
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: show parameter on
set print test-param off
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: turn off parameter
show print test-param
The current value of 'print test-param' is "off".
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: show parameter off
python print (test_param.value)
False
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test deprecated API parameter value is False
help show print test-param
State of the Test Parameter
When enabled, test param does something useful. When disabled, does nothing.
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test show help
help set print test-param
Set the state of the Test Parameter
When enabled, test param does something useful. When disabled, does nothing.
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test set help
help set print
set print, set pr, set p
Generic command for setting how things print.

List of set print subcommands:

set print address -- Set printing of addresses.
set print array -- Set pretty formatting of arrays.
set print array-indexes -- Set printing of array indexes.
set print asm-demangle -- Set demangling of C++/ObjC names in disassembly listings.
set print demangle -- Set demangling of encoded C++/ObjC names when displaying symbols.
set print elements -- Set limit on string chars or array elements to print.
set print entry-values -- Set printing of function arguments at function entry.
set print finish -- Set whether `finish' prints the return value.
set print frame-arguments -- Set printing of non-scalar frame arguments.
set print frame-info -- Set printing of frame information.
set print inferior-events -- Set printing of inferior events (such as inferior start and exit).
set print max-depth -- Set maximum print depth for nested structures, unions and arrays.
set print max-symbolic-offset -- Set the largest offset that will be printed in <SYMBOL+1234> form.
set print memory-tag-violations -- Set printing of memory tag violations for pointers.
set print nibbles -- Set whether to print binary values in groups of four bits.
set print null-stop -- Set printing of char arrays to stop at first null char.
set print object -- Set printing of C++ virtual function tables.
set print pascal_static-members -- Set printing of pascal static members.
set print pretty -- Set pretty formatting of structures.
set print raw-frame-arguments -- Set whether to print frame arguments in raw form.
set print raw-values -- Set whether to print values in raw form.
set print repeats -- Set threshold for repeated print elements.
set print sevenbit-strings -- Set printing of 8-bit characters in strings as \nnn.
set print static-members -- Set printing of C++ static members.
set print symbol -- Set printing of symbol names when printing pointers.
set print symbol-filename -- Set printing of source filename and line number with <SYMBOL>.
set print symbol-loading -- Set printing of symbol loading messages.
set print test-param -- Set the state of the Test Parameter
set print thread-events -- Set printing of thread events (such as thread start and exit).
set print type -- Generic command for showing type-printing settings.
set print union -- Set printing of unions interior to structures.
set print vtbl -- Set printing of C++ virtual function tables.

Type "help set print" followed by set print subcommand name for full documentation.
Type "apropos word" to search for commands related to "word".
Type "apropos -v word" for full documentation of commands related to "word".
Command name abbreviations are allowed if unambiguous.
(gdb) PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test general help
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python gdb.set_parameter('listsize', 1)
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test set to 1
python print(gdb.parameter('listsize'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test value of 1
python gdb.set_parameter('listsize', 0)
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test set to 0
python print(gdb.parameter('listsize'))
None
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test value of 0
python gdb.set_parameter('listsize', -1)
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: {test set to -1}
python print(gdb.parameter('listsize'))
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test value of -1
python gdb.set_parameter('listsize', 'unlimited')
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test set to 'unlimited'
python print(gdb.parameter('listsize'))
None
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test value of 'unlimited'
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python gdb.set_parameter('print elements', 1)
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test set to 1
python print(gdb.parameter('print elements'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test value of 1
python gdb.set_parameter('print elements', 0)
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test set to 0
python print(gdb.parameter('print elements'))
None
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test value of 0
python gdb.set_parameter('print elements', -1)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/builds/binutils-gdb-armhf-jammy/gdb/data-directory/python/gdb/__init__.py", line 245, in set_parameter
    execute("set " + name + " " + str(value), to_string=True)
gdb.error: integer -1 out of range
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: {test set to -1}
python print(gdb.parameter('print elements'))
None
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test value of -1
python gdb.set_parameter('print elements', 'unlimited')
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test set to 'unlimited'
python print(gdb.parameter('print elements'))
None
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test value of 'unlimited'
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python gdb.set_parameter('max-completions', 1)
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test set to 1
python print(gdb.parameter('max-completions'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test value of 1
python gdb.set_parameter('max-completions', 0)
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test set to 0
python print(gdb.parameter('max-completions'))
0
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test value of 0
python gdb.set_parameter('max-completions', -1)
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: {test set to -1}
python print(gdb.parameter('max-completions'))
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test value of -1
python gdb.set_parameter('max-completions', 'unlimited')
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test set to 'unlimited'
python print(gdb.parameter('max-completions'))
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test value of 'unlimited'
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python print(gdb.parameter('endian'))
auto
(gdb) PASS: gdb.python/py-parameter.exp: test_gdb_parameter: print endian parameter
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 1: python
class TestNodocParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 2: class TestNodocParam (gdb.Parameter):
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 3:    def __init__ (self, name):
      super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_UINTEGER)
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_UINTEGER)
      self.value = 0
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 5:       self.value = 0
test_param_PARAM_UINTEGER = TestNodocParam ('test-PARAM_UINTEGER')
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 6: test_param_PARAM_UINTEGER = TestNodocParam ('test-PARAM_UINTEGER')
end
Traceback (most recent call last):
  File "<string>", line 5, in <module>
  File "<string>", line 4, in __init__
RuntimeError: Range exceeded.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 7: end
python print(test_param_PARAM_UINTEGER.value)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test default value
python print(gdb.parameter('test-PARAM_UINTEGER'))
0
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test default value via gdb.parameter
python test_param_PARAM_UINTEGER.value = -1
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to -1}
python print(test_param_PARAM_UINTEGER.value)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -1
python print(gdb.parameter('test-PARAM_UINTEGER'))
0
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -1 via gdb.parameter
python test_param_PARAM_UINTEGER.value = 1
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 1
python print(test_param_PARAM_UINTEGER.value)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 1
python print(gdb.parameter('test-PARAM_UINTEGER'))
0
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 1 via gdb.parameter
python test_param_PARAM_UINTEGER.value = -5
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to -5}
python print(gdb.parameter('test-PARAM_UINTEGER'))
0
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -5 via gdb.parameter
python test_param_PARAM_UINTEGER.value = 5
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 5
python print(gdb.parameter('test-PARAM_UINTEGER'))
0
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 5 via gdb.parameter
python test_param_PARAM_UINTEGER.value = None
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to None}
python print(test_param_PARAM_UINTEGER.value)
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of None
python print(gdb.parameter('test-PARAM_UINTEGER'))
0
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of None via gdb.parameter
python test_param_PARAM_UINTEGER.value = 0
Traceback (most recent call last):
  File "<string>", line 1, in <module>
NameError: name 'test_param_PARAM_UINTEGER' is not defined
Error while executing Python code.
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 0
python print(gdb.parameter('test-PARAM_UINTEGER'))
0
(gdb) FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 0 via gdb.parameter
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 1: python
class TestNodocParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 2: class TestNodocParam (gdb.Parameter):
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 3:    def __init__ (self, name):
      super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_INTEGER)
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_INTEGER)
      self.value = 0
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 5:       self.value = 0
test_param_PARAM_INTEGER = TestNodocParam ('test-PARAM_INTEGER')
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 6: test_param_PARAM_INTEGER = TestNodocParam ('test-PARAM_INTEGER')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 7: end
python print(test_param_PARAM_INTEGER.value)
None
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test default value
python print(gdb.parameter('test-PARAM_INTEGER'))
None
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test default value via gdb.parameter
python test_param_PARAM_INTEGER.value = -1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: {test set to -1}
python print(test_param_PARAM_INTEGER.value)
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of -1
python print(gdb.parameter('test-PARAM_INTEGER'))
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of -1 via gdb.parameter
python test_param_PARAM_INTEGER.value = 1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test set to 1
python print(test_param_PARAM_INTEGER.value)
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of 1
python print(gdb.parameter('test-PARAM_INTEGER'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of 1 via gdb.parameter
python test_param_PARAM_INTEGER.value = -5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: {test set to -5}
python print(gdb.parameter('test-PARAM_INTEGER'))
-5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of -5 via gdb.parameter
python test_param_PARAM_INTEGER.value = 5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test set to 5
python print(gdb.parameter('test-PARAM_INTEGER'))
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of 5 via gdb.parameter
python test_param_PARAM_INTEGER.value = None
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError: The value must be integer.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: {test set to None}
python print(test_param_PARAM_INTEGER.value)
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of None
python print(gdb.parameter('test-PARAM_INTEGER'))
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of None via gdb.parameter
python test_param_PARAM_INTEGER.value = 0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test set to 0
python print(gdb.parameter('test-PARAM_INTEGER'))
None
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of 0 via gdb.parameter
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 1: python
class TestNodocParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 2: class TestNodocParam (gdb.Parameter):
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 3:    def __init__ (self, name):
      super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZINTEGER)
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZINTEGER)
      self.value = 0
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 5:       self.value = 0
test_param_PARAM_ZINTEGER = TestNodocParam ('test-PARAM_ZINTEGER')
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 6: test_param_PARAM_ZINTEGER = TestNodocParam ('test-PARAM_ZINTEGER')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 7: end
python print(test_param_PARAM_ZINTEGER.value)
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test default value
python print(gdb.parameter('test-PARAM_ZINTEGER'))
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test default value via gdb.parameter
python test_param_PARAM_ZINTEGER.value = -1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: {test set to -1}
python print(test_param_PARAM_ZINTEGER.value)
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of -1
python print(gdb.parameter('test-PARAM_ZINTEGER'))
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of -1 via gdb.parameter
python test_param_PARAM_ZINTEGER.value = 1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test set to 1
python print(test_param_PARAM_ZINTEGER.value)
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of 1
python print(gdb.parameter('test-PARAM_ZINTEGER'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of 1 via gdb.parameter
python test_param_PARAM_ZINTEGER.value = -5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: {test set to -5}
python print(gdb.parameter('test-PARAM_ZINTEGER'))
-5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of -5 via gdb.parameter
python test_param_PARAM_ZINTEGER.value = 5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test set to 5
python print(gdb.parameter('test-PARAM_ZINTEGER'))
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of 5 via gdb.parameter
python test_param_PARAM_ZINTEGER.value = None
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError: The value must be integer.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: {test set to None}
python print(test_param_PARAM_ZINTEGER.value)
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of None
python print(gdb.parameter('test-PARAM_ZINTEGER'))
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of None via gdb.parameter
python test_param_PARAM_ZINTEGER.value = 0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test set to 0
python print(gdb.parameter('test-PARAM_ZINTEGER'))
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of 0 via gdb.parameter
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 1: python
class TestNodocParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 2: class TestNodocParam (gdb.Parameter):
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 3:    def __init__ (self, name):
      super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZUINTEGER)
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZUINTEGER)
      self.value = 0
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 5:       self.value = 0
test_param_PARAM_ZUINTEGER = TestNodocParam ('test-PARAM_ZUINTEGER')
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 6: test_param_PARAM_ZUINTEGER = TestNodocParam ('test-PARAM_ZUINTEGER')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 7: end
python print(test_param_PARAM_ZUINTEGER.value)
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test default value
python print(gdb.parameter('test-PARAM_ZUINTEGER'))
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test default value via gdb.parameter
python test_param_PARAM_ZUINTEGER.value = -1
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError: Range exceeded.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: {test set to -1}
python print(test_param_PARAM_ZUINTEGER.value)
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of -1
python print(gdb.parameter('test-PARAM_ZUINTEGER'))
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of -1 via gdb.parameter
python test_param_PARAM_ZUINTEGER.value = 1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test set to 1
python print(test_param_PARAM_ZUINTEGER.value)
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of 1
python print(gdb.parameter('test-PARAM_ZUINTEGER'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of 1 via gdb.parameter
python test_param_PARAM_ZUINTEGER.value = -5
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError: Range exceeded.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: {test set to -5}
python print(gdb.parameter('test-PARAM_ZUINTEGER'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of -5 via gdb.parameter
python test_param_PARAM_ZUINTEGER.value = 5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test set to 5
python print(gdb.parameter('test-PARAM_ZUINTEGER'))
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of 5 via gdb.parameter
python test_param_PARAM_ZUINTEGER.value = None
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError: The value must be integer.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: {test set to None}
python print(test_param_PARAM_ZUINTEGER.value)
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of None
python print(gdb.parameter('test-PARAM_ZUINTEGER'))
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of None via gdb.parameter
python test_param_PARAM_ZUINTEGER.value = 0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test set to 0
python print(gdb.parameter('test-PARAM_ZUINTEGER'))
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of 0 via gdb.parameter
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 1: python
class TestNodocParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 2: class TestNodocParam (gdb.Parameter):
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 3:    def __init__ (self, name):
      super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZUINTEGER_UNLIMITED)
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZUINTEGER_UNLIMITED)
      self.value = 0
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 5:       self.value = 0
test_param_PARAM_ZUINTEGER_UNLIMITED = TestNodocParam ('test-PARAM_ZUINTEGER_UNLIMITED')
>PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 6: test_param_PARAM_ZUINTEGER_UNLIMITED = TestNodocParam ('test-PARAM_ZUINTEGER_UNLIMITED')
end
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 7: end
python print(test_param_PARAM_ZUINTEGER_UNLIMITED.value)
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test default value
python print(gdb.parameter('test-PARAM_ZUINTEGER_UNLIMITED'))
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test default value via gdb.parameter
python test_param_PARAM_ZUINTEGER_UNLIMITED.value = -1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: {test set to -1}
python print(test_param_PARAM_ZUINTEGER_UNLIMITED.value)
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of -1
python print(gdb.parameter('test-PARAM_ZUINTEGER_UNLIMITED'))
-1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of -1 via gdb.parameter
python test_param_PARAM_ZUINTEGER_UNLIMITED.value = 1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test set to 1
python print(test_param_PARAM_ZUINTEGER_UNLIMITED.value)
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of 1
python print(gdb.parameter('test-PARAM_ZUINTEGER_UNLIMITED'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of 1 via gdb.parameter
python test_param_PARAM_ZUINTEGER_UNLIMITED.value = -5
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError: Range exceeded.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: {test set to -5}
python print(gdb.parameter('test-PARAM_ZUINTEGER_UNLIMITED'))
1
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of -5 via gdb.parameter
python test_param_PARAM_ZUINTEGER_UNLIMITED.value = 5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test set to 5
python print(gdb.parameter('test-PARAM_ZUINTEGER_UNLIMITED'))
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of 5 via gdb.parameter
python test_param_PARAM_ZUINTEGER_UNLIMITED.value = None
Traceback (most recent call last):
  File "<string>", line 1, in <module>
RuntimeError: The value must be integer.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: {test set to None}
python print(test_param_PARAM_ZUINTEGER_UNLIMITED.value)
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of None
python print(gdb.parameter('test-PARAM_ZUINTEGER_UNLIMITED'))
5
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of None via gdb.parameter
python test_param_PARAM_ZUINTEGER_UNLIMITED.value = 0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test set to 0
python print(gdb.parameter('test-PARAM_ZUINTEGER_UNLIMITED'))
0
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of 0 via gdb.parameter
builtin_spawn /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "armv8l-unknown-linux-gnueabihf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set height 0
(gdb) set width 0
(gdb) dir
Reinitialize source path to empty? (y or n) y
Source directories searched: $cdir:$cwd
(gdb) dir /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python
Source directories searched: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python:$cdir:$cwd
(gdb) python
>PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 1: python
class TestThrowParam (gdb.Parameter):
>PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 2: class TestThrowParam (gdb.Parameter):
   def __init__ (self, name):
>PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 3:    def __init__ (self, name):
      super (TestThrowParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_STRING)
>PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 4:       super (TestThrowParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_STRING)
      self.value = True
>PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 5:       self.value = True
   def get_set_string (self):
>PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 6:    def get_set_string (self):
      raise gdb.GdbError('Ordinary gdb error')
>PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 7:       raise gdb.GdbError('Ordinary gdb error')
test_throw_param = TestThrowParam ('print test-throw-param')
>PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 8: test_throw_param = TestThrowParam ('print test-throw-param')
end
Traceback (most recent call last):
  File "<string>", line 7, in <module>
  File "<string>", line 4, in __init__
RuntimeError: String required for filename.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 9: end
set print test-throw-param whoops
Ordinary gdb error
(gdb) PASS: gdb.python/py-parameter.exp: test_throwing_parameter: gdb.GdbError does not show Python stack
python print(gdb.parameter('language'))
auto
(gdb) PASS: gdb.python/py-parameter.exp: test_language: print language parameter
python print(gdb.current_language())
c
(gdb) PASS: gdb.python/py-parameter.exp: test_language: print current language
set lang rust
(gdb) PASS: gdb.python/py-parameter.exp: test_language: set lang rust
python print(gdb.parameter('language'))
rust
(gdb) PASS: gdb.python/py-parameter.exp: test_language: print language parameter for rust
python print(gdb.current_language())
rust
(gdb) PASS: gdb.python/py-parameter.exp: test_language: print current language for rust
set lang auto
(gdb) PASS: gdb.python/py-parameter.exp: test_language: set lang auto
testcase /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python/py-parameter.exp completed in 4 seconds


		=== gdb Summary ===

# of expected passes		273
# of unexpected failures	17
Executing on host: /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex "set height 0" -iex "set width 0" -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory --version    (timeout = 300)
builtin_spawn -ignore SIGHUP /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../gdb/gdb -nw -nx -iex set height 0 -iex set width 0 -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory --version
GNU gdb (GDB) 13.0.50.20221021-git
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
/builds/binutils-gdb-armhf-jammy/gdb/gdb version  13.0.50.20221021-git -nw -nx -iex "set height 0" -iex "set width 0" -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory 

runtest completed at Mon Oct 31 12:28:52 2022

[-- Attachment #3: gdb.sum --]
[-- Type: text/plain, Size: 33803 bytes --]

Native configuration is armv8l-unknown-linux-gnueabihf

		=== gdb tests ===

Schedule of variations:
    unix

Running target unix
Running /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../../../../repos/binutils-gdb/gdb/testsuite/gdb.python/py-parameter.exp ...
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 10:       if (self.value == False):
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 11:          val = "off"
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 12:       return "Test Parameter has been set to " + val
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 13:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 14:       super (TestParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 15:       self.value = True
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 16: test_param = TestParam ('print test-param')
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 17: end
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 2: class TestParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 3:    """When enabled, test param does something useful. When disabled, does nothing."""
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 4:    show_doc = "Show the state of the boolean test-param"
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 5:    set_doc = "Set the state of the boolean test-param"
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 6:    def get_show_string (self, pvalue):
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 7:       return "The state of the Test Parameter is " + pvalue
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 8:    def get_set_string (self):
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: Simple gdb booleanparameter: input 9:       val = "on"
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: get boolean parameter using gdb.parameter
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: set boolean parameter using set_parameter
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: show parameter off
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: show parameter on
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test boolean parameter value is False
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test boolean parameter value is True
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test general help
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test set help
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: test show help
PASS: gdb.python/py-parameter.exp: test_boolean_parameter: turn off parameter
PASS: gdb.python/py-parameter.exp: test_data_directory: check modified data-directory at the CLI
PASS: gdb.python/py-parameter.exp: test_data_directory: check original data-directory was restored at the CLI
PASS: gdb.python/py-parameter.exp: test_data_directory: find the initial data-directory value
PASS: gdb.python/py-parameter.exp: test_data_directory: python print (gdb.parameter ('data-directory'))
PASS: gdb.python/py-parameter.exp: test_data_directory: python sees absolute version of data-directory path
PASS: gdb.python/py-parameter.exp: test_data_directory: python sees restored data-directory value
PASS: gdb.python/py-parameter.exp: test_data_directory: set data-directory ./outputs/gdb.python/py-parameter
PASS: gdb.python/py-parameter.exp: test_data_directory: set data-directory back to its original value
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 10: end
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 2: class TestParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 3:    """When enabled, test param does something useful. When disabled, does nothing."""
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 4:    show_doc = "State of the Test Parameter"
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 5:    set_doc = "Set the state of the Test Parameter"
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 6:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 7:       super (TestParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 8:       self.value = True
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: Simple gdb booleanparameter: input 9: test_param = TestParam ('print test-param')
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: show parameter off
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: show parameter on
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test deprecated API parameter value is False
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test deprecated API parameter value is True
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test general help
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test set help
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: test show help
PASS: gdb.python/py-parameter.exp: test_deprecated_api_parameter: turn off parameter
PASS: gdb.python/py-parameter.exp: test_directories: python print (gdb.parameter ('directories'))
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 10:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 11:       super (TestEnumParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ENUM, ["one", "two"])
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 12:       self.value = "one"
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 13: test_enum_param = TestEnumParam ('print test-enum-param')
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 14: end
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 2: class TestEnumParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 3:    """When set, test param does something useful. When disabled, does nothing."""
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 4:    show_doc = "Show the state of the enum"
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 5:    set_doc = "Set the state of the enum"
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 6:    def get_show_string (self, pvalue):
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 7:       return "The state of the enum is " + pvalue
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 8:    def get_set_string (self):
PASS: gdb.python/py-parameter.exp: test_enum_parameter: enum gdb parameter: input 9:       return "The state of the enum has been set to " + self.value
PASS: gdb.python/py-parameter.exp: test_enum_parameter: set enum to two
PASS: gdb.python/py-parameter.exp: test_enum_parameter: set invalid enum parameter
PASS: gdb.python/py-parameter.exp: test_enum_parameter: show parameter is initial value
PASS: gdb.python/py-parameter.exp: test_enum_parameter: show parameter is new value
PASS: gdb.python/py-parameter.exp: test_enum_parameter: test enum parameter value is one
PASS: gdb.python/py-parameter.exp: test_enum_parameter: test enum parameter value is two
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 10:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 11:       super (TestFileParam, self).__init__ (name, gdb.COMMAND_FILES, gdb.PARAM_FILENAME)
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 12:       self.value = "foo.txt"
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 13: test_file_param = TestFileParam ('test-file-param')
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 14: end
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 2: class TestFileParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 3:    """When set, test param does something useful. When disabled, does nothing."""
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 4:    show_doc = "Show the name of the file"
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 5:    set_doc = "Set the name of the file"
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 6:    def get_show_string (self, pvalue):
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 7:       return "The name of the file is " + pvalue
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 8:    def get_set_string (self):
PASS: gdb.python/py-parameter.exp: test_file_parameter: file gdb parameter: input 9:       return "The name of the file has been changed to " + self.value
PASS: gdb.python/py-parameter.exp: test_file_parameter: set new file parameter
PASS: gdb.python/py-parameter.exp: test_file_parameter: set test-file-param
PASS: gdb.python/py-parameter.exp: test_file_parameter: show initial file value
PASS: gdb.python/py-parameter.exp: test_file_parameter: show new file value
PASS: gdb.python/py-parameter.exp: test_file_parameter: test file parameter value
PASS: gdb.python/py-parameter.exp: test_file_parameter: test new file parameter value
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test set to 'unlimited'
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test set to 0
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test set to 1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test value of 'unlimited'
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test value of -1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test value of 0
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: test value of 1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=listsize: {test set to -1}
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test set to 'unlimited'
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test set to 0
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test set to 1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test value of 'unlimited'
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test value of -1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test value of 0
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: test value of 1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=max-completions: {test set to -1}
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test set to 'unlimited'
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test set to 0
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test set to 1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test value of 'unlimited'
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test value of -1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test value of 0
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: test value of 1
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: param=print elements: {test set to -1}
PASS: gdb.python/py-parameter.exp: test_gdb_parameter: print endian parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 2: class TestNodocParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 3:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_INTEGER)
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 5:       self.value = 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 6: test_param_PARAM_INTEGER = TestNodocParam ('test-PARAM_INTEGER')
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: create parameter: input 7: end
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test default value
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test default value via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test set to 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test set to 1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test set to 5
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of -1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of -1 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of -5 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of 0 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of 1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of 1 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of 5 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of None
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: test value of None via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: {test set to -1}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: {test set to -5}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_INTEGER: {test set to None}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 2: class TestNodocParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 3:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_UINTEGER)
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 5:       self.value = 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 6: test_param_PARAM_UINTEGER = TestNodocParam ('test-PARAM_UINTEGER')
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 7: end
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test default value
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test default value via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 0
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 1
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 5
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -1
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -1 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -5 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 0 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 1
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 1 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 5 via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of None
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of None via gdb.parameter
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to -1}
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to -5}
FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to None}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 2: class TestNodocParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 3:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZINTEGER)
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 5:       self.value = 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 6: test_param_PARAM_ZINTEGER = TestNodocParam ('test-PARAM_ZINTEGER')
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: create parameter: input 7: end
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test default value
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test default value via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test set to 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test set to 1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test set to 5
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of -1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of -1 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of -5 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of 0 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of 1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of 1 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of 5 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of None
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: test value of None via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: {test set to -1}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: {test set to -5}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZINTEGER: {test set to None}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 2: class TestNodocParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 3:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZUINTEGER)
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 5:       self.value = 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 6: test_param_PARAM_ZUINTEGER = TestNodocParam ('test-PARAM_ZUINTEGER')
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: create parameter: input 7: end
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test default value
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test default value via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test set to 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test set to 1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test set to 5
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of -1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of -1 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of -5 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of 0 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of 1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of 1 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of 5 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of None
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: test value of None via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: {test set to -1}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: {test set to -5}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER: {test set to None}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 2: class TestNodocParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 3:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_ZUINTEGER_UNLIMITED)
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 5:       self.value = 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 6: test_param_PARAM_ZUINTEGER_UNLIMITED = TestNodocParam ('test-PARAM_ZUINTEGER_UNLIMITED')
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: create parameter: input 7: end
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test default value
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test default value via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test set to 0
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test set to 1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test set to 5
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of -1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of -1 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of -5 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of 0 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of 1
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of 1 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of 5 via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of None
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: test value of None via gdb.parameter
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: {test set to -1}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: {test set to -5}
PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_ZUINTEGER_UNLIMITED: {test set to None}
PASS: gdb.python/py-parameter.exp: test_language: print current language
PASS: gdb.python/py-parameter.exp: test_language: print current language for rust
PASS: gdb.python/py-parameter.exp: test_language: print language parameter
PASS: gdb.python/py-parameter.exp: test_language: print language parameter for rust
PASS: gdb.python/py-parameter.exp: test_language: set lang auto
PASS: gdb.python/py-parameter.exp: test_language: set lang rust
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 2: class TestNodocParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 3:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 4:       super (TestNodocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 5:       self.value = True
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 6: test_nodoc_param = TestNodocParam ('print test-nodoc-param')
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: Simple gdb booleanparameter: input 7: end
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: show parameter off
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: show parameter on
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: test general help
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: test really undocumented parameter value is False
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: test set help
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: test show help
PASS: gdb.python/py-parameter.exp: test_really_undocumented_parameter: turn off parameter
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 2: class TestThrowParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 3:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 4:       super (TestThrowParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_STRING)
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 5:       self.value = True
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 6:    def get_set_string (self):
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 7:       raise gdb.GdbError('Ordinary gdb error')
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 8: test_throw_param = TestThrowParam ('print test-throw-param')
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: Throwing gdb parameter: input 9: end
PASS: gdb.python/py-parameter.exp: test_throwing_parameter: gdb.GdbError does not show Python stack
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 10:    def __init__ (self, name):
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 11:       super (TestUndocParam, self).__init__ (name, gdb.COMMAND_DATA, gdb.PARAM_BOOLEAN)
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 12:       self.value = True
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 13: test_undoc_param = TestUndocParam ('print test-undoc-param')
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 14: end
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 1: python
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 2: class TestUndocParam (gdb.Parameter):
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 3:    def get_show_string (self, pvalue):
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 4:       return "The state of the Test Parameter is " + pvalue
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 5:    def get_set_string (self):
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 6:       val = "on"
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 7:       if (self.value == False):
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 8:          val = "off"
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: Simple gdb booleanparameter: input 9:       return "Test Parameter has been set to " + val
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: show parameter off
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: show parameter on
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: test general help
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: test set help
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: test show help
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: test undocumented parameter value is False
PASS: gdb.python/py-parameter.exp: test_undocumented_parameter: turn off parameter

		=== gdb Summary ===

# of expected passes		273
# of unexpected failures	17
/builds/binutils-gdb-armhf-jammy/gdb/gdb version  13.0.50.20221021-git -nw -nx -iex "set height 0" -iex "set width 0" -data-directory /builds/binutils-gdb-armhf-jammy/gdb/testsuite/../data-directory 


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-29 15:58     ` Maciej W. Rozycki
@ 2022-10-31 13:00       ` Simon Marchi
  2022-10-31 13:31         ` Maciej W. Rozycki
  0 siblings, 1 reply; 42+ messages in thread
From: Simon Marchi @ 2022-10-31 13:00 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches, Andrew Burgess, Tom Tromey, Simon Sobisch

>> And I do agree that fixing the API once will reduce the long-term costs
>> for everybody (us and users bumping in the inconsistency and losing
>> time).  So, I am fine with fixing PARAM_ZUINTEGER_UNLIMITED in this
>> case.
> 
>  Good.  Given that you are in favour to making this change and Andrew was 
> against, do you think we need another opinion?  Have we reached consensus?

I didn't know Andrew was against, can you point me to that discussion?

If the thing is usable as-is, despite being awkward, the alternative is
to just document as clearly as possible the awkwardness.

Simon


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-31 12:37         ` Luis Machado
@ 2022-10-31 13:08           ` Maciej W. Rozycki
  2022-10-31 13:14             ` Luis Machado
  0 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-31 13:08 UTC (permalink / raw)
  To: Luis Machado; +Cc: gdb-patches, Simon Sobisch, Tom Tromey, Andrew Burgess

On Mon, 31 Oct 2022, Luis Machado wrote:

> A bisect confirmed commit e7e1f2034567207e5e01cb75ea2ffd568a64e84d changed the
> gdb.python/py-parameter.exp behavior from PASS to FAIL.
> gdb.python/py-format.exp was failing before.
> 
> I've attached the relevant gdb.log and gdb.sum.
> 
> I don't fully understand the issue here, so I can't be sure this is a real
> regression or something that was broken before but this patch just happened to
> uncover it.

 Thanks.  There is this error:

Traceback (most recent call last):
  File "<string>", line 5, in <module>
  File "<string>", line 4, in __init__
RuntimeError: Range exceeded.
Error while executing Python code.
(gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 7: end

in creating the parameter earlier on and consequently all the subsequent 
tests on the parameter fail.  I think the case above shouldn't score as a 
PASS either; pattern matching must be too liberal here.

 The situation here is previously only parameters of the PARAM_ZUINTEGER 
and PARAM_ZUINTEGER_UNLIMITED types were tested.  Now we also test ones of 
the PARAM_UINTEGER, PARAM_INTEGER, and PARAM_ZINTEGER types, so it is a 
new test that is failing.  Parameter of all the types are initialised to 
0, which is permitted either as itself or as the "unlimited" value.  For 
the failing PARAM_UINTEGER case it means "unlimited".  So wonder where 
this range error is coming from really, hmm...

 You don't happen to have any local patches applied, do you?  Also what 
version of Python?

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-31 13:08           ` Maciej W. Rozycki
@ 2022-10-31 13:14             ` Luis Machado
  2022-10-31 14:05               ` Maciej W. Rozycki
  0 siblings, 1 reply; 42+ messages in thread
From: Luis Machado @ 2022-10-31 13:14 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: gdb-patches, Simon Sobisch, Tom Tromey, Andrew Burgess

On 10/31/22 13:08, Maciej W. Rozycki wrote:
> On Mon, 31 Oct 2022, Luis Machado wrote:
> 
>> A bisect confirmed commit e7e1f2034567207e5e01cb75ea2ffd568a64e84d changed the
>> gdb.python/py-parameter.exp behavior from PASS to FAIL.
>> gdb.python/py-format.exp was failing before.
>>
>> I've attached the relevant gdb.log and gdb.sum.
>>
>> I don't fully understand the issue here, so I can't be sure this is a real
>> regression or something that was broken before but this patch just happened to
>> uncover it.
> 
>   Thanks.  There is this error:
> 
> Traceback (most recent call last):
>    File "<string>", line 5, in <module>
>    File "<string>", line 4, in __init__
> RuntimeError: Range exceeded.
> Error while executing Python code.
> (gdb) PASS: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: create parameter: input 7: end

Yeah, I found this to be a bit odd.

> 
> in creating the parameter earlier on and consequently all the subsequent
> tests on the parameter fail.  I think the case above shouldn't score as a
> PASS either; pattern matching must be too liberal here.
> 
>   The situation here is previously only parameters of the PARAM_ZUINTEGER
> and PARAM_ZUINTEGER_UNLIMITED types were tested.  Now we also test ones of
> the PARAM_UINTEGER, PARAM_INTEGER, and PARAM_ZINTEGER types, so it is a
> new test that is failing.  Parameter of all the types are initialised to
> 0, which is permitted either as itself or as the "unlimited" value.  For
> the failing PARAM_UINTEGER case it means "unlimited".  So wonder where
> this range error is coming from really, hmm...

Thanks for the details.

> 
>   You don't happen to have any local patches applied, do you?  Also what
> version of Python?

No. This is a top-of-tree build. This happens for both Ubuntu 20.04 (Python 3.8.10) and Ubuntu 22.04 (Python 3.10.4).

I have to say I noticed, in the past, some variability in the results of these python tests due to version. But in this
case it seems to be a reliable outcome.

I can try to pinpoint where that range exceeded message is coming from. It might give us answers.

> 
>    Maciej


^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-31 13:00       ` Simon Marchi
@ 2022-10-31 13:31         ` Maciej W. Rozycki
  2022-11-01 12:28           ` Maciej W. Rozycki
  0 siblings, 1 reply; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-31 13:31 UTC (permalink / raw)
  To: Simon Marchi; +Cc: gdb-patches, Andrew Burgess, Tom Tromey, Simon Sobisch

On Mon, 31 Oct 2022, Simon Marchi wrote:

> >> And I do agree that fixing the API once will reduce the long-term costs
> >> for everybody (us and users bumping in the inconsistency and losing
> >> time).  So, I am fine with fixing PARAM_ZUINTEGER_UNLIMITED in this
> >> case.
> > 
> >  Good.  Given that you are in favour to making this change and Andrew was 
> > against, do you think we need another opinion?  Have we reached consensus?
> 
> I didn't know Andrew was against, can you point me to that discussion?

 This is why I went into such a lengthy justification for the change.  I 
didn't want to just sneak the change in given Andrew's previous concern:
<https://sourceware.org/pipermail/gdb-patches/2022-June/190306.html>.

> If the thing is usable as-is, despite being awkward, the alternative is
> to just document as clearly as possible the awkwardness.

 One problem with that is the generalisation I implement in 6/8 (2/4 in 
v7) makes it even more awkward: we do retain PARAM_ZUINTEGER_UNLIMITED in 
the Python interface for compatibility reasons, but it will have to be 
special-cased and extra handling will have to be added (possibly a boolean 
flag driving the handling of the "unlimited" value and translating it to 
-1 regardless of the underlying implementation value) to make it different 
from PARAM_PINTEGER (if we ever expose it to the user) with an "unlimited" 
keyword explicitly added.  Obviously an explicitly added keyword will 
always translate to `None'.

 I didn't want to raise the implementation issue at the beginning as I 
think it's the implementation that should follow the interface and not the 
other way round, but perhaps it's worth noting in this case after all.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-31 13:14             ` Luis Machado
@ 2022-10-31 14:05               ` Maciej W. Rozycki
  0 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-10-31 14:05 UTC (permalink / raw)
  To: Luis Machado; +Cc: gdb-patches, Simon Sobisch, Tom Tromey, Andrew Burgess

On Mon, 31 Oct 2022, Luis Machado wrote:

> >   You don't happen to have any local patches applied, do you?  Also what
> > version of Python?
> 
> No. This is a top-of-tree build. This happens for both Ubuntu 20.04 (Python
> 3.8.10) and Ubuntu 22.04 (Python 3.10.4).

 I have Python 3.8.10 here as well.

> I have to say I noticed, in the past, some variability in the results of these
> python tests due to version. But in this
> case it seems to be a reliable outcome.
> 
> I can try to pinpoint where that range exceeded message is coming from. It
> might give us answers.

 Please do, I will appreciate that.  Owing to my schedules it'll be a few 
days before I can get back to this effort.

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

* Re: [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited'
  2022-10-31 13:31         ` Maciej W. Rozycki
@ 2022-11-01 12:28           ` Maciej W. Rozycki
  0 siblings, 0 replies; 42+ messages in thread
From: Maciej W. Rozycki @ 2022-11-01 12:28 UTC (permalink / raw)
  To: Andrew Burgess; +Cc: Simon Marchi, gdb-patches, Tom Tromey, Simon Sobisch

Andrew,

On Mon, 31 Oct 2022, Maciej W. Rozycki wrote:

> > >> And I do agree that fixing the API once will reduce the long-term costs
> > >> for everybody (us and users bumping in the inconsistency and losing
> > >> time).  So, I am fine with fixing PARAM_ZUINTEGER_UNLIMITED in this
> > >> case.
> > > 
> > >  Good.  Given that you are in favour to making this change and Andrew was 
> > > against, do you think we need another opinion?  Have we reached consensus?
> > 
> > I didn't know Andrew was against, can you point me to that discussion?
> 
>  This is why I went into such a lengthy justification for the change.  I 
> didn't want to just sneak the change in given Andrew's previous concern:
> <https://sourceware.org/pipermail/gdb-patches/2022-June/190306.html>.

 Given Simon's findings upthread, and especially his Github scan, cf.: 
<https://sourceware.org/pipermail/gdb-patches/2022-October/192750.html>, 
do you maintain your objection, or do you think this change might be 
acceptable after all?

  Maciej

^ permalink raw reply	[flat|nested] 42+ messages in thread

end of thread, other threads:[~2022-11-01 12:28 UTC | newest]

Thread overview: 42+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-08-17 22:03 [PATCH v6 0/8] gdb: split array and string limiting options Maciej W. Rozycki
2022-08-17 22:03 ` [PATCH v6 1/8] GDB/Guile: Don't assert that an integer value is boolean Maciej W. Rozycki
2022-10-17 13:43   ` Simon Marchi
2022-10-21  7:58     ` Maciej W. Rozycki
2022-10-21 18:44   ` Simon Marchi
2022-10-21 20:54     ` Maciej W. Rozycki
2022-10-22  0:48       ` Simon Marchi
2022-08-17 22:03 ` [PATCH v6 2/8] GDB/doc: Document the Guile `#:unlimited' keyword Maciej W. Rozycki
2022-08-18  6:06   ` Eli Zaretskii
2022-09-01 10:31     ` Maciej W. Rozycki
2022-08-17 22:04 ` [PATCH v6 3/8] GDB/testsuite: Expand Python integer parameter coverage across all types Maciej W. Rozycki
2022-10-17 13:56   ` Simon Marchi
2022-10-21  7:59     ` Maciej W. Rozycki
2022-08-17 22:04 ` [PATCH v6 4/8] GDB/Python: Make `None' stand for `unlimited' in setting integer parameters Maciej W. Rozycki
2022-10-17 14:26   ` Simon Marchi
2022-10-21  8:03     ` Maciej W. Rozycki
2022-08-17 22:04 ` [PATCH v6 5/8] GDB/Python: Use None for `var_zuinteger_unlimited' value set to `unlimited' Maciej W. Rozycki
2022-08-18  6:08   ` Eli Zaretskii
2022-10-17 15:02   ` Simon Marchi
2022-10-29 15:58     ` Maciej W. Rozycki
2022-10-31 13:00       ` Simon Marchi
2022-10-31 13:31         ` Maciej W. Rozycki
2022-11-01 12:28           ` Maciej W. Rozycki
2022-10-26 11:58   ` Luis Machado
2022-10-29 13:52     ` Maciej W. Rozycki
2022-10-31  8:14       ` Luis Machado
2022-10-31 12:37         ` Luis Machado
2022-10-31 13:08           ` Maciej W. Rozycki
2022-10-31 13:14             ` Luis Machado
2022-10-31 14:05               ` Maciej W. Rozycki
2022-08-17 22:04 ` [PATCH v6 6/8] GDB: Allow arbitrary keywords in integer set commands Maciej W. Rozycki
2022-08-17 22:05 ` [PATCH v6 7/8] GDB: Add a character string limiting option Maciej W. Rozycki
2022-08-17 22:05 ` [PATCH v6 8/8] GDB/testsuite: Expand for character string limiting options Maciej W. Rozycki
2022-08-18  0:07   ` [PATCH v6.1 " Maciej W. Rozycki
2022-09-01 10:32 ` [PING][PATCH v6 0/8] gdb: split array and " Maciej W. Rozycki
2022-09-08  9:37 ` [PING^2][PATCH " Maciej W. Rozycki
2022-09-14 17:43 ` [PING^3][PATCH " Maciej W. Rozycki
2022-09-22 22:07 ` [PING^4][PATCH " Maciej W. Rozycki
2022-09-29  7:09 ` [PING^5][PATCH " Maciej W. Rozycki
2022-09-29  7:12   ` Simon Sobisch
2022-10-06 15:46 ` [PING^6][PATCH " Maciej W. Rozycki
2022-10-12 21:19 ` [PING^7][PATCH " Maciej W. Rozycki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).