Mercurial > hg > truffle
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: |