/* * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. *
*/
if (copy_from->locks_size() > 0) {
_locks->appendAll(copy_from->_locks);
}
verify();
}
int ValueStack::locals_size_for_copy(Kind kind) const { if (kind != EmptyExceptionState) { return locals_size();
} return 0;
}
int ValueStack::stack_size_for_copy(Kind kind) const { if (kind != ExceptionState && kind != EmptyExceptionState) { if (kind == Parsing) { // stack will be modified, so reserve enough space to avoid resizing return scope()->method()->max_stack();
} else { // stack will not be modified, so do not waste space return stack_size();
}
} return 0;
}
bool ValueStack::is_same(ValueStack* s) { if (scope() != s->scope()) returnfalse; if (caller_state() != s->caller_state()) returnfalse;
if (locals_size() != s->locals_size()) returnfalse; if (stack_size() != s->stack_size()) returnfalse; if (locks_size() != s->locks_size()) returnfalse;
// compare each stack element with the corresponding stack element of s int index;
Value value;
for_each_stack_value(this, index, value) { if (value->type()->tag() != s->stack_at(index)->type()->tag()) returnfalse;
} for (int i = 0; i < locks_size(); i++) {
value = lock_at(i); if (value != NULL && value != s->lock_at(i)) { returnfalse;
}
} returntrue;
}
void ValueStack::clear_locals() { for (int i = _locals.length() - 1; i >= 0; i--) {
_locals.at_put(i, NULL);
}
}
// apply function to all values of a list; factored out from values_do(f) void ValueStack::apply(const Values& list, ValueVisitor* f) { for (int i = 0; i < list.length(); i++) {
Value* va = list.adr_at(i);
Value v0 = *va; if (v0 != NULL && !v0->type()->is_illegal()) {
f->visit(va); #ifdef ASSERT
Value v1 = *va;
assert(v1->type()->is_illegal() || v0->type()->tag() == v1->type()->tag(), "types must match");
assert(!v1->type()->is_double_word() || list.at(i + 1) == NULL, "hi-word of doubleword value must be NULL"); #endif if (v0->type()->is_double_word()) i++;
}
}
}
Values* ValueStack::pop_arguments(int argument_size) {
assert(stack_size() >= argument_size, "stack too small or too many arguments"); int base = stack_size() - argument_size;
Values* args = new Values(argument_size); for (int i = base; i < stack_size();) args->push(stack_at_inc(i));
truncate_stack(base); return args;
}
int ValueStack::total_locks_size() const { int num_locks = 0; const ValueStack* state = this;
for_each_state(state) {
num_locks += state->locks_size();
} return num_locks;
}
int ValueStack::lock(Value obj) { if (_locks == NULL) {
_locks = new Values();
}
_locks->push(obj); int num_locks = total_locks_size();
scope()->set_min_number_of_locks(num_locks); return num_locks - 1;
}
if (kind() == Parsing) {
assert(bci() == -99, "bci not defined during parsing");
} else {
assert(bci() >= -1, "bci out of range");
assert(bci() < scope()->method()->code_size(), "bci out of range");
assert(bci() == SynchronizationEntryBCI || Bytecodes::is_defined(scope()->method()->java_code_at_bci(bci())), "make sure bci points at a real bytecode");
assert(scope()->method()->liveness_at_bci(bci()).is_valid(), "liveness at bci must be valid");
}
int i; for (i = 0; i < stack_size(); i++) {
Value v = _stack.at(i); if (v == NULL) {
assert(_stack.at(i - 1)->type()->is_double_word(), "only hi-words are NULL on stack");
} elseif (v->type()->is_double_word()) {
assert(_stack.at(i + 1) == NULL, "hi-word must be NULL");
}
}
for (i = 0; i < locals_size(); i++) {
Value v = _locals.at(i); if (v != NULL && v->type()->is_double_word()) {
assert(_locals.at(i + 1) == NULL, "hi-word must be NULL");
}
}
for_each_state_value(this, v,
assert(v != NULL, "just test if state-iteration succeeds");
);
} #endif// PRODUCT
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.