Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Kirill Smelkov
cpython
Commits
f666fb23
Commit
f666fb23
authored
19 years ago
by
Georg Brandl
Browse files
Options
Download
Email Patches
Plain Diff
Disallow keyword arguments for type constructors that don't use them.
(fixes bug #1119418)
parent
438dd4f0
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
100 additions
and
13 deletions
+100
-13
Include/modsupport.h
Include/modsupport.h
+1
-0
Misc/NEWS
Misc/NEWS
+3
-0
Modules/_randommodule.c
Modules/_randommodule.c
+3
-0
Modules/arraymodule.c
Modules/arraymodule.c
+3
-12
Modules/collectionsmodule.c
Modules/collectionsmodule.c
+3
-0
Modules/itertoolsmodule.c
Modules/itertoolsmodule.c
+36
-0
Modules/operator.c
Modules/operator.c
+6
-0
Modules/zipimport.c
Modules/zipimport.c
+3
-0
Objects/bufferobject.c
Objects/bufferobject.c
+4
-1
Objects/rangeobject.c
Objects/rangeobject.c
+3
-0
Objects/setobject.c
Objects/setobject.c
+6
-0
Objects/sliceobject.c
Objects/sliceobject.c
+3
-0
Python/getargs.c
Python/getargs.c
+26
-0
No files found.
Include/modsupport.h
View file @
f666fb23
...
...
@@ -15,6 +15,7 @@ PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
char
*
,
char
**
,
...);
PyAPI_FUNC
(
int
)
PyArg_UnpackTuple
(
PyObject
*
,
char
*
,
int
,
int
,
...);
PyAPI_FUNC
(
PyObject
*
)
Py_BuildValue
(
char
*
,
...);
PyAPI_FUNC
(
int
)
_PyArg_NoKeywords
(
char
*
funcname
,
PyObject
*
kw
);
PyAPI_FUNC
(
int
)
PyArg_VaParse
(
PyObject
*
,
char
*
,
va_list
);
PyAPI_FUNC
(
int
)
PyArg_VaParseTupleAndKeywords
(
PyObject
*
,
PyObject
*
,
...
...
This diff is collapsed.
Click to expand it.
Misc/NEWS
View file @
f666fb23
...
...
@@ -12,6 +12,9 @@ What's New in Python 2.5 alpha 1?
Core and builtins
-----------------
- Disallow keyword arguments for type constructors that don'
t
use
it
(
fixes
bug
#
1119418
).
-
Forward
UnicodeDecodeError
into
SyntaxError
for
source
encoding
errors
.
-
SF
bug
#
900092
:
When
tracing
(
e
.
g
.
for
hotshot
),
restore
'return'
events
for
...
...
This diff is collapsed.
Click to expand it.
Modules/_randommodule.c
View file @
f666fb23
...
...
@@ -481,6 +481,9 @@ random_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
RandomObject
*
self
;
PyObject
*
tmp
;
if
(
!
_PyArg_NoKeywords
(
"Random()"
,
kwds
))
return
NULL
;
self
=
(
RandomObject
*
)
type
->
tp_alloc
(
type
,
0
);
if
(
self
==
NULL
)
return
NULL
;
...
...
This diff is collapsed.
Click to expand it.
Modules/arraymodule.c
View file @
f666fb23
...
...
@@ -1799,18 +1799,9 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
char
c
;
PyObject
*
initial
=
NULL
,
*
it
=
NULL
;
struct
arraydescr
*
descr
;
if
(
kwds
!=
NULL
)
{
int
i
=
PyObject_Length
(
kwds
);
if
(
i
<
0
)
return
NULL
;
else
if
(
i
>
0
)
{
PyErr_SetString
(
PyExc_TypeError
,
"array.array constructor takes "
"no keyword arguments"
);
return
NULL
;
}
}
if
(
!
_PyArg_NoKeywords
(
"array.array()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_ParseTuple
(
args
,
"c|O:array"
,
&
c
,
&
initial
))
return
NULL
;
...
...
This diff is collapsed.
Click to expand it.
Modules/collectionsmodule.c
View file @
f666fb23
...
...
@@ -95,6 +95,9 @@ deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
dequeobject
*
deque
;
block
*
b
;
if
(
!
_PyArg_NoKeywords
(
"deque()"
,
kwds
))
return
NULL
;
/* create dequeobject structure */
deque
=
(
dequeobject
*
)
type
->
tp_alloc
(
type
,
0
);
if
(
deque
==
NULL
)
...
...
This diff is collapsed.
Click to expand it.
Modules/itertoolsmodule.c
View file @
f666fb23
...
...
@@ -618,6 +618,9 @@ cycle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
saved
;
cycleobject
*
lz
;
if
(
!
_PyArg_NoKeywords
(
"cycle()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
"cycle"
,
1
,
1
,
&
iterable
))
return
NULL
;
...
...
@@ -765,6 +768,9 @@ dropwhile_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
it
;
dropwhileobject
*
lz
;
if
(
!
_PyArg_NoKeywords
(
"dropwhile()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
"dropwhile"
,
2
,
2
,
&
func
,
&
seq
))
return
NULL
;
...
...
@@ -906,6 +912,9 @@ takewhile_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
it
;
takewhileobject
*
lz
;
if
(
!
_PyArg_NoKeywords
(
"takewhile()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
"takewhile"
,
2
,
2
,
&
func
,
&
seq
))
return
NULL
;
...
...
@@ -1048,6 +1057,9 @@ islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
int
numargs
;
isliceobject
*
lz
;
if
(
!
_PyArg_NoKeywords
(
"islice()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
"islice"
,
2
,
4
,
&
seq
,
&
a1
,
&
a2
,
&
a3
))
return
NULL
;
...
...
@@ -1236,6 +1248,9 @@ starmap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
it
;
starmapobject
*
lz
;
if
(
!
_PyArg_NoKeywords
(
"starmap()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
"starmap"
,
2
,
2
,
&
func
,
&
seq
))
return
NULL
;
...
...
@@ -1365,6 +1380,9 @@ imap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
imapobject
*
lz
;
int
numargs
,
i
;
if
(
!
_PyArg_NoKeywords
(
"imap()"
,
kwds
))
return
NULL
;
numargs
=
PyTuple_Size
(
args
);
if
(
numargs
<
2
)
{
PyErr_SetString
(
PyExc_TypeError
,
...
...
@@ -1544,6 +1562,9 @@ chain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
int
i
;
PyObject
*
ittuple
;
if
(
!
_PyArg_NoKeywords
(
"chain()"
,
kwds
))
return
NULL
;
/* obtain iterators */
assert
(
PyTuple_Check
(
args
));
ittuple
=
PyTuple_New
(
tuplesize
);
...
...
@@ -1684,6 +1705,9 @@ ifilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
it
;
ifilterobject
*
lz
;
if
(
!
_PyArg_NoKeywords
(
"ifilter()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
"ifilter"
,
2
,
2
,
&
func
,
&
seq
))
return
NULL
;
...
...
@@ -1825,6 +1849,9 @@ ifilterfalse_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
it
;
ifilterfalseobject
*
lz
;
if
(
!
_PyArg_NoKeywords
(
"ifilterfalse()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
"ifilterfalse"
,
2
,
2
,
&
func
,
&
seq
))
return
NULL
;
...
...
@@ -1964,6 +1991,9 @@ count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
countobject
*
lz
;
long
cnt
=
0
;
if
(
!
_PyArg_NoKeywords
(
"count()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_ParseTuple
(
args
,
"|l:count"
,
&
cnt
))
return
NULL
;
...
...
@@ -2060,6 +2090,9 @@ izip_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
result
;
int
tuplesize
=
PySequence_Length
(
args
);
if
(
!
_PyArg_NoKeywords
(
"izip()"
,
kwds
))
return
NULL
;
/* args must be a tuple */
assert
(
PyTuple_Check
(
args
));
...
...
@@ -2240,6 +2273,9 @@ repeat_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
element
;
long
cnt
=
-
1
;
if
(
!
_PyArg_NoKeywords
(
"repeat()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_ParseTuple
(
args
,
"O|l:repeat"
,
&
element
,
&
cnt
))
return
NULL
;
...
...
This diff is collapsed.
Click to expand it.
Modules/operator.c
View file @
f666fb23
...
...
@@ -269,6 +269,9 @@ itemgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
item
;
int
nitems
;
if
(
!
_PyArg_NoKeywords
(
"itemgetter()"
,
kwds
))
return
NULL
;
nitems
=
PyTuple_GET_SIZE
(
args
);
if
(
nitems
<=
1
)
{
if
(
!
PyArg_UnpackTuple
(
args
,
"itemgetter"
,
1
,
1
,
&
item
))
...
...
@@ -405,6 +408,9 @@ attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject
*
attr
;
int
nattrs
;
if
(
!
_PyArg_NoKeywords
(
"attrgetter()"
,
kwds
))
return
NULL
;
nattrs
=
PyTuple_GET_SIZE
(
args
);
if
(
nattrs
<=
1
)
{
if
(
!
PyArg_UnpackTuple
(
args
,
"attrgetter"
,
1
,
1
,
&
attr
))
...
...
This diff is collapsed.
Click to expand it.
Modules/zipimport.c
View file @
f666fb23
...
...
@@ -65,6 +65,9 @@ zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds)
char
*
path
,
*
p
,
*
prefix
,
buf
[
MAXPATHLEN
+
2
];
int
len
;
if
(
!
_PyArg_NoKeywords
(
"zipimporter()"
,
kwds
))
return
-
1
;
if
(
!
PyArg_ParseTuple
(
args
,
"s:zipimporter"
,
&
path
))
return
-
1
;
...
...
This diff is collapsed.
Click to expand it.
Objects/bufferobject.c
View file @
f666fb23
...
...
@@ -192,7 +192,10 @@ buffer_new(PyTypeObject *type, PyObject *args, PyObject *kw)
int
offset
=
0
;
int
size
=
Py_END_OF_BUFFER
;
if
(
!
PyArg_ParseTuple
(
args
,
"O|ii:buffer"
,
&
ob
,
&
offset
,
&
size
)
)
if
(
!
_PyArg_NoKeywords
(
"buffer()"
,
kw
))
return
NULL
;
if
(
!
PyArg_ParseTuple
(
args
,
"O|ii:buffer"
,
&
ob
,
&
offset
,
&
size
))
return
NULL
;
return
PyBuffer_FromObject
(
ob
,
offset
,
size
);
}
...
...
This diff is collapsed.
Click to expand it.
Objects/rangeobject.c
View file @
f666fb23
...
...
@@ -45,6 +45,9 @@ range_new(PyTypeObject *type, PyObject *args, PyObject *kw)
long
ilow
=
0
,
ihigh
=
0
,
istep
=
1
;
long
n
;
if
(
!
_PyArg_NoKeywords
(
"xrange()"
,
kw
))
return
NULL
;
if
(
PyTuple_Size
(
args
)
<=
1
)
{
if
(
!
PyArg_ParseTuple
(
args
,
"l;xrange() requires 1-3 int arguments"
,
...
...
This diff is collapsed.
Click to expand it.
Objects/setobject.c
View file @
f666fb23
...
...
@@ -935,6 +935,9 @@ frozenset_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject
*
iterable
=
NULL
,
*
result
;
if
(
!
_PyArg_NoKeywords
(
"frozenset()"
,
kwds
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
type
->
tp_name
,
0
,
1
,
&
iterable
))
return
NULL
;
...
...
@@ -976,6 +979,9 @@ PySet_Fini(void)
static
PyObject
*
set_new
(
PyTypeObject
*
type
,
PyObject
*
args
,
PyObject
*
kwds
)
{
if
(
!
_PyArg_NoKeywords
(
"set()"
,
kwds
))
return
NULL
;
return
make_new_set
(
type
,
NULL
);
}
...
...
This diff is collapsed.
Click to expand it.
Objects/sliceobject.c
View file @
f666fb23
...
...
@@ -174,6 +174,9 @@ slice_new(PyTypeObject *type, PyObject *args, PyObject *kw)
start
=
stop
=
step
=
NULL
;
if
(
!
_PyArg_NoKeywords
(
"slice()"
,
kw
))
return
NULL
;
if
(
!
PyArg_UnpackTuple
(
args
,
"slice"
,
1
,
3
,
&
start
,
&
stop
,
&
step
))
return
NULL
;
...
...
This diff is collapsed.
Click to expand it.
Python/getargs.c
View file @
f666fb23
...
...
@@ -1595,3 +1595,29 @@ PyArg_UnpackTuple(PyObject *args, char *name, int min, int max, ...)
va_end
(
vargs
);
return
1
;
}
/* For type constructors that don't take keyword args
*
* Sets a TypeError and returns 0 if the kwds dict is
* not emtpy, returns 1 otherwise
*/
int
_PyArg_NoKeywords
(
char
*
funcname
,
PyObject
*
kw
)
{
if
(
kw
==
NULL
)
return
1
;
if
(
!
PyDict_CheckExact
(
kw
))
{
PyErr_BadInternalCall
();
return
0
;
}
if
(
PyDict_Size
(
kw
)
==
0
)
return
1
;
PyErr_Format
(
PyExc_TypeError
,
"%s does not take keyword arguments"
,
funcname
);
return
0
;
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment