Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
6b1010e7
Commit
6b1010e7
authored
Dec 28, 2006
by
Neal Norwitz
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove PyFloat_AsReprString() and PyFloat_AsString() which should not
have been public due to passing buffers without lengths.
parent
4dc8a3da
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
27 additions
and
61 deletions
+27
-61
Include/floatobject.h
Include/floatobject.h
+5
-14
Objects/floatobject.c
Objects/floatobject.c
+16
-27
Python/marshal.c
Python/marshal.c
+6
-20
No files found.
Include/floatobject.h
View file @
6b1010e7
...
...
@@ -34,19 +34,6 @@ PyAPI_FUNC(PyObject *) PyFloat_FromDouble(double);
PyAPI_FUNC
(
double
)
PyFloat_AsDouble
(
PyObject
*
);
#define PyFloat_AS_DOUBLE(op) (((PyFloatObject *)(op))->ob_fval)
/* Write repr(v) into the char buffer argument, followed by null byte. The
buffer must be "big enough"; >= 100 is very safe.
PyFloat_AsReprString(buf, x) strives to print enough digits so that
PyFloat_FromString(buf) then reproduces x exactly. */
PyAPI_FUNC
(
void
)
PyFloat_AsReprString
(
char
*
,
PyFloatObject
*
v
);
/* Write str(v) into the char buffer argument, followed by null byte. The
buffer must be "big enough"; >= 100 is very safe. Note that it's
unusual to be able to get back the float you started with from
PyFloat_AsString's result -- use PyFloat_AsReprString() if you want to
preserve precision across conversions. */
PyAPI_FUNC
(
void
)
PyFloat_AsString
(
char
*
,
PyFloatObject
*
v
);
/* _PyFloat_{Pack,Unpack}{4,8}
*
* The struct and pickle (at least) modules need an efficient platform-
...
...
@@ -82,6 +69,11 @@ PyAPI_FUNC(void) PyFloat_AsString(char*, PyFloatObject *v);
PyAPI_FUNC
(
int
)
_PyFloat_Pack4
(
double
x
,
unsigned
char
*
p
,
int
le
);
PyAPI_FUNC
(
int
)
_PyFloat_Pack8
(
double
x
,
unsigned
char
*
p
,
int
le
);
/* Needed for the old way for marshal to store a floating point number.
Returns the string length copied into p, -1 on error.
*/
PyAPI_FUNC
(
int
)
_PyFloat_Repr
(
double
x
,
char
*
p
,
size_t
len
);
/* The unpack routines read 4 or 8 bytes, starting at p. le is a bool
* argument, true if the string is in little-endian format (exponent
* last, at p+3 or p+7), false if big-endian (exponent first, at p).
...
...
@@ -93,7 +85,6 @@ PyAPI_FUNC(int) _PyFloat_Pack8(double x, unsigned char *p, int le);
PyAPI_FUNC
(
double
)
_PyFloat_Unpack4
(
const
unsigned
char
*
p
,
int
le
);
PyAPI_FUNC
(
double
)
_PyFloat_Unpack8
(
const
unsigned
char
*
p
,
int
le
);
#ifdef __cplusplus
}
#endif
...
...
Objects/floatobject.c
View file @
6b1010e7
...
...
@@ -220,19 +220,18 @@ PyFloat_AsDouble(PyObject *op)
/* Methods */
static
void
format_
float
(
char
*
buf
,
size_t
buflen
,
PyFloatObject
*
v
,
int
precision
)
format_
double
(
char
*
buf
,
size_t
buflen
,
double
ob_fval
,
int
precision
)
{
register
char
*
cp
;
char
format
[
32
];
/* Subroutine for float_repr
and float_print
.
/* Subroutine for float_repr
, float_str, float_print and others
.
We want float numbers to be recognizable as such,
i.e., they should contain a decimal point or an exponent.
However, %g may print the number as an integer;
in such cases, we append ".0" to the string. */
assert
(
PyFloat_Check
(
v
));
PyOS_snprintf
(
format
,
32
,
"%%.%ig"
,
precision
);
PyOS_ascii_formatd
(
buf
,
buflen
,
format
,
v
->
ob_fval
);
PyOS_ascii_formatd
(
buf
,
buflen
,
format
,
ob_fval
);
cp
=
buf
;
if
(
*
cp
==
'-'
)
cp
++
;
...
...
@@ -249,14 +248,11 @@ format_float(char *buf, size_t buflen, PyFloatObject *v, int precision)
}
}
/* XXX PyFloat_AsStringEx should not be a public API function (for one
XXX thing, its signature passes a buffer without a length; for another,
XXX it isn't useful outside this file).
*/
void
PyFloat_AsStringEx
(
char
*
buf
,
PyFloatObject
*
v
,
int
precision
)
static
void
format_float
(
char
*
buf
,
size_t
buflen
,
PyFloatObject
*
v
,
int
precision
)
{
format_float
(
buf
,
100
,
v
,
precision
);
assert
(
PyFloat_Check
(
v
));
format_double
(
buf
,
buflen
,
PyFloat_AS_DOUBLE
(
v
),
precision
);
}
/* Macro and helper that convert PyObject obj to a C double and store
...
...
@@ -312,21 +308,6 @@ convert_to_double(PyObject **v, double *dbl)
#define PREC_REPR 17
#define PREC_STR 12
/* XXX PyFloat_AsString and PyFloat_AsReprString should be deprecated:
XXX they pass a char buffer without passing a length.
*/
void
PyFloat_AsString
(
char
*
buf
,
PyFloatObject
*
v
)
{
format_float
(
buf
,
100
,
v
,
PREC_STR
);
}
void
PyFloat_AsReprString
(
char
*
buf
,
PyFloatObject
*
v
)
{
format_float
(
buf
,
100
,
v
,
PREC_REPR
);
}
/* ARGSUSED */
static
int
float_print
(
PyFloatObject
*
v
,
FILE
*
fp
,
int
flags
)
...
...
@@ -1275,7 +1256,7 @@ PyFloat_Fini(void)
if
(
PyFloat_CheckExact
(
p
)
&&
p
->
ob_refcnt
!=
0
)
{
char
buf
[
100
];
PyFloat_AsString
(
buf
,
p
);
format_float
(
buf
,
sizeof
(
buf
),
p
,
PREC_STR
);
/* XXX(twouters) cast refcount to
long until %zd is universally
available
...
...
@@ -1527,6 +1508,14 @@ _PyFloat_Pack8(double x, unsigned char *p, int le)
}
}
/* Should only be used by marshal. */
int
_PyFloat_Repr
(
double
x
,
char
*
p
,
size_t
len
)
{
format_double
(
p
,
len
,
x
,
PREC_REPR
);
return
(
int
)
strlen
(
p
);
}
double
_PyFloat_Unpack4
(
const
unsigned
char
*
p
,
int
le
)
{
...
...
Python/marshal.c
View file @
6b1010e7
...
...
@@ -182,8 +182,8 @@ w_object(PyObject *v, WFILE *p)
}
else
{
char
buf
[
256
];
/* Plenty to format any double */
PyFloat_AsReprString
(
buf
,
(
PyFloatObject
*
)
v
);
n
=
strlen
(
buf
);
n
=
_PyFloat_Repr
(
PyFloat_AS_DOUBLE
(
v
),
buf
,
sizeof
(
buf
)
);
w_byte
(
TYPE_FLOAT
,
p
);
w_byte
((
int
)
n
,
p
);
w_string
(
buf
,
(
int
)
n
,
p
);
...
...
@@ -209,28 +209,14 @@ w_object(PyObject *v, WFILE *p)
}
else
{
char
buf
[
256
];
/* Plenty to format any double */
PyFloatObject
*
temp
;
w_byte
(
TYPE_COMPLEX
,
p
);
temp
=
(
PyFloatObject
*
)
PyFloat_FromDouble
(
PyComplex_RealAsDouble
(
v
));
if
(
!
temp
)
{
p
->
error
=
1
;
return
;
}
PyFloat_AsReprString
(
buf
,
temp
);
Py_DECREF
(
temp
);
n
=
_PyFloat_Repr
(
PyComplex_RealAsDouble
(
v
),
buf
,
sizeof
(
buf
));
n
=
strlen
(
buf
);
w_byte
((
int
)
n
,
p
);
w_string
(
buf
,
(
int
)
n
,
p
);
temp
=
(
PyFloatObject
*
)
PyFloat_FromDouble
(
PyComplex_ImagAsDouble
(
v
));
if
(
!
temp
)
{
p
->
error
=
1
;
return
;
}
PyFloat_AsReprString
(
buf
,
temp
);
Py_DECREF
(
temp
);
n
=
strlen
(
buf
);
n
=
_PyFloat_Repr
(
PyComplex_ImagAsDouble
(
v
),
buf
,
sizeof
(
buf
));
w_byte
((
int
)
n
,
p
);
w_string
(
buf
,
(
int
)
n
,
p
);
}
...
...
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