comparison src/share/vm/opto/bytecodeInfo.cpp @ 3334:b21ecca7ccc4

6552561: MaxRecursiveInlineLevel flag doesn't operate correctly Reviewed-by: kvn, never
author twisti
date Mon, 02 May 2011 00:55:09 -0700
parents 3d58a4983660
children bad7ecd0b6ed
comparison
equal deleted inserted replaced
3333:ae93231c7a1f 3334:b21ecca7ccc4
308 } 308 }
309 if( inline_depth() > MaxInlineLevel ) { 309 if( inline_depth() > MaxInlineLevel ) {
310 return "inlining too deep"; 310 return "inlining too deep";
311 } 311 }
312 312
313 // We need to detect recursive inlining of method handle targets: if 313 // detect direct and indirect recursive inlining
314 // the current method is a method handle adapter and one of the 314 {
315 // callers is the same method as the callee, we bail out if 315 // count the current method and the callee
316 // MaxRecursiveInlineLevel is hit. 316 int inline_level = (method() == callee_method) ? 1 : 0;
317 if (method()->is_method_handle_adapter()) { 317 if (inline_level > MaxRecursiveInlineLevel)
318 return "recursively inlining too deep";
319 // count callers of current method and callee
318 JVMState* jvms = caller_jvms(); 320 JVMState* jvms = caller_jvms();
319 int inline_level = 0;
320 while (jvms != NULL && jvms->has_method()) { 321 while (jvms != NULL && jvms->has_method()) {
321 if (jvms->method() == callee_method) { 322 if (jvms->method() == callee_method) {
322 inline_level++; 323 inline_level++;
323 if (inline_level > MaxRecursiveInlineLevel) 324 if (inline_level > MaxRecursiveInlineLevel)
324 return "recursively inlining too deep"; 325 return "recursively inlining too deep";
325 } 326 }
326 jvms = jvms->caller(); 327 jvms = jvms->caller();
327 } 328 }
328 }
329
330 if (method() == callee_method && inline_depth() > MaxRecursiveInlineLevel) {
331 return "recursively inlining too deep";
332 } 329 }
333 330
334 int size = callee_method->code_size(); 331 int size = callee_method->code_size();
335 332
336 if (UseOldInlining && ClipInlining 333 if (UseOldInlining && ClipInlining