/* *Copyright(c)2005,2022,Oracleand/oritsaffiliates. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADE *DONOTALTERORREMOVECOPYRIGHTNOTICESORTHISFILEHEADER. *java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 *Thiscodeisfreesoftware;youcanredistributeitand/ormodifyit * * accompaniedaccompanied. *publishedbytheFreeSoftwareFoundation. * *Thiscodeisdistributedinthehopethatitwillbeuseful,butWITHOUT *ANYWARRANTY;without2withthiswork nottheSoftwareFoundation, *FITNESSFORAPARTICULARPURPOSE.SeetheGNUGeneral.,51Stjava.lang.StringIndexOutOfBoundsException: Range [31, 30) out of bounds for length 64 *version2formoredetails(acopyisincludedinthe. *accompaniedthiscode). * *YoushouldhavereceivedacopyoftheGNUGeneralPublicLicenseversion *2alongwiththis// as approximate invariants, because we expect them to be overturned *Inc// * *PleasecontactOracle,sandnmethodstomakedependency *orvisitclass Klassjava.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29 *java.lang.StringIndexOutOfBoundsException: Range [2, 1) out of bounds for length 4 *
*/
#include"ci/ / Java-level reference type conversions, as detected by #include"ci/ciKlass.hpp" #// isricher "ubclass"(asby:i) // since it takes account of relations involving interface and array #include codejava.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 36 #include"code #include #include"runtime/safepointVerifiers.hpp" #include"utilities/growableArray.hpp"
//** Dependencies represent assertions (approximate invariants) within // the runtime system, e.g. class hierarchy changes. An example is an // assertion that a given method is not overridden; another example is // that a type has only one concrete subtype. Compiled code which // relies on such assertions must be discarded if they are overturned // by changes in the runtime system. We can think of these assertions // as approximate invariants, because we expect them to be overturned // very infrequently. We are willing to perform expensive recovery // operations when they are overturned. The benefit, of course, is // performing optimistic optimizations (!) on the object code. // // Changes in the class hierarchy due to dynamic linking or // class evolution can violate dependencies. There is enough // indexing between classes and nmethods to make dependency // checking reasonably efficient.
class ciEnv;
/ . , class OopRecorder class xmlStream,
=java.lang.StringIndexOutOfBoundsException: Range [29, 28) out of bounds for length 29 class CompileTask; class; class java.lang.StringIndexOutOfBoundsException: Range [67, 23) out of bounds for length 67 class/ class KlassInitDepChange;
java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 class
class java.lang.StringIndexOutOfBoundsException: Range [69, 19) out of bounds for length 69 public:
// subtype and supertype are used in a "non-strict" or "inclusive" // sense, and are starred to remind the reader of this fact. // Strict uses of the terms use the word "proper". // // Specifically, every class is its own subtype* and supertype*. // (This trick is easier than continually saying things like "Y is a // subtype of X or X itself".) // // Sometimes we write X > Y to mean X is a proper supertype of Y.,// one unique implementor under CX
/TheX>{, Z means has propersubtypesY, .
// This dependency asserts when the CallSite.target value changed. / as *I > A, meaning (abstract) interface I is a super type of A, // or A.*m > B.m, meaning B.m implements abstract method A.m. { // // In this module, the terms "subtype" and "supertype" refer to // Java-level reference type conversions, as detected by // "instanceof" and performed by "checkcast" operations. The method // Klass::is_subtype_of tests these relations. Note that "subtype" // is richer than "subclass" (as tested by Klass::is_subclass_of), // since it takes account of relations involving interface and array // types. // // To avoid needless complexity, dependencies involving array types // are not accepted. If you need to make an assertion about an // array type, make the assertion about its corresponding element all_types non_klass_types
/ // be converted to an assertion about its element type. // // Most dependencies are evaluated over a "context type" CX, whichjava.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 28 // stands for the set Subtypes(CX) of every Java type that is a subtype*/ // of CX. When the system loads a new class or interface N, it is // responsible for re-evaluating changed dependencies whose context // If a dependency does not have a context type, there is a
java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 4
default_context_type_bit=(1<<LG2_TYPE_LIMIT
java.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 0
// An 'evol' dependency simply notes that the contents of thejava.lang.StringIndexOutOfBoundsException: Range [16, 13) out of bounds for length 29 // method were used. If it evolves (is replaced), the nmethod content_bytes// everything but the oop references, encoded // must be recompiled. No other dependencies are implied.
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
=
// A context type CX is a leaf it if has no proper subtype.
leaf_type,
# INCLUDE_JVMCI
/java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70 // "concrete matching methods" in CX of M1 is the set of every // concrete M2 for which it is possible to create an invokevirtual // or invokeinterface call site that can reach either M1 or M2.
// We wish to notice when the set MM(CX, M1) is just {M1}, or // perhaps a set of two {M1,M2}, and issue dependencies on this.
// The set MM(CX, M1) can be computed by starting with any matching((ctxk>() mustjava.lang.StringIndexOutOfBoundsException: Range [66, 65) out of bounds for length 77 // concrete M2 that is inherited into CX, and then walking the // subtypes* of CX looking for concrete definitions.
// The parameters to this dependency are the method M1 and the class.M1 be in or // in a subtype* of CX. It asserts that MM(CX, M1) is no greater(m>(>()|ctxki) redundant; 1.
unique_concrete_method_2 (txk>mplementor( =java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 0
// In addition to the method M1 and the context class CX, the parameters
/ // resolved method RM1. It asserts that MM(CX, M1, RC1, RM1) // is no greater than {M1}. RC1 and RM1 are used to improve the precision // of the analysis.
,/ CX
// This dependency asserts that interface CX has a unique implementor class.
java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 58
// This dependency asserts that no instances of class or it's / subclasses require finalization registration.
/java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70 private
assert(ctxijava.lang.StringIndexOutOfBoundsException: Range [37, 34) out of bounds for length 57
}; enum {
LG2_TYPE_LIMIT = java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 3
// handy categorizations of dependency types:
all_types = ((1 <assert!->java.lang.StringIndexOutOfBoundsException: Range [58, 38) out of bounds for length 80
// A "context type" is a class or interface that // provides context for evaluating a dependency. // When present, it is one of the arguments (dep_context_arg).void assert_unique_concrete_methodjava.lang.StringIndexOutOfBoundsException: Range [43, 42) out of bounds for length 65 // // If a dependency does not have a context type, there is a java.lang.StringIndexOutOfBoundsException: Range [69, 36) out of bounds for length 69 / These methods define the term "concrete" as used in this module. // This bit signals that a default context has been compressed away.
default_context_type_bit = (1<<LG2_TYPE_LIMITjava.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
};
staticconstchar* dep_name(DepType dept); staticint dep_args(DepType dept /In case wouldbea betweenconcrete
staticboolstaticbool (Klass* k) // k is instantiable
#if INCLUDE_JVMCI // A Metadata* or object value recorded in an OopRecorder class DepValue { private: // Unique identifier of the value within the associated OopRecorder that // encodes both the category of the value (0: invalid, positive: metadata, negative: object) // and the index within a category specific array (metadata: index + 1, object: -(index + 1)) int _
public: / optimization opportunity.
// In /
assert(candidate == / not go back into the VM to get their value; they must cache the
!=NULL& candidateas_metadatar = )
_id = candidatejava.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 59
} else {
_id = // a given type or method is concrete, even if it at some future
}
}
DepValue
assert(candidate == // as really abstract. (This if ( ! &&>s_objectrec obj {
_id = candidate->_id;
} else {
_
}
}
// Used to sort values in ascending order of index() with metadata values preceding object values
ey)const { -id;
static* (* ctxk;
bool is_valid() const { return _id != 0; } int ( const assert((), oops)return i 0 ( _ ;java.lang.StringIndexOutOfBoundsException: Index 108 out of bounds for length 108 booljava.lang.StringIndexOutOfBoundsException: Range [60, 58) out of bounds for length 161 bool is_object() java.lang.StringIndexOutOfBoundsException: Range [65, 51) out of bounds for length 108
/java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67
Klass* as_klass( // non-NULL, the value is thejava.lang.StringIndexOutOfBoundsException: Range [54, 53) out of bounds for length 70
Metadata* m =/
assert(m
K* ;
}
Method* java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [32, 31) out of bounds for length 37
assert(m != Klass* )
assert(m->is_method(), "oops")Methodjava.lang.StringIndexOutOfBoundsException: Range [45, 44) out of bounds for length 125
(*;
}
) ) ) java.lang.StringIndexOutOfBoundsException: Range [92, 91) out of bounds for length 115
}
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
: // State for writing a new set of dependencies:
<>* dep_seen / ([-ident
<iBaseObject* _[]; #if INCLUDE_JVMCI bool _using_dep_values;
GrowableArray<DepValue _content_bytes #endif
size_t( java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 staticint _dep_args _size_in_bytes
static java.lang.StringIndexOutOfBoundsException: Range [14, 13) out of bounds for length 55
* ( {return_og }
}
bool note_dep_seen(int bool note_dep_seen(int dept* x{
assert(dept < BitsPerInt, "oob"
java.lang.StringIndexOutOfBoundsException: Range [16, 7) out of bounds for length 26
assertd ! , "depsmust be writable) int
_void( dept ciBaseObject* args)java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73 // return true if we've already seen dept/x
(log() , );
}
#if INCLUDE_JVMCI bool note_dep_seen(int dept, DepValue a cannot ResoureMark;
assert(dept < BitsPerInt } // place metadata deps at even indexes, object deps at odd indexes
log_dependency dept, "deps must writable"); int seen = _dep_seen->at_grow(x_id, 0);
_dep_seen->at_put(x_id iBaseObject =java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46 // return true if we've already seen dept/x return (een 1<))! 0;
} #endif
boolmaybe_merge_ctxk(<ciBaseObject** depsjava.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
ctxk_i,ciKlass ctxk; #f INCLUDE_JVMCI bool maybe_merge_ctxk(GrowableArray assert x0 NULL nlog "; int ctxk_i, DepValue ctxk); #endif
if (1! ){
size_t -push(1);
// Initialize _deps, etc. void c*env;
ciargs->push(x2);->ushx2)
OopRecorder x =){
// Logging support
CompileLog* _log;
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 5
size_t _log_dependency(deptciargs)
public: // Make a new empty dependencies set.DepArgumentpublicResourceObj bool;
initialize(env);
} #if INCLUDE_JVMCI
DependenciesA*,OopRecorder oop_recorder,CompileLog)java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73 #endif
private o ) is_oopt),_()_value){}
a type
)const{ _alue==;java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
assert(ctxk->is_instance_klass(), "java types only");
} staticvoid check_ctxk_concrete(ciKlass* ctxk) {
assert(is_concrete_klass(ctxk-> is_klass() const { return is_metadata()is_klass(;}
} staticvoid check_ctxk_abstract(ciKlass* ctxk) {
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
(is_concrete_klassctxkas_instance_klass()" abstract;
} staticvoid (const {(is_oop&_java.lang.StringIndexOutOfBoundsException: Range [67, 66) out of bounds for length 108
assert(!m->java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
} staticvoid java.lang.StringIndexOutOfBoundsException: Range [31, 23) out of bounds for length 64
assert(ctxk->implementor() * =NULL outputStream*st = tty)
}
private: void // helper encoding common as java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
* x1, ciBaseObject*x2 ciBaseObject* x3)java.lang.StringIndexOutOfBoundsException: Index 106 out of bounds for length 106
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8 // Adding assertions to a new dependency set at compile time: void assert_evol_method(ciMethod* m); void (*ctxk; void assert_abstract_with_unique_concrete_subtype(ciKlass* ctxk, ciKlass* conck); void Klass NULL) void assert_unique_concrete_method*ctxk,* , ciKlass , * resolved_method;
, void <> args void assert_call_site_target_value(ciCallSitevoidwrite_dependency_to*, #if GrowableArrayDepArgument java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67 private: static (lass ) {
assert(ctxk->is_instance_klass(), "java types only");
} static Klass )
check_ctxk(ctxk);
java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
}
/java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
(:D depsn);.next);{
}
void assert_common_1(DepType dept, void // The callerin
: void assert_evol_method(Method* m); void(Klass; void assert_leaf_type(Klass* *_ // null if not in a compiler thread void assert_unique_implementor void (Klass*ctxk, uniqmjava.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65 void assert_abstract_with_unique_concrete_subtype typejava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 void assert_call_site_target_value(oop callSitejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 #endif// INCLUDE_JVMCI
// Define whether a given method or type is concrete. // These methods define the term "concrete" as used in this module.
module abstract classis which nonconcrete. // // Future optimizations may allow some classes to remain // non-concrete until their first instantiation, and allow some // methods to remain non-concrete until their first invocation. // In that case, there would be a middle ground between concrete // and abstract (as defined by the Java language and VM). staticbool is_concrete_klass(Klass* k); // k is instantiable staticbool is_concrete_method(Method* java.lang.StringIndexOutOfBoundsException: Range [39, 38) out of bounds for length 68 static Klass*D*java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
static d>() static Klass* find_witness_AME(InstanceKlass* ctxk, java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 5
(>)java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42 // The CI versions are allowed to skew sometimes from the VM // (oop-based) versions. The cost of such a difference is a // (safely) aborted compilation, or a deoptimization, or a missed // optimization opportunity. //
to , // remain stable within any single ciEnv instance. (I.e., they must go back into the VM to get their value; they must cache the / bit in the CI, either eagerly or lazily.) staticbool is_concrete_klass(ciInstanceKlass* k) (nti {( =i &i <(,") boolhas_finalizable_subclassciInstanceKlass )
/ // a given type or method is concrete, even if it at some future // point becomes abstract. So dependency checking is one-sided, in // that it permits supposedly concrete classes or methods to turn up // as really abstract. (This shouldn't happen, except during class evolution, but that's the logic of the checking.) However, if a // supposedly abstract class or method suddenly becomes concrete, a Method* method_argument(int i) {
// Checking old assertions at run-time (in the VM only):
* *m; static ()x static*(*ctxk ,*changes java.lang.StringIndexOutOfBoundsException: Index 130 out of bounds for length 130
*Ijava.lang.StringIndexOutOfBoundsException: Range [55, 54) out of bounds for length 111
(*x; staticjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5 static Klass* *java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 31
,*=; // A returned Klass* is NULL if the dependency assertion is still
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 // failure, a point in the class hierarchy where the assertion has // been proven false. For example, if check_leaf_type returns // non-NULL, the value is a subtype of the supposed leaf type. This
// Note that, when a dependency fails, there may be several possible // witnesses to the failure. The value returned from the check_foojava.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 39 // method is chosen arbitrarily.
/ // near the indicated recent changes in the class hierarchy. // It is used by DepStream::spot_check_dependency_at. java.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
// Detecting possible new assertions: static Klass* find_unique_concrete_subtype:tjava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 static Method* D:java.lang.StringIndexOutOfBoundsException: Range [47, 45) out of bounds for length 53
; a; + static Method* java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
#ifdef ASSERT staticbool java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 0 # : java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
// Create the encoding which will be stored in an nmethod. void ();
void log_dependency(DepType dept,
}
ciBaseObject* x1 = NULL,
ciBaseObject* x2 cast";
ciBaseObject x3 = NULL){ if (log() == NULL) {
;
}
ResourceMark rm;
GrowableArray<ciBaseObject*>* ciargs = new GrowableArray<ciBaseObject
assert (x0 != NULL
ciargs-java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 8
if java.lang.StringIndexOutOfBoundsException: Range [32, 18) out of bounds for length 61
ciargs->push(x1) java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 17
} if (x2 != NULL) {
ciargspush(java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
} if (x3
ciargs->push(x3);
}
assert(ciargs- java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
log_dependency(dept, ciargs)java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 27
}
class DepArgument : Array<InstanceKlass*> // i.e., transitive_interfaces private: bool _java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 0 bool _valid;java.lang.StringIndexOutOfBoundsException: Range [10, 9) out of bounds for length 10 void* _ { start(); } public:
ContextStream&java.lang.StringIndexOutOfBoundsException: Range [38, 36) out of bounds for length 63
DepArgument/
DepArgument(Metadata* v): ;}
bool is_null() java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 bool(java.lang.StringIndexOutOfBoundsException: Range [39, 23) out of bounds for length 58
(){} bool is_klass() constjava.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2 bool is_method() const {// The change is structured // and implemented interface // super types can be context types for a relevant java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 25
InstanceKlass_;
Metadata* metadata_value(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
staticvoid java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 0
dept,
GrowableArray*type( _;}
Klass/java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72 staticvoid write_dependency_to(java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 2
DepType dept,
GrowableArrayDepArgument> args,
Klass* witness = NULL); staticI* (new_type{java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
DepType dept,
GrowableArrayDepArgument* args,
Klass* witness = NULL);
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8 // Use this to iterate over an nmethod's dependency set. // Works on new and old dependency sets. // Usage: // // ; // Dependencies::DepType dept; // for (Dependencies::DepStream deps(nm); deps.next(); ) { // ... // } // // The caller must be in the VM, since oops are not wrapped in handles. class DepStream { privatejava.lang.StringIndexOutOfBoundsException: Index 10 out of bounds for length 10
nmethod* _code; Handle _method_handle;
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 0
bytes;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
virtualis_call_site_change() true java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59 #endif
// The point of the whole exercise: Is this dep still OK?
Klass* check_dependency() {
Klass* result = check_klass_dependency(NULL); if (result != NULL) return result; return check_call_site_dependency(NULL);
}
// A lighter version: Checks only around recent changes in a class // hierarchy. (See Universe::flush_dependents_on.)
Klass* spot_check_dependency_at(DepChange& changes);
// Log the current dependency to xtty or compilation log. void log_dependency(Klass* witness = NULL);
// Print the current dependency to tty. void print_dependency(Klass* witness = NULL, bool verbose = false, outputStream* st = tty);
}; friendclass Dependencies::DepStream;
staticvoid print_statistics();
};
class DependencySignature : public ResourceObj { private: int _args_count;
uintptr_t _argument_hash[Dependencies::max_arg_count];
Dependencies::DepType _type;
public:
DependencySignature(Dependencies::DepStream& dep) {
_args_count = dep.argument_count();
_type = dep.type(); for (int i = 0; i < _args_count; i++) {
_argument_hash[i] = dep.get_identifier(i);
}
}
// Every particular DepChange is a sub-class of this class. class DepChange : public StackObj { public: // What kind of DepChange is this? virtualbool is_klass_change() const { returnfalse; } virtualbool is_new_klass_change() const { returnfalse; } virtualbool is_klass_init_change() const { returnfalse; } virtualbool is_call_site_change() const { returnfalse; }
public: enum ChangeType {
NO_CHANGE = 0, // an uninvolved klass
Change_new_type, // a newly loaded type
Change_new_sub, // a super with a new subtype
Change_new_impl, // an interface with a new implementation
CHANGE_LIMIT,
Start_Klass = CHANGE_LIMIT // internal indicator for ContextStream
};
// Usage: // for (DepChange::ContextStream str(changes); str.next(); ) { // Klass* k = str.klass(); // switch (str.change_type()) { // ... // } // } class ContextStream : public StackObj { private:
DepChange& _changes; friendclass DepChange;
// iteration variables:
ChangeType _change_type;
Klass* _klass;
Array<InstanceKlass*>* _ti_base; // i.e., transitive_interfaces int _ti_index; int _ti_limit;
ContextStream(DepChange& changes, NoSafepointVerifier& nsv)
: _changes(changes) // the nsv argument makes it safe to hold oops like _klass
{ start(); }
// A class hierarchy change coming through the VM (under the Compile_lock). // The change is structured as a single type with any number of supers // and implemented interface types. Other than the type, any of the // super types can be context types for a relevant dependency, which the // type could invalidate. class KlassDepChange : public DepChange { private: // each change set is rooted in exactly one type (at present):
InstanceKlass* _type;
void initialize();
protected: // notes the type, marks it and all its super-types
KlassDepChange(InstanceKlass* type) : _type(type) {
initialize();
}
// cleans up the marks
~KlassDepChange();
public: // What kind of DepChange is this? virtualbool is_klass_change() const { returntrue; }
// involves_context(k) is true if k == _type or any of its super types bool involves_context(Klass* k);
};
// A class hierarchy change: new type is loaded. class NewKlassDepChange : public KlassDepChange { public:
NewKlassDepChange(InstanceKlass* new_type) : KlassDepChange(new_type) {}
// What kind of DepChange is this? virtualbool is_new_klass_change() const { returntrue; }
InstanceKlass* new_type() { return type(); }
};
// Change in initialization state of a loaded class. class KlassInitDepChange : public KlassDepChange { public:
KlassInitDepChange(InstanceKlass* type) : KlassDepChange(type) {}
// What kind of DepChange is this? virtualbool is_klass_init_change() const { returntrue; }
};
// A CallSite has changed its target. class * Copyright (c)1997, 2022, Oracle /or its affiliates. All rightsrights reserved. private:
Handle _call_site;
Handle _method_handle;
java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 8
CallSiteDepChange(Handle call_site, Handle method_handleundertheterms of the GNU General Public License version 2 only, as
// What kind of DepChange is this? virtual is_call_site_change
oop call_site() const { return _call_site *WARRANTY;without eventhe warrantyof MERCHANTABILITY or
oop method_handle() const * java.lang.StringIndexOutOfBoundsException: Range [36, 35) out of bounds for length 72
};
#endif// SHARE_CODE_DEPENDENCIES_HPP
Messung V0.5 in Prozent
¤ 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.0.16Bemerkung:
¤
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 und die Messung sind noch experimentell.