duke@435: /* duke@435: * Copyright 1999-2006 Sun Microsystems, Inc. All Rights Reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * duke@435: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@435: * CA 95054 USA or visit www.sun.com if you need additional information or duke@435: * have any questions. duke@435: * duke@435: */ duke@435: duke@435: #include "incls/_precompiled.incl" duke@435: #include "incls/_reflectionUtils.cpp.incl" duke@435: duke@435: KlassStream::KlassStream(instanceKlassHandle klass, bool local_only, bool classes_only) { duke@435: _klass = klass; duke@435: if (classes_only) { duke@435: _interfaces = Universe::the_empty_system_obj_array(); duke@435: } else { duke@435: _interfaces = klass->transitive_interfaces(); duke@435: } duke@435: _interface_index = _interfaces->length(); duke@435: _local_only = local_only; duke@435: _classes_only = classes_only; duke@435: } duke@435: duke@435: bool KlassStream::eos() { duke@435: if (index() >= 0) return false; duke@435: if (_local_only) return true; duke@435: if (!_klass->is_interface() && _klass->super() != NULL) { duke@435: // go up superclass chain (not for interfaces) duke@435: _klass = _klass->super(); duke@435: } else { duke@435: if (_interface_index > 0) { duke@435: _klass = klassOop(_interfaces->obj_at(--_interface_index)); duke@435: } else { duke@435: return true; duke@435: } duke@435: } duke@435: _index = length(); duke@435: next(); duke@435: return eos(); duke@435: } duke@435: duke@435: duke@435: GrowableArray *FilteredFieldsMap::_filtered_fields = duke@435: new (ResourceObj::C_HEAP) GrowableArray(3,true); duke@435: duke@435: duke@435: void FilteredFieldsMap::initialize() { duke@435: int offset; duke@435: offset = java_lang_Throwable::get_backtrace_offset(); duke@435: _filtered_fields->append(new FilteredField(SystemDictionary::throwable_klass(), offset)); duke@435: // The latest version of vm may be used with old jdk. duke@435: if (JDK_Version::is_gte_jdk16x_version()) { duke@435: // The following class fields do not exist in duke@435: // previous version of jdk. duke@435: offset = sun_reflect_ConstantPool::cp_oop_offset(); duke@435: _filtered_fields->append(new FilteredField(SystemDictionary::reflect_constant_pool_klass(), offset)); duke@435: offset = sun_reflect_UnsafeStaticFieldAccessorImpl::base_offset(); duke@435: _filtered_fields->append(new FilteredField(SystemDictionary::reflect_unsafe_static_field_accessor_impl_klass(), offset)); duke@435: } duke@435: } duke@435: duke@435: int FilteredFieldStream::field_count() { duke@435: int numflds = 0; duke@435: for (;!eos(); next()) { duke@435: numflds++; duke@435: } duke@435: return numflds; duke@435: }