Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
---
 include/vm/object.h |   12 ++++++++++++
 vm/object.c         |    9 ++++-----
 vm/utf8.c           |    7 +++----
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/include/vm/object.h b/include/vm/object.h
index 6fcdfa0..a38a1d3 100644
--- a/include/vm/object.h
+++ b/include/vm/object.h
@@ -72,4 +72,16 @@ field_get_object(const struct vm_object *obj, const struct 
vm_field *field)
        return *(struct vm_object **) &obj->fields[field->offset];
 }
 
+static inline void
+array_set_field_char(struct vm_object *obj, int index, uint16_t value)
+{
+       *(uint16_t *) &obj->fields[index * get_vmtype_size(J_CHAR)] = value;
+}
+
+static inline uint16_t
+array_get_field_char(struct vm_object *obj, int index)
+{
+       return *(uint16_t *) &obj->fields[index * get_vmtype_size(J_CHAR)];
+}
+
 #endif
diff --git a/vm/object.c b/vm/object.c
index 7381f6b..0f96e62 100644
--- a/vm/object.c
+++ b/vm/object.c
@@ -228,9 +228,8 @@ vm_object_alloc_string_from_c(const char *bytes)
        /* XXX: Need to handle code points >= 0x80 */
        NOT_IMPLEMENTED;
 
-       uint16_t *utf16_chars = (uint16_t *) &array->fields;
        for (unsigned int i = 0; i < n; ++i) {
-               utf16_chars[i] = bytes[i];
+               array_set_field_char(array, i, bytes[i]);
        }
 
        field_set_int32(string, vm_java_lang_String_offset, 0);
@@ -451,7 +450,6 @@ char *vm_string_to_cstr(const struct vm_object *string_obj)
 {
        struct vm_object *array_object;
        struct string *str;
-       int16_t *array;
        int32_t offset;
        int32_t count;
        char *result;
@@ -459,7 +457,6 @@ char *vm_string_to_cstr(const struct vm_object *string_obj)
        offset = field_get_int32(string_obj, vm_java_lang_String_offset);
        count = field_get_int32(string_obj, vm_java_lang_String_count);
        array_object = field_get_object(string_obj, vm_java_lang_String_value);
-       array = (int16_t *) array_object->fields;
 
        str = alloc_str();
        if (!str)
@@ -468,9 +465,11 @@ char *vm_string_to_cstr(const struct vm_object *string_obj)
        result = NULL;
 
        for (int32_t i = 0; i < count; ++i) {
-               int16_t ch = array[offset + i];
+               int16_t ch;
                int err;
 
+               ch = array_get_field_char(array_object, offset + i);
+
                if (ch < 128 && isprint(ch))
                        err = str_append(str, "%c", ch);
                else
diff --git a/vm/utf8.c b/vm/utf8.c
index 36f914a..4ace133 100644
--- a/vm/utf8.c
+++ b/vm/utf8.c
@@ -58,17 +58,16 @@ struct vm_object *utf8_to_char_array(const uint8_t *bytes, 
unsigned int n)
                return array;
        }
 
-       uint16_t *utf16_chars = (uint16_t *) &array->fields;
        for (unsigned int i = 0, j = 0; i < n; ++i) {
                if (!(bytes[i] & 0x80)) {
-                       utf16_chars[j++] = bytes[i];
+                       array_set_field_char(array, j++, bytes[i]);
                        continue;
                }
 
                if ((bytes[i] & 0xe0) == 0xc0) {
                        uint16_t ch = (uint16_t) (bytes[i++] & 0x1f) << 6;
                        ch += bytes[i++] & 0x3f;
-                       utf16_chars[j++] = ch;
+                       array_set_field_char(array, j++, ch);
                        continue;
                }
 
@@ -76,7 +75,7 @@ struct vm_object *utf8_to_char_array(const uint8_t *bytes, 
unsigned int n)
                        uint16_t ch = (uint16_t) (bytes[i++] & 0xf) << 12;
                        ch += (uint16_t) (bytes[i++] & 0x3f) << 6;
                        ch += bytes[i++] & 0x3f;
-                       utf16_chars[j++] = ch;
+                       array_set_field_char(array, j++, ch);
                        continue;
                }
        }
-- 
1.6.0.6


------------------------------------------------------------------------------
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to