/* * Copyright (c) 1999, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. *
*/
// ciInstanceKlass // // This class represents a Klass* in the HotSpot virtual machine // whose Klass part is an InstanceKlass. It may or may not // be loaded. class ciInstanceKlass : public ciKlass {
CI_PACKAGE_ACCESS friendclass ciBytecodeStream; friendclass ciEnv; friendclass ciExceptionHandler; friendclass ciMethod; friendclass ciField; friendclass ciReplay;
InstanceKlass::ClassState _init_state; // state of class bool _is_shared; bool _has_finalizer;
SubklassValue _has_subklass; bool _has_nonstatic_fields; bool _has_nonstatic_concrete_methods; bool _is_hidden; bool _is_record; bool _has_trusted_loader;
ciFlags _flags;
// Lazy fields get filled in only upon request.
ciInstanceKlass* _super;
ciInstance* _java_mirror;
ciConstantPoolCache* _field_cache; // cached map index->field
GrowableArray<ciField*>* _nonstatic_fields; int _has_injected_fields; // any non static injected fields? lazily initialized.
// The possible values of the _implementor fall into following three cases: // NULL: no implementor. // A ciInstanceKlass that's not itself: one implementor. // Itself: more than one implementor.
ciInstanceKlass* _implementor;
// Update the init_state for shared klasses void update_if_shared(InstanceKlass::ClassState expected) { if (_is_shared && _init_state != expected) { if (is_loaded()) compute_shared_init_state();
}
}
public: // Has this klass been initialized? bool is_initialized() {
update_if_shared(InstanceKlass::fully_initialized); return _init_state == InstanceKlass::fully_initialized;
} bool is_not_initialized() {
update_if_shared(InstanceKlass::fully_initialized); return _init_state < InstanceKlass::being_initialized;
} // Is this klass being initialized? bool is_being_initialized() {
update_if_shared(InstanceKlass::being_initialized); return _init_state == InstanceKlass::being_initialized;
} // Has this klass been linked? bool is_linked() {
update_if_shared(InstanceKlass::linked); return _init_state >= InstanceKlass::linked;
} // Is this klass in error state? bool is_in_error_state() {
update_if_shared(InstanceKlass::initialization_error); return _init_state == InstanceKlass::initialization_error;
}
// General klass information.
ciFlags flags() {
assert(is_loaded(), "must be loaded"); return _flags;
} bool has_finalizer() {
assert(is_loaded(), "must be loaded"); return _has_finalizer; } bool has_subklass() {
assert(is_loaded(), "must be loaded"); // Ignore cached subklass_false case. // It could be invalidated by concurrent class loading and // can result in type paradoxes during compilation when // a subclass is observed, but has_subklass() returns false. if (_has_subklass == subklass_true) { returntrue;
} if (flags().is_final()) { returnfalse;
} return compute_shared_has_subklass();
}
// total number of nonstatic fields (including inherited): int nof_nonstatic_fields() { if (_nonstatic_fields == NULL) return compute_nonstatic_fields(); else return _nonstatic_fields->length();
}
// Get the instance of java.lang.Class corresponding to // this klass. This instance is used for locking of // synchronized static methods of this klass.
ciInstance* java_mirror();
ciMethod* find_method(ciSymbol* name, ciSymbol* signature); // Note: To find a method from name and type strings, use ciSymbol::make, // but consider adding to vmSymbols.hpp instead.
// Is this klass in the given package? bool is_in_package(constchar* packagename) { return is_in_package(packagename, (int) strlen(packagename));
} bool is_in_package(constchar* packagename, int len);
// What kind of ciObject is this? bool is_instance_klass() const { returntrue; }
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.