duke@435: /* coleenp@4037: * Copyright (c) 1999, 2012, Oracle and/or its affiliates. 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: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. duke@435: * duke@435: */ duke@435: stefank@2314: #include "precompiled.hpp" stefank@2314: #include "classfile/javaClasses.hpp" stefank@2314: #include "memory/universe.inline.hpp" stefank@2314: #include "runtime/reflectionUtils.hpp" duke@435: duke@435: KlassStream::KlassStream(instanceKlassHandle klass, bool local_only, bool classes_only) { duke@435: _klass = klass; duke@435: if (classes_only) { coleenp@4037: _interfaces = Universe::the_empty_klass_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) { coleenp@4037: _klass = _interfaces->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 = zgu@3900: new (ResourceObj::C_HEAP, mtInternal) 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(); never@1577: _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. coleenp@4037: offset = sun_reflect_ConstantPool::oop_offset(); never@1577: _filtered_fields->append(new FilteredField(SystemDictionary::reflect_ConstantPool_klass(), offset)); duke@435: offset = sun_reflect_UnsafeStaticFieldAccessorImpl::base_offset(); never@1577: _filtered_fields->append(new FilteredField(SystemDictionary::reflect_UnsafeStaticFieldAccessorImpl_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: }