src/share/vm/prims/jvm.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/prims/jvm.cpp	Fri Sep  9 11:55:12 2011
--- new/src/share/vm/prims/jvm.cpp	Fri Sep  9 11:55:12 2011

*** 30,39 **** --- 30,40 ---- #include "classfile/systemDictionary.hpp" #include "classfile/vmSymbols.hpp" #include "gc_interface/collectedHeap.inline.hpp" #include "memory/oopFactory.hpp" #include "memory/universe.inline.hpp" + #include "oops/fieldStreams.hpp" #include "oops/instanceKlass.hpp" #include "oops/objArrayKlass.hpp" #include "prims/jvm.h" #include "prims/jvm_misc.hpp" #include "prims/jvmtiExport.hpp"
*** 1491,1501 **** --- 1492,1502 ---- int slot = java_lang_reflect_Field::slot(reflected); int modifiers = java_lang_reflect_Field::modifiers(reflected); fieldDescriptor fd; KlassHandle kh(THREAD, k); ! intptr_t offset = instanceKlass::cast(kh())->offset_from_fields(slot); ! intptr_t offset = instanceKlass::cast(kh())->field_offset(slot); if (modifiers & JVM_ACC_STATIC) { // for static fields we only look in the current class if (!instanceKlass::cast(kh())->find_local_field_from_offset(offset, true, &fd)) {
*** 1591,1617 **** --- 1592,1614 ---- constantPoolHandle cp(THREAD, k->constants()); // Ensure class is linked k->link_class(CHECK_NULL); typeArrayHandle fields(THREAD, k->fields()); int fields_len = fields->length(); // 4496456 We need to filter out java.lang.Throwable.backtrace bool skip_backtrace = false; // Allocate result int num_fields; if (publicOnly) { num_fields = 0; ! for (int i = 0, j = 0; i < fields_len; i += instanceKlass::next_offset, j++) { ! int mods = fields->ushort_at(i + instanceKlass::access_flags_offset) & JVM_RECOGNIZED_FIELD_MODIFIERS; if (mods & JVM_ACC_PUBLIC) ++num_fields; ! for (JavaFieldStream fs(k()); !fs.done(); fs.next()) { ! if (fs.access_flags().is_public()) ++num_fields; } } else { ! num_fields = fields_len / instanceKlass::next_offset; ! num_fields = k->java_fields_count(); if (k() == SystemDictionary::Throwable_klass()) { num_fields--; skip_backtrace = true; }
*** 1620,1639 **** --- 1617,1635 ---- objArrayOop r = oopFactory::new_objArray(SystemDictionary::reflect_Field_klass(), num_fields, CHECK_NULL); objArrayHandle result (THREAD, r); int out_idx = 0; fieldDescriptor fd; ! for (int i = 0; i < fields_len; i += instanceKlass::next_offset) { ! for (JavaFieldStream fs(k); !fs.done(); fs.next()) { if (skip_backtrace) { // 4496456 skip java.lang.Throwable.backtrace ! int offset = k->offset_from_fields(i); ! int offset = fs.offset(); if (offset == java_lang_Throwable::get_backtrace_offset()) continue; } ! int mods = fields->ushort_at(i + instanceKlass::access_flags_offset) & JVM_RECOGNIZED_FIELD_MODIFIERS; if (!publicOnly || (mods & JVM_ACC_PUBLIC)) { fd.initialize(k(), i); ! if (!publicOnly || fs.access_flags().is_public()) { + fd.initialize(k(), fs.index()); oop field = Reflection::new_field(&fd, UseNewReflection, CHECK_NULL); result->obj_at_put(out_idx, field); ++out_idx; } }
*** 2117,2127 **** --- 2113,2123 ---- JVMWrapper("JVM_GetClassFieldsCount"); klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); if (!Klass::cast(k)->oop_is_instance()) return 0; ! return instanceKlass::cast(k)->fields()->length() / instanceKlass::next_offset; ! return instanceKlass::cast(k)->java_fields_count(); JVM_END JVM_QUICK_ENTRY(jint, JVM_GetClassMethodsCount(JNIEnv *env, jclass cls)) JVMWrapper("JVM_GetClassMethodsCount");
*** 2213,2224 **** --- 2209,2219 ---- JVM_QUICK_ENTRY(jint, JVM_GetFieldIxModifiers(JNIEnv *env, jclass cls, int field_index)) JVMWrapper("JVM_GetFieldIxModifiers"); klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); ! typeArrayOop fields = instanceKlass::cast(k)->fields(); return fields->ushort_at(field_index * instanceKlass::next_offset + instanceKlass::access_flags_offset) & JVM_RECOGNIZED_FIELD_MODIFIERS; ! return instanceKlass::cast(k)->field_access_flags(field_index) & JVM_RECOGNIZED_FIELD_MODIFIERS; JVM_END JVM_QUICK_ENTRY(jint, JVM_GetMethodIxLocalsCount(JNIEnv *env, jclass cls, int method_index)) JVMWrapper("JVM_GetMethodIxLocalsCount");
*** 2397,2407 **** --- 2392,2402 ---- ShouldNotReachHere(); return NULL; JVM_END ! JVM_QUICK_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)) ! JVM_ENTRY(jint, JVM_GetCPFieldModifiers(JNIEnv *env, jclass cls, int cp_index, jclass called_cls)) JVMWrapper("JVM_GetCPFieldModifiers"); klassOop k = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(cls)); klassOop k_called = java_lang_Class::as_klassOop(JNIHandles::resolve_non_null(called_cls)); k = JvmtiThreadState::class_to_verify_considering_redefinition(k, thread); k_called = JvmtiThreadState::class_to_verify_considering_redefinition(k_called, thread);
*** 2409,2424 **** --- 2404,2416 ---- constantPoolOop cp_called = instanceKlass::cast(k_called)->constants(); switch (cp->tag_at(cp_index).value()) { case JVM_CONSTANT_Fieldref: { Symbol* name = cp->uncached_name_ref_at(cp_index); Symbol* signature = cp->uncached_signature_ref_at(cp_index); typeArrayOop fields = instanceKlass::cast(k_called)->fields(); int fields_count = fields->length(); for (int i = 0; i < fields_count; i += instanceKlass::next_offset) { if (cp_called->symbol_at(fields->ushort_at(i + instanceKlass::name_index_offset)) == name && cp_called->symbol_at(fields->ushort_at(i + instanceKlass::signature_index_offset)) == signature) { return fields->ushort_at(i + instanceKlass::access_flags_offset) & JVM_RECOGNIZED_FIELD_MODIFIERS; + for (JavaFieldStream fs(k); !fs.done(); fs.next()) { + if (fs.name() == name && fs.signature() == signature) { + return fs.access_flags().as_short() & JVM_RECOGNIZED_FIELD_MODIFIERS; } } return -1; } default:

src/share/vm/prims/jvm.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File