Mercurial > hg > graal-jvmci-8
comparison src/share/vm/classfile/javaClasses.cpp @ 6057:8f972594effc
6924259: Remove String.count/String.offset
Summary: Allow a version of String class that doesn't have count and offset fields.
Reviewed-by: never, coleenp
author | kvn |
---|---|
date | Mon, 14 May 2012 09:36:00 -0700 |
parents | a81f60ddab06 |
children | 8b0a4867acf0 e9140bf80b4a |
comparison
equal
deleted
inserted
replaced
6054:56d1af561395 | 6057:8f972594effc |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
141 dest_offset = fd.offset(); | 141 dest_offset = fd.offset(); |
142 } | 142 } |
143 } | 143 } |
144 | 144 |
145 | 145 |
146 int java_lang_String::value_offset = 0; | |
147 int java_lang_String::offset_offset = 0; | |
148 int java_lang_String::count_offset = 0; | |
149 int java_lang_String::hash_offset = 0; | |
150 | |
151 bool java_lang_String::initialized = false; | |
152 | |
153 void java_lang_String::compute_offsets() { | |
154 assert(!initialized, "offsets should be initialized only once"); | |
155 | |
156 klassOop k = SystemDictionary::String_klass(); | |
157 compute_offset(value_offset, k, vmSymbols::value_name(), vmSymbols::char_array_signature()); | |
158 compute_optional_offset(offset_offset, k, vmSymbols::offset_name(), vmSymbols::int_signature()); | |
159 compute_optional_offset(count_offset, k, vmSymbols::count_name(), vmSymbols::int_signature()); | |
160 compute_optional_offset(hash_offset, k, vmSymbols::hash_name(), vmSymbols::int_signature()); | |
161 | |
162 initialized = true; | |
163 } | |
164 | |
146 Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) { | 165 Handle java_lang_String::basic_create(int length, bool tenured, TRAPS) { |
166 assert(initialized, "Must be initialized"); | |
147 // Create the String object first, so there's a chance that the String | 167 // Create the String object first, so there's a chance that the String |
148 // and the char array it points to end up in the same cache line. | 168 // and the char array it points to end up in the same cache line. |
149 oop obj; | 169 oop obj; |
150 if (tenured) { | 170 if (tenured) { |
151 obj = instanceKlass::cast(SystemDictionary::String_klass())->allocate_permanent_instance(CHECK_NH); | 171 obj = instanceKlass::cast(SystemDictionary::String_klass())->allocate_permanent_instance(CHECK_NH); |
2835 return (instanceMirrorKlass::offset_of_static_fields() + static_err_offset); | 2855 return (instanceMirrorKlass::offset_of_static_fields() + static_err_offset); |
2836 } | 2856 } |
2837 | 2857 |
2838 | 2858 |
2839 | 2859 |
2840 int java_lang_String::value_offset; | |
2841 int java_lang_String::offset_offset; | |
2842 int java_lang_String::count_offset; | |
2843 int java_lang_String::hash_offset; | |
2844 int java_lang_Class::_klass_offset; | 2860 int java_lang_Class::_klass_offset; |
2845 int java_lang_Class::_array_klass_offset; | 2861 int java_lang_Class::_array_klass_offset; |
2846 int java_lang_Class::_resolved_constructor_offset; | 2862 int java_lang_Class::_resolved_constructor_offset; |
2847 int java_lang_Class::_oop_size_offset; | 2863 int java_lang_Class::_oop_size_offset; |
2848 int java_lang_Class::_static_oop_field_count_offset; | 2864 int java_lang_Class::_static_oop_field_count_offset; |
2998 // are not available to determine the offset_of_static_fields. | 3014 // are not available to determine the offset_of_static_fields. |
2999 void JavaClasses::compute_hard_coded_offsets() { | 3015 void JavaClasses::compute_hard_coded_offsets() { |
3000 const int x = heapOopSize; | 3016 const int x = heapOopSize; |
3001 const int header = instanceOopDesc::base_offset_in_bytes(); | 3017 const int header = instanceOopDesc::base_offset_in_bytes(); |
3002 | 3018 |
3003 // Do the String Class | |
3004 java_lang_String::value_offset = java_lang_String::hc_value_offset * x + header; | |
3005 java_lang_String::offset_offset = java_lang_String::hc_offset_offset * x + header; | |
3006 java_lang_String::count_offset = java_lang_String::offset_offset + sizeof (jint); | |
3007 java_lang_String::hash_offset = java_lang_String::count_offset + sizeof (jint); | |
3008 | |
3009 // Throwable Class | 3019 // Throwable Class |
3010 java_lang_Throwable::backtrace_offset = java_lang_Throwable::hc_backtrace_offset * x + header; | 3020 java_lang_Throwable::backtrace_offset = java_lang_Throwable::hc_backtrace_offset * x + header; |
3011 java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header; | 3021 java_lang_Throwable::detailMessage_offset = java_lang_Throwable::hc_detailMessage_offset * x + header; |
3012 java_lang_Throwable::cause_offset = java_lang_Throwable::hc_cause_offset * x + header; | 3022 java_lang_Throwable::cause_offset = java_lang_Throwable::hc_cause_offset * x + header; |
3013 java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header; | 3023 java_lang_Throwable::stackTrace_offset = java_lang_Throwable::hc_stackTrace_offset * x + header; |
3198 valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig) | 3208 valid &= check_constant(klass_name, cpp_klass_name :: field_name, #field_name, field_sig) |
3199 | 3209 |
3200 // java.lang.String | 3210 // java.lang.String |
3201 | 3211 |
3202 CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C"); | 3212 CHECK_OFFSET("java/lang/String", java_lang_String, value, "[C"); |
3203 CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I"); | 3213 if (java_lang_String::has_offset_field()) { |
3204 CHECK_OFFSET("java/lang/String", java_lang_String, count, "I"); | 3214 CHECK_OFFSET("java/lang/String", java_lang_String, offset, "I"); |
3205 CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); | 3215 CHECK_OFFSET("java/lang/String", java_lang_String, count, "I"); |
3216 } | |
3217 if (java_lang_String::has_hash_field()) { | |
3218 CHECK_OFFSET("java/lang/String", java_lang_String, hash, "I"); | |
3219 } | |
3206 | 3220 |
3207 // java.lang.Class | 3221 // java.lang.Class |
3208 | 3222 |
3209 // Fake fields | 3223 // Fake fields |
3210 // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked | 3224 // CHECK_OFFSET("java/lang/Class", java_lang_Class, klass); // %%% this needs to be checked |