Mercurial > hg > graal-compiler
comparison src/share/vm/prims/jvmtiClassFileReconstituter.cpp @ 3938:e6b1331a51d2
7086585: make Java field injection more flexible
Reviewed-by: jrose, twisti, kvn, coleenp
author | never |
---|---|
date | Sat, 10 Sep 2011 17:29:02 -0700 |
parents | 1d1603768966 |
children | 35c656d0b685 |
comparison
equal
deleted
inserted
replaced
3937:c565834fb592 | 3938:e6b1331a51d2 |
---|---|
23 */ | 23 */ |
24 | 24 |
25 #include "precompiled.hpp" | 25 #include "precompiled.hpp" |
26 #include "classfile/symbolTable.hpp" | 26 #include "classfile/symbolTable.hpp" |
27 #include "interpreter/bytecodeStream.hpp" | 27 #include "interpreter/bytecodeStream.hpp" |
28 #include "oops/fieldStreams.hpp" | |
28 #include "prims/jvmtiClassFileReconstituter.hpp" | 29 #include "prims/jvmtiClassFileReconstituter.hpp" |
29 #include "runtime/signature.hpp" | 30 #include "runtime/signature.hpp" |
30 #ifdef TARGET_ARCH_x86 | 31 #ifdef TARGET_ARCH_x86 |
31 # include "bytes_x86.hpp" | 32 # include "bytes_x86.hpp" |
32 #endif | 33 #endif |
50 // Write the field information portion of ClassFile structure | 51 // Write the field information portion of ClassFile structure |
51 // JVMSpec| u2 fields_count; | 52 // JVMSpec| u2 fields_count; |
52 // JVMSpec| field_info fields[fields_count]; | 53 // JVMSpec| field_info fields[fields_count]; |
53 void JvmtiClassFileReconstituter::write_field_infos() { | 54 void JvmtiClassFileReconstituter::write_field_infos() { |
54 HandleMark hm(thread()); | 55 HandleMark hm(thread()); |
55 typeArrayHandle fields(thread(), ikh()->fields()); | |
56 int fields_length = fields->length(); | |
57 int num_fields = fields_length / instanceKlass::next_offset; | |
58 objArrayHandle fields_anno(thread(), ikh()->fields_annotations()); | 56 objArrayHandle fields_anno(thread(), ikh()->fields_annotations()); |
59 | 57 |
60 write_u2(num_fields); | 58 // Compute the real number of Java fields |
61 for (int index = 0; index < fields_length; index += instanceKlass::next_offset) { | 59 int java_fields = ikh()->java_fields_count(); |
62 AccessFlags access_flags; | 60 |
63 int flags = fields->ushort_at(index + instanceKlass::access_flags_offset); | 61 write_u2(java_fields * FieldInfo::field_slots); |
64 access_flags.set_flags(flags); | 62 for (JavaFieldStream fs(ikh()); !fs.done(); fs.next()) { |
65 int name_index = fields->ushort_at(index + instanceKlass::name_index_offset); | 63 AccessFlags access_flags = fs.access_flags(); |
66 int signature_index = fields->ushort_at(index + instanceKlass::signature_index_offset); | 64 int name_index = fs.name_index(); |
67 int initial_value_index = fields->ushort_at(index + instanceKlass::initval_index_offset); | 65 int signature_index = fs.signature_index(); |
66 int initial_value_index = fs.initval_index(); | |
68 guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field"); | 67 guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field"); |
69 int offset = ikh()->offset_from_fields( index ); | 68 // int offset = ikh()->field_offset( index ); |
70 int generic_signature_index = | 69 int generic_signature_index = fs.generic_signature_index(); |
71 fields->ushort_at(index + instanceKlass::generic_signature_offset); | |
72 typeArrayHandle anno(thread(), fields_anno.not_null() ? | 70 typeArrayHandle anno(thread(), fields_anno.not_null() ? |
73 (typeArrayOop)(fields_anno->obj_at(index / instanceKlass::next_offset)) : | 71 (typeArrayOop)(fields_anno->obj_at(fs.index())) : |
74 (typeArrayOop)NULL); | 72 (typeArrayOop)NULL); |
75 | 73 |
76 // JVMSpec| field_info { | 74 // JVMSpec| field_info { |
77 // JVMSpec| u2 access_flags; | 75 // JVMSpec| u2 access_flags; |
78 // JVMSpec| u2 name_index; | 76 // JVMSpec| u2 name_index; |
79 // JVMSpec| u2 descriptor_index; | 77 // JVMSpec| u2 descriptor_index; |
80 // JVMSpec| u2 attributes_count; | 78 // JVMSpec| u2 attributes_count; |
81 // JVMSpec| attribute_info attributes[attributes_count]; | 79 // JVMSpec| attribute_info attributes[attributes_count]; |
82 // JVMSpec| } | 80 // JVMSpec| } |
83 | 81 |
84 write_u2(flags & JVM_RECOGNIZED_FIELD_MODIFIERS); | 82 write_u2(access_flags.as_int() & JVM_RECOGNIZED_FIELD_MODIFIERS); |
85 write_u2(name_index); | 83 write_u2(name_index); |
86 write_u2(signature_index); | 84 write_u2(signature_index); |
87 int attr_count = 0; | 85 int attr_count = 0; |
88 if (initial_value_index != 0) { | 86 if (initial_value_index != 0) { |
89 ++attr_count; | 87 ++attr_count; |