Issue #19474: Argument Clinic now always specifies a default value for

variables in option groups, to prevent "uninitialized value" warnings.
This commit is contained in:
Larry Hastings 2013-11-20 09:13:52 -08:00
parent f3bf35eee4
commit abc716b058
2 changed files with 41 additions and 9 deletions

View File

@ -608,11 +608,11 @@ curses_window_addch(PyObject *self, PyObject *args)
{
PyObject *return_value = NULL;
int group_left_1 = 0;
int x;
int y;
int x = 0;
int y = 0;
PyObject *ch;
int group_right_1 = 0;
long attr;
long attr = 0;
switch (PyTuple_Size(args)) {
case 1:
@ -646,7 +646,7 @@ curses_window_addch(PyObject *self, PyObject *args)
static PyObject *
curses_window_addch_impl(PyObject *self, int group_left_1, int x, int y, PyObject *ch, int group_right_1, long attr)
/*[clinic checksum: 98ade780397a48d0be48439763424b3b00c92089]*/
/*[clinic checksum: 094d012af1019387c0219a9c0bc76e90729c833f]*/
{
PyCursesWindowObject *cwself = (PyCursesWindowObject *)self;
int coordinates_group = group_left_1;

View File

@ -1281,17 +1281,29 @@ class CConverter(metaclass=CConverterAutoRegister):
# Or "unspecified" if there is no default.
default = unspecified
# "default" converted into a str for rendering into Python code.
py_default = None
# "default" as it should appear in the documentation, as a string.
# Or None if there is no default.
doc_default = None
# "default" converted into a str for rendering into Python code.
py_default = None
# "default" converted into a C value, as a string.
# Or None if there is no default.
c_default = None
# The default value used to initialize the C variable when
# there is no default, but not specifying a default may
# result in an "uninitialized variable" warning. This can
# easily happen when using option groups--although
# properly-written code won't actually use the variable,
# the variable does get passed in to the _impl. (Ah, if
# only dataflow analysis could inline the static function!)
#
# This value is specified as a string.
# Every non-abstract subclass should supply a valid value.
c_ignored_default = 'NULL'
# The C converter *function* to be used, if any.
# (If this is not None, format_unit must be 'O&'.)
converter = None
@ -1327,6 +1339,7 @@ class CConverter(metaclass=CConverterAutoRegister):
parameter is a clinic.Parameter instance.
data is a CRenderData instance.
"""
self.parameter = parameter
name = ensure_legal_c_identifier(self.name)
# declarations
@ -1401,9 +1414,12 @@ class CConverter(metaclass=CConverterAutoRegister):
The C statement to declare this variable.
"""
declaration = [self.simple_declaration()]
if self.c_default:
default = self.c_default
if not default and self.parameter.group:
default = self.c_ignored_default
if default:
declaration.append(" = ")
declaration.append(self.c_default)
declaration.append(default)
declaration.append(";")
return "".join(declaration)
@ -1427,6 +1443,7 @@ class CConverter(metaclass=CConverterAutoRegister):
class bool_converter(CConverter):
type = 'int'
format_unit = 'p'
c_ignored_default = '0'
def converter_init(self):
self.default = bool(self.default)
@ -1435,11 +1452,13 @@ class bool_converter(CConverter):
class char_converter(CConverter):
type = 'char'
format_unit = 'c'
c_ignored_default = "'\0'"
@add_legacy_c_converter('B', bitwise=True)
class byte_converter(CConverter):
type = 'byte'
format_unit = 'b'
c_ignored_default = "'\0'"
def converter_init(self, *, bitwise=False):
if bitwise:
@ -1448,10 +1467,12 @@ class byte_converter(CConverter):
class short_converter(CConverter):
type = 'short'
format_unit = 'h'
c_ignored_default = "0"
class unsigned_short_converter(CConverter):
type = 'unsigned short'
format_unit = 'H'
c_ignored_default = "0"
def converter_init(self, *, bitwise=False):
if not bitwise:
@ -1461,6 +1482,7 @@ class unsigned_short_converter(CConverter):
class int_converter(CConverter):
type = 'int'
format_unit = 'i'
c_ignored_default = "0"
def converter_init(self, *, from_str=False):
if from_str:
@ -1469,6 +1491,7 @@ class int_converter(CConverter):
class unsigned_int_converter(CConverter):
type = 'unsigned int'
format_unit = 'I'
c_ignored_default = "0"
def converter_init(self, *, bitwise=False):
if not bitwise:
@ -1477,10 +1500,12 @@ class unsigned_int_converter(CConverter):
class long_converter(CConverter):
type = 'long'
format_unit = 'l'
c_ignored_default = "0"
class unsigned_long_converter(CConverter):
type = 'unsigned long'
format_unit = 'k'
c_ignored_default = "0"
def converter_init(self, *, bitwise=False):
if not bitwise:
@ -1489,10 +1514,12 @@ class unsigned_long_converter(CConverter):
class PY_LONG_LONG_converter(CConverter):
type = 'PY_LONG_LONG'
format_unit = 'L'
c_ignored_default = "0"
class unsigned_PY_LONG_LONG_converter(CConverter):
type = 'unsigned PY_LONG_LONG'
format_unit = 'K'
c_ignored_default = "0"
def converter_init(self, *, bitwise=False):
if not bitwise:
@ -1501,20 +1528,24 @@ class unsigned_PY_LONG_LONG_converter(CConverter):
class Py_ssize_t_converter(CConverter):
type = 'Py_ssize_t'
format_unit = 'n'
c_ignored_default = "0"
class float_converter(CConverter):
type = 'float'
format_unit = 'f'
c_ignored_default = "0.0"
class double_converter(CConverter):
type = 'double'
format_unit = 'd'
c_ignored_default = "0.0"
class Py_complex_converter(CConverter):
type = 'Py_complex'
format_unit = 'D'
c_ignored_default = "{0.0, 0.0}"
class object_converter(CConverter):
@ -1579,6 +1610,7 @@ class Py_buffer_converter(CConverter):
type = 'Py_buffer'
format_unit = 'y*'
impl_by_reference = True
c_ignored_default = "{NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL}"
def converter_init(self, *, str=False, zeroes=False, nullable=False, read_write=False):
if not str: