klass.cpp revision 113
0N/A * Copyright 1997-2007 Sun Microsystems, Inc. All Rights Reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 0N/A * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, 0N/A * CA 95054 USA or visit www.sun.com if you need additional information or 0N/A * have any questions. 0N/A#
include "incls/_precompiled.incl" 0N/A // Run up the super chain and check 0N/A if (t == k)
return true;
0N/A if (t == k)
return true;
0N/A // Put some extra logic here out-of-line, before the search proper. 0N/A // This cuts down the size of the inline method. 0N/A // This is necessary, since I am never in my own secondary_super list. 0N/A // Scan the array-of-objects for a match 0N/A for (
int i = 0; i <
cnt; i++) {
0N/A// Return self, except for abstract classes with exactly 1 0N/A// implementor. Then return the 1 concrete implementation. 0N/A return this;
// Return 'this' as a no-progress flag 0N/A r = s;
// Loop till find concrete class 0N/A return r;
// Return the 1 concrete class 0N/A// Find LCA in class heirarchy 0N/A " Likely error: reflection method does not correctly" 0N/A " wrap return value in a mirror object.");
0N/A // allocate and initialize vtable 0N/A {
// Preinitialize supertype information. 0N/A // A later call to initialize_supers() may update these settings: 0N/A // The vtable pointer is installed during the execution of 0N/A // constructors in the call to permanent_obj_allocate(). Delay 0N/A // the installation of the klass pointer into the new klass "k" 0N/A // until after the vtable pointer has been installed (i.e., until 0N/A // after the return of permanent_obj_allocate(). 0N/A // Note that T_ARRAY is not allowed here. 0N/A // None of the other machinery matters. 0N/A "initialize this only once to a non-trivial value");
0N/A // Overflow of the primary_supers array forces me to be secondary. 0N/A // Now compute the list of secondary supertypes. 0N/A // Secondaries can occasionally be on the super chain, 0N/A // if the inline "_primary_supers" array overflows. 0N/A // Compute the "real" non-extra secondaries. 0N/A // Store the extra secondaries in the first array positions: 0N/A int i;
// Scan for overflow primaries being duplicates of 2nd'arys 0N/A // This happens frequently for very deeply nested arrays: the 0N/A // primary superclass chain overflows into the secondary. The 0N/A // secondary list contains the element_klass's secondaries with 0N/A // an extra array dimension added. If the element_klass's 0N/A // secondary list already contains some primary overflows, they 0N/A // (with the extra level of array-ness) will collide with the 0N/A // normal primary superclass overflows. 0N/A continue;
// It's a dup, don't put it in 0N/A // See if we had some dup's, so the array has holes in it. 0N/A // Pack the array. Drop the old secondaries array on the floor 0N/A // and let GC reclaim it. 0N/A // We must not copy any NULL placeholders left over from bootstrap. 0N/A // add ourselves to superklass' subklass list 0N/A "an interface can only be a subklass of Object");
0N/A // set our sibling to be the superklass' previous first subklass 0N/A // make ourselves the superklass' first subklass 0N/A // remove receiver from sibling list 0N/A // We update the subklass link and the subklass' sibling links here. 0N/A // Our own sibling link will be updated by our superclass (which must be alive 0N/A // first subklass not alive, find first one alive 0N/A // now update the subklass' sibling list 0N/A // first sibling not alive, find first one alive 0N/A // Always follow subklass and sibling link. This will prevent any klasses from 0N/A // being unloaded (all classes are transitively linked from java.lang.Object). 0N/A // No exception can be thrown by array_klass_impl when called with or_null == true. 0N/A // (In anycase, the execption mark will fail if it do so) 0N/A // No exception can be thrown by array_klass_impl when called with or_null == true. 0N/A // (In anycase, the execption mark will fail if it do so) 0N/A fatal(
"array_klass should be dispatched to instanceKlass, objArrayKlass or typeArrayKlass");
0N/A fatal(
"array_klass should be dispatched to instanceKlass, objArrayKlass or typeArrayKlass");
0N/A// Unless overridden, modifier_flags is 0. 0N/A// Unless overridden, jvmti_class_status has no flags set. 0N/A /* $$$ I think this functionality should be handled by verification of 0N/A RememberedSet::verify_old_oop(obj, p, allow_dirty, false);