aboutsummaryrefslogtreecommitdiff
path: root/gcc/java/jcf-parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/java/jcf-parse.c')
-rw-r--r--gcc/java/jcf-parse.c52
1 files changed, 29 insertions, 23 deletions
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c
index 82c92ee..aa56811 100644
--- a/gcc/java/jcf-parse.c
+++ b/gcc/java/jcf-parse.c
@@ -328,29 +328,33 @@ get_constant (jcf, index)
{
tree name = get_name_constant (jcf, JPOOL_USHORT1 (jcf, index));
const char *utf8_ptr = IDENTIFIER_POINTER (name);
- unsigned char *str_ptr;
int utf8_len = IDENTIFIER_LENGTH (name);
- const unsigned char *str = (const unsigned char *)utf8_ptr;
- int i = utf8_len;
- int str_len;
+ unsigned char *str_ptr;
+ unsigned char *str;
+ const unsigned char *utf8;
+ int i, str_len;
/* Count the number of Unicode characters in the string,
while checking for a malformed Utf8 string. */
- for (str_len = 0; i > 0; str_len++)
+ utf8 = (const unsigned char *) utf8_ptr;
+ i = utf8_len;
+ str_len = 0;
+ while (i > 0)
{
- int char_len = UT8_CHAR_LENGTH (*str);
+ int char_len = UT8_CHAR_LENGTH (*utf8);
if (char_len < 0 || char_len > 3 || char_len > i)
fatal ("bad string constant");
- str += char_len;
+ utf8 += char_len;
i -= char_len;
+ str_len++;
}
- value = make_node (STRING_CST);
- TREE_TYPE (value) = build_pointer_type (string_type_node);
- TREE_STRING_LENGTH (value) = 2 * str_len;
- TREE_STRING_POINTER (value) = ggc_alloc (2 * str_len);
- str_ptr = (unsigned char *) TREE_STRING_POINTER (value);
- str = (const unsigned char *)utf8_ptr;
+ /* Allocate a scratch buffer, convert the string to UCS2, and copy it
+ into the new space. */
+ str_ptr = (unsigned char *) alloca (2 * str_len);
+ str = str_ptr;
+ utf8 = (const unsigned char *)utf8_ptr;
+
for (i = 0; i < str_len; i++)
{
int char_value;
@@ -358,31 +362,33 @@ get_constant (jcf, index)
switch (char_len)
{
case 1:
- char_value = *str++;
+ char_value = *utf8++;
break;
case 2:
- char_value = *str++ & 0x1F;
- char_value = (char_value << 6) | (*str++ & 0x3F);
+ char_value = *utf8++ & 0x1F;
+ char_value = (char_value << 6) | (*utf8++ & 0x3F);
break;
case 3:
- char_value = *str++ & 0x0F;
- char_value = (char_value << 6) | (*str++ & 0x3F);
- char_value = (char_value << 6) | (*str++ & 0x3F);
+ char_value = *utf8++ & 0x0F;
+ char_value = (char_value << 6) | (*utf8++ & 0x3F);
+ char_value = (char_value << 6) | (*utf8++ & 0x3F);
break;
default:
goto bad;
}
if (BYTES_BIG_ENDIAN)
{
- *str_ptr++ = char_value >> 8;
- *str_ptr++ = char_value & 0xFF;
+ *str++ = char_value >> 8;
+ *str++ = char_value & 0xFF;
}
else
{
- *str_ptr++ = char_value & 0xFF;
- *str_ptr++ = char_value >> 8;
+ *str++ = char_value & 0xFF;
+ *str++ = char_value >> 8;
}
}
+ value = build_string (str - str_ptr, str_ptr);
+ TREE_TYPE (value) = build_pointer_type (string_type_node);
}
break;
default: