comparison src/share/vm/ci/bcEscapeAnalyzer.cpp @ 1747:53dbe853fb3a

6896381: CTW fails share/vm/ci/bcEscapeAnalyzer.cpp:99, assert(_stack_height < _max_stack,"stack overflow") Summary: Check constant Tag type instead of calling get_constant(). Reviewed-by: never
author kvn
date Mon, 23 Aug 2010 09:09:36 -0700
parents 8099e71601df
children f95d63e2154a
comparison
equal deleted inserted replaced
1746:4b29a725c43c 1747:53dbe853fb3a
90 90
91 StateInfo() { 91 StateInfo() {
92 empty_map.clear(); 92 empty_map.clear();
93 } 93 }
94 94
95 ArgumentMap raw_pop() { assert(_stack_height > 0, "stack underflow"); return _stack[--_stack_height]; } 95 ArgumentMap raw_pop() { guarantee(_stack_height > 0, "stack underflow"); return _stack[--_stack_height]; }
96 ArgumentMap apop() { return raw_pop(); } 96 ArgumentMap apop() { return raw_pop(); }
97 void spop() { raw_pop(); } 97 void spop() { raw_pop(); }
98 void lpop() { spop(); spop(); } 98 void lpop() { spop(); spop(); }
99 void raw_push(ArgumentMap i) { assert(_stack_height < _max_stack, "stack overflow"); _stack[_stack_height++] = i; } 99 void raw_push(ArgumentMap i) { guarantee(_stack_height < _max_stack, "stack overflow"); _stack[_stack_height++] = i; }
100 void apush(ArgumentMap i) { raw_push(i); } 100 void apush(ArgumentMap i) { raw_push(i); }
101 void spush() { raw_push(empty_map); } 101 void spush() { raw_push(empty_map); }
102 void lpush() { spush(); spush(); } 102 void lpush() { spush(); spush(); }
103 103
104 }; 104 };
363 state.lpush(); 363 state.lpush();
364 break; 364 break;
365 case Bytecodes::_ldc: 365 case Bytecodes::_ldc:
366 case Bytecodes::_ldc_w: 366 case Bytecodes::_ldc_w:
367 case Bytecodes::_ldc2_w: 367 case Bytecodes::_ldc2_w:
368 if (type2size[s.get_constant().basic_type()] == 1) { 368 {
369 // Avoid calling get_constant() which will try to allocate
370 // unloaded constant. We need only constant's type.
371 int index = s.get_constant_pool_index();
372 constantTag tag = s.get_constant_pool_tag(index);
373 if (tag.is_long() || tag.is_double()) {
374 // Only longs and doubles use 2 stack slots.
375 state.lpush();
376 } else {
369 state.spush(); 377 state.spush();
370 } else { 378 }
371 state.lpush(); 379 break;
372 } 380 }
373 break;
374 case Bytecodes::_aload: 381 case Bytecodes::_aload:
375 state.apush(state._vars[s.get_index()]); 382 state.apush(state._vars[s.get_index()]);
376 break; 383 break;
377 case Bytecodes::_iload: 384 case Bytecodes::_iload:
378 case Bytecodes::_fload: 385 case Bytecodes::_fload: