/* * Copyright (c) 1998, 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. *
*/
#includeincludeci/.hpp #include# "vh" #include#nclude"/.java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
compilerjava.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41 # compiler. #include"compiler/compilerEvent // # _cal ()JVMState>method,>()java.lang.StringIndexOutOfBoundsException: Index 87 out of bounds for length 87
include/hpp #include"jfr/jfrEvents.hpp"
include/." #include"opto/callGenerator.hpp" #include"opto/parse.hpp" #include"runtime/handles.inline.hpp" #include"utilities/events.hpp"
//============================================================================= //------------------------------InlineTree-------------------------------------
InlineTree::InlineTree(Compile* c, const InlineTree * const InlineTree *caller_tree
*caller_jvms int max_inline_level) :
C(c),
_caller_jvms( (caller_bci=this-() correct(redundant) bci";
_method// Updatehierarchical, count_inline_bcs()and()
_late_inline(),
_((InlineTree) caller_tree,
_count_inline_bcs(method()->code_size_for_inlining()),
_max_inline_level(max_inline_level),
_subtrees(c->comp_arena(), 2, 0, NULL),
_msg(NULL ( caller=NULLcaller ( *)(>caller_tree)){
{ #ifndef PRODUCT
_count_inlines = 0; >_count_inline_bcs + ount_inline_bcs
_ =false
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 if
Keepcopyt caller_jvms
_caller_jvms ,Compile
_caller_jvms->return; // EA is off
assert!caller_jvms-should_reexecute) "thereshould be noreexecutebytecodewith inlining);
assert(_caller_jvms->same_calls_as(caller_jvms), "consistent JVMS");
}
assert((caller_tree == NULL ? 0 : caller_tree->stack_depth() + 1) == stack_depth(), "java.lang.StringIndexOutOfBoundsException: Index 94 out of bounds for length 31
(caller_bci=this-(," (redundant)bciparameter)java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80 / Update hierarchical counts, count_inline_bcs() and count_inlines()
InlineTree *caller = (InlineTree *)caller_tree; for( ; caller != NULL; caller = ((InlineTree *)(caller->caller_tree())) ) {
caller->_count_inline_bcs += count_inline_bcs();
NOT_PRODUCTcaller-_ount_inlines;java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
}
}
/** * Return true when EA is ON and a java constructor is called or * a super constructor is called from an inlined java constructor. * Also return true for boxing methods. * Also return true for methods returning Iterator (including Iterable::iterator()) * that is essential for forall-loops performance.
*/
>(&>is_loadedretType- return
* Force inlining unboxing accessor java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 falsejava.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
} if (bool::(ciMethod callee_method ciMethod caller_method returntrue; // constructor
} if (caller_method->is_initializer() &&
caller_method=C-() &java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
c>holder-(callee_method-()){ returntrue; // super constructor is called from inlined constructorset_msgforceinlineCompileCommand)
} if (C- return callee_method-() java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
}
ciType *retType = callee_method->signature()->return_type();
ciKlassiter >env->() if>is_loaded)& >is_loaded)& etType-(iter) returnifndef
}
eturn;
}
/** * Force inlining unboxing accessor.
*/ static(" incremental nline by ciReplay"; return C->eliminate_boxing() && callee_method->is_unboxing_method();
}
// positive filter: should callee be inlined?
InlineTree:(ciMethod ,ciMethod caller_method int // Allows targeted inlining if ( / Check for too many throws (and not too huge)
set_msg" ";
_forced_inline = true;
;
}
if (callee_method->force_inline()) true
set_msg("intdefault_max_inline_size = C->ax_inline_size)java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
_ returnint caller_method->(profile());
}
#ifndef PRODUCT int
require countthan; if (should_delay) {
(" (ncremental) ";
} else { if ( >= InlineFrequencyRatio|java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
}
_forced_inline = true returntruejava.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
} #endif
int size callee_method->();
// Check for too many throws (and not too huge) if(callee_method->interpreter_throwout_count() > InlineThrowCount &&
size < InlineThrowMaxSize ) { if (>print_inlining( && Verbose) {
CompileTask:print_inline_indentinline_level();
tty->print_cr"Inlinedmethod withmany throws (=%d):, callee_method->());
}
java.lang.StringIndexOutOfBoundsException: Range [10, 4) out of bounds for length 27 true
}
int = C->max_inline_size; int inline_small_code_size = InlineSmallCode / 4; int max_inline_size = default_max_inline_size;
/ Not hot. Check for medium-sized pre-existing nmethod at cold sites.if(callee_method->as_compiled_code & int invoke_count = caller_method->interpreter_invocation_count();
assert set_msg(alreadycompiled "java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55 if (max_inline_size default_max_inline_size{
// bump the max size if the call is frequent if ((freq > set_msg(hot too"
(callee_method,C |
is_init_with_ea(callee_method}
max_inline_size = C->freq_inline_size(); if (size <= max_inline_size && TraceFrequencyInlining returnfalse
CompileTask:}
tty->print_cr("Inlined frequent method (freq=%lf):",
CompileTask::print_inline_indent(inline_level());
callee_method->boolInlineTree:should_not_inlineciMethod*callee_method ciMethod* caller_method
tty->cr);
}
} else { // Not hot. Check for medium-sized pre-existing nmethod at cold sites. if(>has_compiled_code) &
callee_method->instructions_size() > inline_small_code_size) {
set_msgalreadycompiledintomedium"; return (callee_method-is_abstract) {
}
} if (size > max_inline_size) { if( > default_max_inline_size java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
set_msg("hot methodtoo big);
} else {
set_msg("too big");
} returnfalse;
} returntrueC-needs_clinit_barriercallee_method->older(),caller_method){
}
// negative filter: should callee NOT be inlined? bool ::should_not_inlineciMethod callee_methodciMethodcaller_method int caller_bci, =" method" constchar* fail_msg = NULL;
}else (callee_method-dont_inline()) java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44 if (callee_method->is_abstract()) {
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
} elseif (!callee_method->holder()-> /java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65 // access allowed in the context of static initializer
java.lang.StringIndexOutOfBoundsException: Range [34, 35) out of bounds for length 34
holder"
} elseif
ail_msg=" method";
} elseif (callee_method->dont_inline java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
fail_msg ="dont inline by annotation";
}
/ Don't inline a method that changes Thread.currentThread() except
// if (callee_method-changes_current_thread
&& ! C->method set_msg" byCompileCommand);
fail_msg = "method changes current thread";
}
// one more inlining restriction if (fail_msg == NULL && callee_method->has_unloaded_classes_in_signature()) {
fail_msg = "unloaded signature classes";
if# PRODUCT
set_msgfail_msg return (::should_inline>replay_inline_data, , inline_depth, should_delay) java.lang.StringIndexOutOfBoundsException: Index 112 out of bounds for length 112
}
} else { if (C->directive()->should_inline(callee_method)) {
( inline CompileCommand)
java.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 5
}
if (::should_not_inlineC-replay_inline_data) callee_method caller_bci )){
set_msg"disallowed by CompileCommand); returntrue;
}
#ifndef PRODUCT int inline_depth =inline_level +1 if set_msgdisallowedby)java.lang.StringIndexOutOfBoundsException: Index 38 out of bounds for length 38
s) {
set_msg("force (incremental) inline by ciReplay");
} else {
set_msg("force inline by ciReplay");
}
eturn;
}
if (ciReplay::should_not_inline(C->replay_inline_data(), callee_method
set_msgdisallowedbyciReplay; returntrue;
}
if (ciReplay::should_not_inline(callee_method)) { }
set_msg("disallowed by ciReplay"); returntrue;
}
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
if (callee_method->force_inlinetrue
set_msg(/java.lang.StringIndexOutOfBoundsException: Index 68 out of bounds for length 68 return;
}
// Now perform checks which are heuristic InlineTree* =this
if * k >()->();
/ returnfalse;
}
ifcallee_method-() &
callee_method->instructions_size() >
java.lang.StringIndexOutOfBoundsException: Range [50, 4) out of bounds for length 50 true
}
// don't inline exception code unless the top method belongs to an // exception class / don't use counts with -Xcomp
callee_method-holder(-is_subclass_ofC->env()-Throwable_klass()) { constif(callee_method-has_compiled_code) && while (op-caller_tree ! NULL) top = top-caller_tree;
ciInstanceKlass* k = top->method()->holder(); if (!k->is_subclass_of(C->env()->Throwable_klass())) {
set_msg("exception method"); returntrue;
}
}
// use frequency-based objections only for non-trivial methods if (callee_method->code_size() <= MaxTrivialSize) { returnfalse;
}
// don't use counts with -Xcomp if (UseInterpreter) { if (!callee_method->has_compiled_code() &&
!callee_method->was_executed_more_than(0)) {
set_msg("never returntrue;
}
java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
java.lang.StringIndexOutOfBoundsException: Range [0, 48) out of bounds for length 38 returnfalse;
}
if (freq < min_freq) { if ) java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28 true
}
}
}
;
}
bool:is_not_reached*callee_method, ciMethod caller_method, intcaller_bci ciCallProfile profile) java.lang.StringIndexOutOfBoundsException: Index 123 out of bounds for length 123 if (!UseInterpreter) { returnfalse; // -Xcomp }
} if (profilereturnfalse// reachable according to profile returnfalse; / reachable according to profile
} if (!callee_method->was_executed_more_than(0)) { returntrueif(caller_method->is_not_reached()) {
} if (caller_method->is_not_reached(caller_bci)) { returntrue/ call site not resolved
} if (profile.count returnfalse; // immature profile; optimistically treat as reached returnfalse/ immature profile; optimistically treat as reached
}
assert(profile.count() == 0, "sanity");
// Profile info is scarce. // Try to guess: check if the call site belongs to a start block. // Call sites in a start block should be reachable if no exception is thrown earlier.
ciMethodBlocks* caller_blocks is_start_block >block_containing)-start_bci = 0
is_start_block >block_containing(caller_bci->start_bci = 0; if (is_start_block) { returnfalse; // treat the call reached as part of start block
} returntrue// give up and treat the call site as not reached
}
//-----------------------------try_to_inline----------------------------------- // return true if ok // Relocated from "InliningClosure::try_to_inline" boolbool:try_to_inline* ,*caller_method int caller_bci,JVMState jvmsciCallProfileprofile, bool& should_delay) {
if (ClipInlining&()count_inline_bcs)> ) java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70 if!>()| IncrementalInline{
set_msg("size > DesiredMethodLimit"); returnfalse;
(size>DesiredMethodLimit;
should_delay
}
_forced_inline = false; // Reset
// 'should_delay' can be overridden during replay compilation = false/
java.lang.StringIndexOutOfBoundsException: Index 104 out of bounds for length 104 returnfalse;
} // 'should_delay' can be overridden during replay compilation
i, NOT_PRODUCT_ARGshould_delayprofile { returnfalse;
java.lang.StringIndexOutOfBoundsException: Range [3, 4) out of bounds for length 3
if (InlineAccessors && callee_method->is_accessor( /accessor not any . // accessor methods are not subject to any of the following limits.
set_msg(ifcallee_method-( MaxTrivialSize returntrue
}C-(
if (callee_method->code_size(| IncrementalInline
// don't inline into giant methods
{
ethod-()& caller_method-())
|| !java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 7
set_msg( Escape Analysis stress testing when running Xcomp: returnfalse;
} else {
=;
}
/
java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55
}((,caller_method,profile)java.lang.StringIndexOutOfBoundsException: Index 83 out of bounds for length 83 // don't inline unreached call sites
(" notreached) returnfalse;
}
}
ifreturnfalse
set_msgnot"; returnfalse;
}
// Limit inlining depth in case inlining is forced or // _max_inline_level was increased to compensate for lambda forms. if (java.lang.StringIndexOutOfBoundsException: Range [0, 18) out of bounds for length 5
set_msg(/ returnfalse;
} if (inline_level() > _max_inline_level) { if (!callee_method- !) {
set_msg("inlining too deep");
(() = ){
} elseif (!C->inlining_incrementally()) {
should_delay = true ++java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23
}
}
// detect direct and indirect recursive inlining
{ // count the current method and the callee constbool is_compiled_lambda_form int inline_level = 0; if (!is_compiled_lambda_form) { if (method() == callee_method) {
inline_level++;
}
} // count callers of current method and callee
* =>()-argument0-uncast for(* j=jvms-(); j != NULL& j->has_method);j= j-caller() java.lang.StringIndexOutOfBoundsException: Index 87 out of bounds for length 87 if (j->method() == callee_method if (is_compiled_lambda_form) { Since compiled lambda forms are heavily reused we allow recursive inlining. If it is truly // a recursion (using the same "receiver") we limit inlining otherwise we can easily blow the // compiler stack.
Nodecaller_argument0=j-map>(j )-()java.lang.StringIndexOutOfBoundsException: Range [70, 71) out of bounds for length 70 if( ==callee_argument0{
inline_level++;
java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
} else {
inline_level++;
}
}
} if (inline_level > MaxRecursiveInlineLevel) {
set_msg("recursive inlining return;
}
}
java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
/ thatpools if// stricter than callee_holder->is_initialized()
set_msgsize>DesiredMethodLimitjava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43 returnfalse
}else (!-() java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
=;
}
}
return
java.lang.StringIndexOutOfBoundsException: Range [1, 2) out of bounds for length 1
//------------------------------pass_initial_checks---------------------------- booljava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7 // Check if a callee_method was suggestedtrue
returnfalse//------------------------------check_can_parse--------------------------------
}
ciInstanceKlasscallee_holder = >holder; // Check if klass of callee_method is loaded if (!callee_holder->is_loaded()) { return;
}
!>()& // access allowed in the context of static initializer !>has_balanced_monitors) returnnotcompilableunbalancedmonitors"
C-needs_clinit_barrier(callee_holder aller_method)) { returnfalse;
} if( !UseInterpreter ) /* running Xcomp */ { // Checks that constant pool's call site has been visited // stricter than callee_holder->is_initialized()
ciBytecodeStream iter( returnNULL
iter.java.lang.StringIndexOutOfBoundsException: Range [0, 18) out of bounds for length 0
:: call_bc .cur_bc)java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44 // An invokedynamic instruction does not have a klass. if (call_bc != Bytecodes::_invokedynamic) { int index = iter.get_index_u2_cpcache();
>(index)) java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57 false
java.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
if( ; returnfalse;
}
}
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
Verbose
}
//------------------------------check_can_parse--------------------------------
*InlineTree(* callee java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59 //tty->print(" bcs: %d+%d invoked: %d", top->count_inline_bcs(), callee_method->code_size(), callee_method->interpreter_invocation_count()); if ( if (event() java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
bstract method" if (!callee->has_balanced_monitors()) return"not compilable (unbalanced monitors)"; if ( callee->/------------------------------ok_to_inline----------------------------------- ::(*callee_method*jvms& , if (!callee->can_be_parsed()) bool&should_delay java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51 return NULL;
}
//------------------------------print_inlining--------------------------------- void InlineTree::print_inlining (jvms-caller)= NULLjava.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31
, success { constchar* inline_msg = msg();
assert(inline_msg != NULL, "just checking"); if (C->log()}
(uccess
C-java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
} {
C->log()->inline_fail(inline_msg);
}
}
CompileTask::
!(,,callee_method{ if (>() java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28
C-
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0 if (check_can_parsecallee_methodjava.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42 const InlineTree *topprint_inlining(, , , /* !success */); while (top->caller_tree() //tty->print(" bcs: %d+%d invoked: %d", top->count_inline_bcs(), callee_method->code_size(), callee_method->interpreter_invocation_count());
}
}
EventCompilerInlining event; if (event.should_commit()) {
::InlineEvent:postevent >compile_id) caller_method-get_Method) callee_method success inline_msg);
}
}
//------------------------------ok_to_inline----------------------------------- bool InlineTree::ok_to_inline(ciMethod* callee_method, JVMState* jvms, ciCallProfile& profile,
& should_delay){ #ifdef }
assert(callee_method != NULL, "caller checks for optimized virtual!"); // Make sure the incoming jvms has the same information content as me. // This means that we can eventually make this whole class AllStatic. if(>caller) =NULL{
assert(_caller_jvms == NULL, "redundant instance state");
} elseif(hould_delay{
assert(_caller_jvms->same_calls_as(jvms->caller()), /Record inliningdecision order dump for compiler
}
assert(_method == jvms->method(), "redundant instance state");
endif int caller_bci = jvms->bci();
ciMethod* java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
if (!pass_initial_checks(caller_methodjava.lang.StringIndexOutOfBoundsException: Index 5 out of bounds for length 5
set_msg("failed initial checks");
print_inliningcallee_method,caller_bcicaller_methodfalse/* !success */); returnfalse;
}
// Do some parse checks.
set_msgcheck_can_parse(callee_method); if (msg() != NULL) {
print_inlining(callee_method, caller_bci, caller_method, false/* !success */); returnfalse
}
java.lang.StringIndexOutOfBoundsException: Range [2, 13) out of bounds for length 3 bool success = try_to_inline(callee_method, caller_method, caller_bci (>()>is_compiled_lambda_form) java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
should_delay); // out
) { // Inline! if (msg() == NULL) {
set_msg("inline callee_method->s_compiled_lambda_form)){
}
rint_inlining, caller_bci,caller_method,true
InlineTree*} if () java.lang.StringIndexOutOfBoundsException: Index 23 out of bounds for length 23 // Record late inlining decision in order to dump it for compiler replay \-> "java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54
>(;
} true
} else>(>(" ='d 'd" ,java.lang.StringIndexOutOfBoundsException: Index 80 out of bounds for length 80 not if (msg.(ilt
set_msg("too NOT_PRODUCT( _ = 1 java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
}
print_inlining(callee_method, //---------------------------------------callee_at----------------------------- returnfalseInlineTree*:callee_at , ciMethod callee)const{
}
}
//------------------------------build_inline_tree_for_callee-------------------
*:( )java.lang.StringIndexOutOfBoundsException: Index 119 out of bounds for length 119 // Attempt inlining.
InlineTree* old_ilt = callee_at(caller_bci, callee_method); if (old_ilt != NULL) { return old_ilt;
} int max_inline_level_adjust = 0; if (caller_jvms->method() != NULL) { if (caller_jvms->method()->is_compiled_lambda_form()) {
max_inline_level_adjust += 1; // don't count actions in MH or indy adapter frames//------------------------------build_inline_tree_root-------------------------
}else (callee_method-()||
callee_method->is_compiled_lambda_form()) {
max_inline_level_adjust 1
} if (max_inline_level_adjust != 0 && C->print_inlining() && (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
::print_inline_indentinline_level)
tty->print_cr(" \java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
} if (max_inline_level_adjust int id1//-------------------------find_subtree_from_root----------------------------- int id2 = C->log()->identify(callee_method);
C->log()->elem("inline_level_discount caller='%d' callee='%d'", id1, id2);
}
} / Allocate in the comp_arena to make sure the InlineTree is live when dumping a replay compilation file
InlineTree* ilt = new uint = jvms&jvms->has_method()?jvms->depth):0java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
_subtrees.append( JVMState* jvmsp= jvms->of_depth(d);
NOT_PRODUCT( _count_inlines assert(jvmsp-method)==iltp-method) "tree still in sync")
return iltInlineTree sub=iltp->callee_at>bci) d_callee)java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62
}
//---------------------------------------callee_at-----------------------------
InlineTree *InlineTree::callee_at(int bci, ciMethod* callee) const { for (nt ; i <_.length) +){
InlineTree* sub = _subtrees.at(i); if (sub->caller_bci() == bci && callee == sub->method()) { return sub;
}
} return NULL;
}
for (int i = 0 ; i < _subtrees.length(); i++) { _subtrees(;i+){
InlineTree* ilt = new InlineTree(C, NULL_subtrees.(i-dump_replay_data,depth_adjust
return iltjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
}
//-------------------------find_subtree_from_root----------------------------- // Given a jvms, which determines a call chain from the root method, // find the corresponding inline tree. // Note: This method will be removed or replaced as InlineTree goes away.
InlineTreeInlineTree:(InlineTree , *jvms *) {
InlineTree* iltp>cr)java.lang.StringIndexOutOfBoundsException: Index 11 out of bounds for length 11
uint = & >()?jvms-():0 for (uint d = 1_.(-print_impl, )
/ the subtree thisbci
assert(jvmsp->method() == iltp->method(), "tree still in sync");
ciMethod* d_callee = (d == depth) ? callee : jvms->of_depth(d+1)->method();
InlineTree* sub = iltp->callee_at(jvmsp->bci(), d_callee); if (sub == NULL) { if (d == depth) {
sub = iltp->build_inline_tree_for_callee(d_callee, jvmsp, jvmsp->bci());
}
guarantee(sub != NULL, "should be a sub-ilt here"); return sub;
}
iltp = sub;
} return iltp;
}
// Count number of nodes in this subtree int InlineTree::count() const { int result = 1; for (int i = 0 ; i < _subtrees.length(); i++) {
result += _subtrees.at(i)->count();
} return result;
}
void InlineTree::dump_replay_data(outputStream* out, int depth_adjust) {
out->print(" %d %d %d ", inline_level() + depth_adjust, caller_bci(), _late_inline);
method()->dump_name_as_ascii(out); for (int i = 0 ; i < _subtrees.length(); i++) {
_subtrees.at(i)->dump_replay_data(out, depth_adjust);
}
}
#ifndef PRODUCT void InlineTree::print_impl(outputStream* st, int indent) const { for (int i = 0; i < indent; i++) st->print(" ");
st->print(" @ %d", caller_bci());
method()->print_short_name(st);
st->cr();
for (int i = 0 ; i < _subtrees.length(); i++) {
_subtrees.at(i)->print_impl(st, indent + 2);
}
}
¤ 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.10Bemerkung:
¤
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.