For PR java/6382:
* parse.y (string_convert_int_cst): New function. (merge_string_cste): Use it. From-SVN: r52835
This commit is contained in:
parent
a62271540b
commit
0a32c5ea4a
2 changed files with 85 additions and 3 deletions
|
@ -1,3 +1,9 @@
|
|||
2002-04-27 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
For PR java/6382:
|
||||
* parse.y (string_convert_int_cst): New function.
|
||||
(merge_string_cste): Use it.
|
||||
|
||||
2002-04-25 Neil Booth <neil@daikokuya.demon.co.uk>
|
||||
|
||||
* java-tree.h (java_parse_file): Update.
|
||||
|
|
|
@ -337,6 +337,8 @@ static bool attach_init_test_initialization_flags PARAMS ((struct hash_entry *,
|
|||
PTR));
|
||||
static bool emit_test_initialization PARAMS ((struct hash_entry *, PTR));
|
||||
|
||||
static char *string_convert_int_cst PARAMS ((tree));
|
||||
|
||||
/* Number of error found so far. */
|
||||
int java_error_count;
|
||||
/* Number of warning found so far. */
|
||||
|
@ -12554,8 +12556,82 @@ build_assignment (op, op_location, lhs, rhs)
|
|||
return assignment;
|
||||
}
|
||||
|
||||
/* Print an INTEGER_CST node in a static buffer, and return the buffer. */
|
||||
/* Print an INTEGER_CST node as decimal in a static buffer, and return
|
||||
the buffer. This is used only for string conversion. */
|
||||
static char *
|
||||
string_convert_int_cst (node)
|
||||
tree node;
|
||||
{
|
||||
static char buffer[80];
|
||||
|
||||
unsigned HOST_WIDE_INT lo = TREE_INT_CST_LOW (node);
|
||||
unsigned HOST_WIDE_INT hi = TREE_INT_CST_HIGH (node);
|
||||
char *p = buffer + sizeof (buffer) - 1;
|
||||
int neg = 0;
|
||||
|
||||
unsigned HOST_WIDE_INT hibit = (((unsigned HOST_WIDE_INT) 1)
|
||||
<< (HOST_BITS_PER_WIDE_INT - 1));
|
||||
|
||||
*p-- = '\0';
|
||||
|
||||
/* If negative, note the fact and negate the value. */
|
||||
if ((hi & hibit))
|
||||
{
|
||||
lo = ~lo;
|
||||
hi = ~hi;
|
||||
if (++lo == 0)
|
||||
++hi;
|
||||
neg = 1;
|
||||
}
|
||||
|
||||
/* Divide by 10 until there are no bits left. */
|
||||
while (hi || lo)
|
||||
{
|
||||
unsigned HOST_WIDE_INT acc = 0;
|
||||
unsigned HOST_WIDE_INT outhi = 0, outlo = 0;
|
||||
unsigned int i;
|
||||
|
||||
/* Use long division to compute the result and the remainder. */
|
||||
for (i = 0; i < 2 * HOST_BITS_PER_WIDE_INT; ++i)
|
||||
{
|
||||
/* Shift a bit into accumulator. */
|
||||
acc <<= 1;
|
||||
if ((hi & hibit))
|
||||
acc |= 1;
|
||||
|
||||
/* Shift the value. */
|
||||
hi <<= 1;
|
||||
if ((lo & hibit))
|
||||
hi |= 1;
|
||||
lo <<= 1;
|
||||
|
||||
/* Shift the correct bit into the result. */
|
||||
outhi <<= 1;
|
||||
if ((outlo & hibit))
|
||||
outhi |= 1;
|
||||
outlo <<= 1;
|
||||
if (acc >= 10)
|
||||
{
|
||||
acc -= 10;
|
||||
outlo |= 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: ASCII assumption. */
|
||||
*p-- = '0' + acc;
|
||||
|
||||
hi = outhi;
|
||||
lo = outlo;
|
||||
}
|
||||
|
||||
if (neg)
|
||||
*p-- = '-';
|
||||
|
||||
return p + 1;
|
||||
}
|
||||
|
||||
/* Print an INTEGER_CST node in a static buffer, and return the
|
||||
buffer. This is used only for error handling. */
|
||||
char *
|
||||
print_int_node (node)
|
||||
tree node;
|
||||
|
@ -13678,7 +13754,7 @@ merge_string_cste (op1, op2, after)
|
|||
string = ch;
|
||||
}
|
||||
else
|
||||
string = print_int_node (op2);
|
||||
string = string_convert_int_cst (op2);
|
||||
|
||||
return do_merge_string_cste (op1, string, strlen (string), after);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue