mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-23 17:44:52 +08:00
natDouble.cc (parseDouble): Cannot use errno to check for errors...
* java/lang/natDouble.cc (parseDouble): Cannot use errno to check for errors, since we don't want to throw exception on overflow/underflow. Instead, trim whitespace, and then check that _strtod_r uses up all the rest of the string. From-SVN: r40800
This commit is contained in:
parent
7a3155bef7
commit
3c45ffa514
@ -15,6 +15,7 @@ details. */
|
||||
#include <gcj/cni.h>
|
||||
#include <java/lang/String.h>
|
||||
#include <java/lang/Double.h>
|
||||
#include <java/lang/Character.h>
|
||||
#include <java/lang/NumberFormatException.h>
|
||||
#include <jvm.h>
|
||||
|
||||
@ -160,19 +161,28 @@ jdouble
|
||||
java::lang::Double::parseDouble(jstring str)
|
||||
{
|
||||
int length = str->length();
|
||||
// Note that UTF can expand 3x.
|
||||
while (length > 0
|
||||
&& Character::isWhitespace(str->charAt(length - 1)))
|
||||
length--;
|
||||
jsize start = 0;
|
||||
while (length > 0
|
||||
&& Character::isWhitespace(str->charAt(start)))
|
||||
start++, length--;
|
||||
|
||||
char *data = (char *) __builtin_alloca (3 * length + 1);
|
||||
if (length > 0)
|
||||
{
|
||||
// Note that UTF can expand 3x.
|
||||
char *data = (char *) __builtin_alloca (3 * length + 1);
|
||||
jsize blength = _Jv_GetStringUTFRegion (str, start, length, data);
|
||||
data[blength] = 0;
|
||||
|
||||
data[_Jv_GetStringUTFRegion (str, 0, length, data)] = 0;
|
||||
struct _Jv_reent reent;
|
||||
memset (&reent, 0, sizeof reent);
|
||||
|
||||
struct _Jv_reent reent;
|
||||
memset (&reent, 0, sizeof reent);
|
||||
|
||||
double val = _strtod_r (&reent, data, NULL);
|
||||
|
||||
if (reent._errno)
|
||||
_Jv_Throw (new NumberFormatException);
|
||||
|
||||
return val;
|
||||
char *endptr;
|
||||
double val = _strtod_r (&reent, data, &endptr);
|
||||
if (endptr == data + blength)
|
||||
return val;
|
||||
}
|
||||
_Jv_Throw (new NumberFormatException);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user