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(©_from->_locals); |
56 _locals.appendAll(©_from->_locals); |
60 } |
57 } |
61 |
58 |
|
59 if (kind != ExceptionState && kind != EmptyExceptionState) { |
|
60 _stack.appendAll(©_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(©_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 |