src/share/vm/code/dependencies.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
JDK-7194669 Cdiff src/share/vm/code/dependencies.cpp
src/share/vm/code/dependencies.cpp
Print this page
*** 678,687 ****
--- 678,698 ----
assert(result == NULL || result->is_klass() || result->is_method(), "must be");
return result;
}
+ /**
+ * Returns a unique identifier for each dependency argument.
+ */
+ uintptr_t Dependencies::DepStream::get_identifier(int i) {
+ if (has_oop_argument()) {
+ return (uintptr_t)(oopDesc*)argument_oop(i);
+ } else {
+ return (uintptr_t)argument(i);
+ }
+ }
+
oop Dependencies::DepStream::argument_oop(int i) {
oop result = recorded_oop_at(argument_index(i));
assert(result == NULL || result->is_oop(), "must be");
return result;
}
*** 713,722 ****
--- 724,784 ----
// And some dependencies don't have a context type at all,
// e.g. evol_method.
return NULL;
}
+ // ----------------- DependencySignature --------------------------------------
+ bool DependencySignature::equals(const DependencySignature& sig) const {
+ if (type() != sig.type()) {
+ return false;
+ }
+
+ if (args_count() != sig.args_count()) {
+ return false;
+ }
+
+ for (int i = 0; i < sig.args_count(); i++) {
+ if (arg(i) != sig.arg(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ // ----------------- DependencySignatureBuffer --------------------------------------
+ DependencySignatureBuffer::DependencySignatureBuffer() {
+ _signatures = NEW_RESOURCE_ARRAY(GrowableArray<DependencySignature*>*, Dependencies::TYPE_LIMIT);
+ memset(_signatures, 0, sizeof(DependencySignature*) * Dependencies::TYPE_LIMIT);
+ }
+
+ /* Check if arguments are identical. Two dependency signatures are considered
+ * identical, if the type as well as all argument identifiers are identical.
+ * If the dependency has not already been checked, the dependency signature is
+ * added to the checked dependencies of the same type. The function returns
+ * false, which causes the dependency to be checked in the caller.
+ */
+ bool DependencySignatureBuffer::add_if_missing(const DependencySignature& sig) {
+ const int index = sig.type();
+ GrowableArray<DependencySignature*>* buffer = _signatures[index];
+ if (buffer == NULL) {
+ buffer = new GrowableArray<DependencySignature*>();
+ _signatures[index] = buffer;
+ }
+
+ // Check if we have already checked the dependency
+ for (int i = 0; i < buffer->length(); i++) {
+ DependencySignature* checked_signature = buffer->at(i);
+ if (checked_signature->equals(sig)) {
+ return true;
+ }
+ }
+ buffer->append((DependencySignature*)&sig);
+ return false;
+ }
+
+
/// Checking dependencies:
// This hierarchy walker inspects subtypes of a given type,
// trying to find a "bad" class which breaks a dependency.
// Such a class is called a "witness" to the broken dependency.
src/share/vm/code/dependencies.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File