8038636: speculative traps break when classes are redefined

Remove speculative traps that point to methods that are redefined

Reviewed-by: kvn, twisti
This commit is contained in:
Roland Westrelin 2014-04-08 09:51:25 +02:00
parent d7b640b3ce
commit 7da7a9c72a
5 changed files with 260 additions and 11 deletions

View file

@ -3409,6 +3409,10 @@ static void purge_previous_versions_internal(InstanceKlass* ik, int emcp_method_
("purge: %s(%s): prev method @%d in version @%d is alive",
method->name()->as_C_string(),
method->signature()->as_C_string(), j, i));
if (method->method_data() != NULL) {
// Clean out any weak method links
method->method_data()->clean_weak_method_links();
}
}
}
}
@ -3418,6 +3422,14 @@ static void purge_previous_versions_internal(InstanceKlass* ik, int emcp_method_
("purge: previous version stats: live=%d, deleted=%d", live_count,
deleted_count));
}
Array<Method*>* methods = ik->methods();
int num_methods = methods->length();
for (int index2 = 0; index2 < num_methods; ++index2) {
if (methods->at(index2)->method_data() != NULL) {
methods->at(index2)->method_data()->clean_weak_method_links();
}
}
}
// External interface for use during class unloading.