jvmtiClassFileReconstituter.cpp revision 1499
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * This code is free software; you can redistribute it and/or modify it
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * under the terms of the GNU General Public License version 2 only, as
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * published by the Free Software Foundation.
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * This code is distributed in the hope that it will be useful, but WITHOUT
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * version 2 for more details (a copy is included in the LICENSE file that
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * accompanied this code).
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * You should have received a copy of the GNU General Public License version
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * 2 along with this work; if not, write to the Free Software Foundation,
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
70087e8ec944864eb9fbe6ac6a317141972726a9Luke Smith * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * or visit www.oracle.com if you need additional information or have any
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff * questions.
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff# include "incls/_precompiled.incl"
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff# include "incls/_jvmtiClassFileReconstituter.cpp.incl"
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff// FIXME: add Deprecated, LVT, LVTT attributes
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff// FIXME: fix Synthetic attribute
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff// FIXME: per Serguei, add error return handling for constantPoolOopDesc::copy_cpool_bytes()
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff// Write the field information portion of ClassFile structure
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff// JVMSpec| u2 fields_count;
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff// JVMSpec| field_info fields[fields_count];
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniffvoid JvmtiClassFileReconstituter::write_field_infos() {
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff typeArrayHandle fields(thread(), ikh()->fields());
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff int num_fields = fields_length / instanceKlass::next_offset;
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff objArrayHandle fields_anno(thread(), ikh()->fields_annotations());
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff for (int index = 0; index < fields_length; index += instanceKlass::next_offset) {
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff int flags = fields->ushort_at(index + instanceKlass::access_flags_offset);
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff int name_index = fields->ushort_at(index + instanceKlass::name_index_offset);
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff int signature_index = fields->ushort_at(index + instanceKlass::signature_index_offset);
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff int initial_value_index = fields->ushort_at(index + instanceKlass::initval_index_offset);
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff guarantee(name_index != 0 && signature_index != 0, "bad constant pool index for field");
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff int offset = ikh()->offset_from_fields( index );
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff fields->ushort_at(index + instanceKlass::generic_signature_offset);
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff typeArrayHandle anno(thread(), fields_anno.not_null() ?
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff (typeArrayOop)(fields_anno->obj_at(index / instanceKlass::next_offset)) :
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff // JVMSpec| field_info {
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff // JVMSpec| u2 access_flags;
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff // JVMSpec| u2 name_index;
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff // JVMSpec| u2 descriptor_index;
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff // JVMSpec| u2 attributes_count;
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff // JVMSpec| attribute_info attributes[attributes_count];
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff // JVMSpec| }
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff write_u2(flags & JVM_RECOGNIZED_FIELD_MODIFIERS);
eeefbdad0b1d6614c497d69b0087c3a6bc5061b3Jeff Conniff // ++attr_count;
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff ++attr_count; // has RuntimeVisibleAnnotations attribute
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff // write_synthetic_attribute();
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff write_signature_attribute(generic_signature_index);
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff write_annotations_attribute("RuntimeVisibleAnnotations", anno);
df71f95acec70ebddf0ab97cc1e0ff2b70048017Jeff Conniff// Write Code attribute
70087e8ec944864eb9fbe6ac6a317141972726a9Luke Smith// JVMSpec| Code_attribute {
int stackmap_len = 0;
int attr_count = 0;
int attr_size = 0;
if (line_num_cnt != 0) {
++attr_count;
if (stackmap_len != 0) {
++attr_count;
int size =
if (line_num_cnt != 0) {
if (stackmap_len != 0) {
int size =
num_entries++;
return num_entries;
int stackmap_len) {
int attr_count = 0;
if (generic_signature_index != 0) {
++attr_count;
if (generic_signature_index != 0) {
int attr_count = 0;
++attr_count;
++attr_count;
++attr_count;
if (inner_classes_length > 0) {
++attr_count;
if (inner_classes_length > 0) {
int index;
int original_index;
ReallocMark();
return ret_ptr;
unsigned int hash_ignored;
unsigned char* bytecodes) {
unsigned char* p = bytecodes;
switch (code) {
if (is_invokedynamic)
p += len;