src/hotspot/share/c1/c1_ValueStack.cpp
changeset 58586 cd9c4e6aa631
parent 54074 9c6508806663
equal deleted inserted replaced
58585:e69d6f076a6a 58586:cd9c4e6aa631
    40 , _locks(NULL)
    40 , _locks(NULL)
    41 {
    41 {
    42   verify();
    42   verify();
    43 }
    43 }
    44 
    44 
    45 
       
    46 ValueStack::ValueStack(ValueStack* copy_from, Kind kind, int bci)
    45 ValueStack::ValueStack(ValueStack* copy_from, Kind kind, int bci)
    47   : _scope(copy_from->scope())
    46   : _scope(copy_from->scope())
    48   , _caller_state(copy_from->caller_state())
    47   , _caller_state(copy_from->caller_state())
    49   , _bci(bci)
    48   , _bci(bci)
    50   , _kind(kind)
    49   , _kind(kind)
    51   , _locals()
    50   , _locals(copy_from->locals_size_for_copy(kind))
    52   , _stack()
    51   , _stack(copy_from->stack_size_for_copy(kind))
    53   , _locks(copy_from->locks_size() == 0 ? NULL : new Values(copy_from->locks_size()))
    52   , _locks(copy_from->locks_size() == 0 ? NULL : new Values(copy_from->locks_size()))
    54 {
    53 {
    55   assert(kind != EmptyExceptionState || !Compilation::current()->env()->should_retain_local_variables(), "need locals");
    54   assert(kind != EmptyExceptionState || !Compilation::current()->env()->should_retain_local_variables(), "need locals");
    56   if (kind != EmptyExceptionState) {
    55   if (kind != EmptyExceptionState) {
    57     // only allocate space if we need to copy the locals-array
       
    58     _locals = Values(copy_from->locals_size());
       
    59     _locals.appendAll(&copy_from->_locals);
    56     _locals.appendAll(&copy_from->_locals);
    60   }
    57   }
    61 
    58 
       
    59   if (kind != ExceptionState && kind != EmptyExceptionState) {
       
    60     _stack.appendAll(&copy_from->_stack);
       
    61   }
       
    62 
       
    63   if (copy_from->locks_size() > 0) {
       
    64     _locks->appendAll(copy_from->_locks);
       
    65   }
       
    66 
       
    67   verify();
       
    68 }
       
    69 
       
    70 int ValueStack::locals_size_for_copy(Kind kind) const {
       
    71   if (kind != EmptyExceptionState) {
       
    72     return locals_size();
       
    73   }
       
    74   return 0;
       
    75 }
       
    76 
       
    77 int ValueStack::stack_size_for_copy(Kind kind) const {
    62   if (kind != ExceptionState && kind != EmptyExceptionState) {
    78   if (kind != ExceptionState && kind != EmptyExceptionState) {
    63     if (kind == Parsing) {
    79     if (kind == Parsing) {
    64       // stack will be modified, so reserve enough space to avoid resizing
    80       // stack will be modified, so reserve enough space to avoid resizing
    65       _stack = Values(scope()->method()->max_stack());
    81       return scope()->method()->max_stack();
    66     } else {
    82     } else {
    67       // stack will not be modified, so do not waste space
    83       // stack will not be modified, so do not waste space
    68       _stack = Values(copy_from->stack_size());
    84       return stack_size();
    69     }
    85     }
    70     _stack.appendAll(&copy_from->_stack);
    86   }
    71   }
    87   return 0;
    72 
    88 }
    73   if (copy_from->locks_size() > 0) {
       
    74     _locks->appendAll(copy_from->_locks);
       
    75   }
       
    76 
       
    77   verify();
       
    78 }
       
    79 
       
    80 
    89 
    81 bool ValueStack::is_same(ValueStack* s) {
    90 bool ValueStack::is_same(ValueStack* s) {
    82   if (scope() != s->scope()) return false;
    91   if (scope() != s->scope()) return false;
    83   if (caller_state() != s->caller_state()) return false;
    92   if (caller_state() != s->caller_state()) return false;
    84 
    93