< prev index next >
src/share/vm/classfile/javaClasses.hpp
Print this page
*** 51,82 ****
// Interface to java.lang.String objects
class java_lang_String : AllStatic {
private:
static int value_offset;
- static int offset_offset;
- static int count_offset;
static int hash_offset;
static bool initialized;
! static Handle basic_create(int length, TRAPS);
! static void set_offset(oop string, int offset) {
assert(initialized, "Must be initialized");
! if (offset_offset > 0) {
! string->int_field_put(offset_offset, offset);
! }
! }
! static void set_count( oop string, int count) {
! assert(initialized, "Must be initialized");
! if (count_offset > 0) {
! string->int_field_put(count_offset, count);
}
}
public:
static void compute_offsets();
// Instance creation
static Handle create_from_unicode(jchar* unicode, int len, TRAPS);
static oop create_oop_from_unicode(jchar* unicode, int len, TRAPS);
--- 51,82 ----
// Interface to java.lang.String objects
class java_lang_String : AllStatic {
private:
static int value_offset;
static int hash_offset;
+ static int coder_offset;
static bool initialized;
! static Handle basic_create(int length, bool byte_arr, TRAPS);
! static void set_coder(oop string, jbyte coder) {
assert(initialized, "Must be initialized");
! if (coder_offset > 0) {
! string->byte_field_put(coder_offset, coder);
}
}
public:
+
+ // Coders
+ enum Coder {
+ CODER_LATIN1 = 0,
+ CODER_UTF16 = 1
+ };
+
static void compute_offsets();
// Instance creation
static Handle create_from_unicode(jchar* unicode, int len, TRAPS);
static oop create_oop_from_unicode(jchar* unicode, int len, TRAPS);
*** 84,124 ****
static oop create_oop_from_str(const char* utf8_str, TRAPS);
static Handle create_from_symbol(Symbol* symbol, TRAPS);
static Handle create_from_platform_dependent_str(const char* str, TRAPS);
static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS);
! static bool has_offset_field() {
assert(initialized, "Must be initialized");
! return (offset_offset > 0);
}
!
! static bool has_count_field() {
assert(initialized, "Must be initialized");
! return (count_offset > 0);
}
! static bool has_hash_field() {
! assert(initialized, "Must be initialized");
! return (hash_offset > 0);
! }
static int value_offset_in_bytes() {
assert(initialized && (value_offset > 0), "Must be initialized");
return value_offset;
}
- static int count_offset_in_bytes() {
- assert(initialized && (count_offset > 0), "Must be initialized");
- return count_offset;
- }
- static int offset_offset_in_bytes() {
- assert(initialized && (offset_offset > 0), "Must be initialized");
- return offset_offset;
- }
static int hash_offset_in_bytes() {
assert(initialized && (hash_offset > 0), "Must be initialized");
return hash_offset;
}
static void set_value_raw(oop string, typeArrayOop buffer) {
assert(initialized, "Must be initialized");
string->obj_field_put_raw(value_offset, buffer);
}
--- 84,116 ----
static oop create_oop_from_str(const char* utf8_str, TRAPS);
static Handle create_from_symbol(Symbol* symbol, TRAPS);
static Handle create_from_platform_dependent_str(const char* str, TRAPS);
static Handle char_converter(Handle java_string, jchar from_char, jchar to_char, TRAPS);
! static bool has_hash_field() {
assert(initialized, "Must be initialized");
! return (hash_offset > 0);
}
! static bool has_coder_field() {
assert(initialized, "Must be initialized");
! return (coder_offset > 0);
}
! static void set_compact_strings(bool value);
static int value_offset_in_bytes() {
assert(initialized && (value_offset > 0), "Must be initialized");
return value_offset;
}
static int hash_offset_in_bytes() {
assert(initialized && (hash_offset > 0), "Must be initialized");
return hash_offset;
}
+ static int coder_offset_in_bytes() {
+ assert(initialized && (coder_offset > 0), "Must be initialized");
+ return coder_offset;
+ }
static void set_value_raw(oop string, typeArrayOop buffer) {
assert(initialized, "Must be initialized");
string->obj_field_put_raw(value_offset, buffer);
}
*** 140,171 ****
static unsigned int hash(oop java_string) {
assert(initialized && (hash_offset > 0), "Must be initialized");
assert(is_instance(java_string), "must be java_string");
return java_string->int_field(hash_offset);
}
! static int offset(oop java_string) {
assert(initialized, "Must be initialized");
assert(is_instance(java_string), "must be java_string");
! if (offset_offset > 0) {
! return java_string->int_field(offset_offset);
} else {
! return 0;
}
}
static int length(oop java_string) {
assert(initialized, "Must be initialized");
assert(is_instance(java_string), "must be java_string");
- if (count_offset > 0) {
- return java_string->int_field(count_offset);
- } else {
typeArrayOop value_array = ((typeArrayOop)java_string->obj_field(value_offset));
if (value_array == NULL) {
return 0;
- } else {
- return value_array->length();
}
}
}
static int utf8_length(oop java_string);
// String converters
static char* as_utf8_string(oop java_string);
--- 132,165 ----
static unsigned int hash(oop java_string) {
assert(initialized && (hash_offset > 0), "Must be initialized");
assert(is_instance(java_string), "must be java_string");
return java_string->int_field(hash_offset);
}
! static bool is_latin1(oop java_string) {
assert(initialized, "Must be initialized");
assert(is_instance(java_string), "must be java_string");
! if (coder_offset > 0) {
! jbyte coder = java_string->byte_field(coder_offset);
! assert(CompactStrings || coder == CODER_UTF16, "Must be UTF16 without CompactStrings");
! return coder == CODER_LATIN1;
} else {
! return false;
}
}
static int length(oop java_string) {
assert(initialized, "Must be initialized");
assert(is_instance(java_string), "must be java_string");
typeArrayOop value_array = ((typeArrayOop)java_string->obj_field(value_offset));
if (value_array == NULL) {
return 0;
}
+ int arr_length = value_array->length();
+ if (!is_latin1(java_string)) {
+ assert((arr_length & 1) == 0, "should be even for UTF16 string");
+ arr_length >>= 1; // convert number of bytes to number of elements
}
+ return arr_length;
}
static int utf8_length(oop java_string);
// String converters
static char* as_utf8_string(oop java_string);
*** 185,203 ****
// in the String.hashCode method(), but is precomputed for String
// objects in the shared archive file.
// hash P(31) from Kernighan & Ritchie
//
// For this reason, THIS ALGORITHM MUST MATCH String.hashCode().
! template <typename T> static unsigned int hash_code(T* s, int len) {
unsigned int h = 0;
while (len-- > 0) {
h = 31*h + (unsigned int) *s;
s++;
}
return h;
}
static unsigned int hash_code(oop java_string);
// This is the string hash code used by the StringTable, which may be
// the same as String.hashCode or an alternate hash code.
static unsigned int hash_string(oop java_string);
--- 179,208 ----
// in the String.hashCode method(), but is precomputed for String
// objects in the shared archive file.
// hash P(31) from Kernighan & Ritchie
//
// For this reason, THIS ALGORITHM MUST MATCH String.hashCode().
! static unsigned int hash_code(const jchar* s, int len) {
unsigned int h = 0;
while (len-- > 0) {
h = 31*h + (unsigned int) *s;
s++;
}
return h;
}
+
+ static unsigned int hash_code(const jbyte* s, int len) {
+ unsigned int h = 0;
+ while (len-- > 0) {
+ h = 31*h + (((unsigned int) *s) & 0xFF);
+ s++;
+ }
+ return h;
+ }
+
static unsigned int hash_code(oop java_string);
+ static unsigned int latin1_hash_code(typeArrayOop value, int len);
// This is the string hash code used by the StringTable, which may be
// the same as String.hashCode or an alternate hash code.
static unsigned int hash_string(oop java_string);
*** 449,459 ****
public:
// parent ThreadGroup
static oop parent(oop java_thread_group);
// name
! static typeArrayOop name(oop java_thread_group);
// ("name as oop" accessor is not necessary)
// Number of threads in group
static int nthreads(oop java_thread_group);
// threads
static objArrayOop threads(oop java_thread_group);
--- 454,464 ----
public:
// parent ThreadGroup
static oop parent(oop java_thread_group);
// name
! static const char* name(oop java_thread_group);
// ("name as oop" accessor is not necessary)
// Number of threads in group
static int nthreads(oop java_thread_group);
// threads
static objArrayOop threads(oop java_thread_group);
< prev index next >