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