Fix a bug in the "fromString" method where radix 2,8 and 16 values were

not being generated correctly because the shl operator does not mutate its
object but returns a new value. Also, make the distinction between radix
16 and the others more clear.

llvm-svn: 37111
This commit is contained in:
Reid Spencer 2007-05-16 19:18:22 +00:00
parent 138249b8ca
commit a93c981f66
1 changed files with 13 additions and 8 deletions

View File

@ -1861,21 +1861,26 @@ void APInt::fromString(uint32_t numbits, const char *str, uint32_t slen,
// Get a digit
uint32_t digit = 0;
char cdigit = str[i];
if (isdigit(cdigit))
digit = cdigit - '0';
else if (isxdigit(cdigit))
if (cdigit >= 'a')
if (radix == 16) {
if (!isxdigit(cdigit))
assert(0 && "Invalid hex digit in string");
if (isdigit(cdigit))
digit = cdigit - '0';
else if (cdigit >= 'a')
digit = cdigit - 'a' + 10;
else if (cdigit >= 'A')
digit = cdigit - 'A' + 10;
else
assert(0 && "huh?");
else
assert(0 && "huh? we shouldn't get here");
} else if (isdigit(cdigit)) {
digit = cdigit - '0';
} else {
assert(0 && "Invalid character in digit string");
}
// Shift or multiple the value by the radix
// Shift or multiply the value by the radix
if (shift)
this->shl(shift);
*this <<= shift;
else
*this *= apradix;