< prev index next > src/hotspot/share/memory/dynamicArchive.cpp
Print this page
return true; // keep recursing until every object is visited exactly once.
}
virtual void push_special(SpecialRef type, Ref* ref, intptr_t* p) {
- assert(type == _method_entry_ref, "only special type allowed for now");
+ // TODO:CDS - JDK-8234693 will consolidate this with an almost identical method in metaspaceShared.cpp
+ assert_valid(type);
address obj = ref->obj();
address new_obj = _builder->get_new_loc(ref);
size_t offset = pointer_delta(p, obj, sizeof(u1));
intptr_t* new_p = (intptr_t*)(new_obj + offset);
- assert(*p == *new_p, "must be a copy");
+ switch (type) {
+ case _method_entry_ref:
+ assert(*p == *new_p, "must be a copy");
+ break;
+ case _internal_pointer_ref:
+ {
+ size_t off = pointer_delta(*((address*)p), obj, sizeof(u1));
+ assert(0 <= intx(off) && intx(off) < ref->size() * BytesPerWord, "must point to internal address");
+ *((address*)new_p) = new_obj + off;
+ }
+ break;
+ default:
+ ShouldNotReachHere();
+ }
ArchivePtrMarker::mark_pointer((address*)new_p);
}
};
class EmbeddedRefUpdater: public MetaspaceClosure {
}
size_t DynamicArchiveBuilder::estimate_trampoline_size() {
size_t total = 0;
size_t each_method_bytes =
- align_up(SharedRuntime::trampoline_size(), BytesPerWord) +
+ align_up(SharedRuntime::trampoline_size(), BytesPerWord) * 3 +
align_up(sizeof(AdapterHandlerEntry*), BytesPerWord);
for (int i = 0; i < _klasses->length(); i++) {
InstanceKlass* ik = _klasses->at(i);
Array<Method*>* methods = ik->methods();
for (int i = 0; i < _klasses->length(); i++) {
InstanceKlass* ik = _klasses->at(i);
Array<Method*>* methods = ik->methods();
for (int j = 0; j < methods->length(); j++) {
Method* m = methods->at(j);
+
+ // TODO:CDS - JDK-8234693 will consolidate this with Method::unlink()
address c2i_entry_trampoline = (address)p;
p += SharedRuntime::trampoline_size();
assert(p >= mc_space->base() && p <= mc_space->top(), "must be");
m->set_from_compiled_entry(to_target(c2i_entry_trampoline));
+ address c2i_inline_ro_entry_trampoline = (address)p;
+ p += SharedRuntime::trampoline_size();
+ assert(p >= mc_space->base() && p <= mc_space->top(), "must be");
+ m->set_from_compiled_inline_ro_entry(to_target(c2i_inline_ro_entry_trampoline));
+
+ address c2i_inline_entry_trampoline = (address)p;
+ p += SharedRuntime::trampoline_size();
+ assert(p >= mc_space->base() && p <= mc_space->top(), "must be");
+ m->set_from_compiled_inline_entry(to_target(c2i_inline_entry_trampoline));
+
AdapterHandlerEntry** adapter_trampoline =(AdapterHandlerEntry**)p;
p += sizeof(AdapterHandlerEntry*);
assert(p >= mc_space->base() && p <= mc_space->top(), "must be");
*adapter_trampoline = NULL;
m->set_adapter_trampoline(to_target(adapter_trampoline));
< prev index next >