src/share/vm/code/dependencies.cpp
Print this page
*** 331,346 ****
}
bytes.write_byte(code_byte);
for (int j = 0; j < stride; j++) {
if (j == skipj) continue;
ciBaseObject* v = deps->at(i+j);
if (v->is_object()) {
! bytes.write_int(_oop_recorder->find_index(v->as_object()->constant_encoding()));
} else {
ciMetadata* meta = v->as_metadata();
! bytes.write_int(_oop_recorder->find_index(meta->constant_encoding()));
}
}
}
}
// write a sentinel byte to mark the end
--- 331,348 ----
}
bytes.write_byte(code_byte);
for (int j = 0; j < stride; j++) {
if (j == skipj) continue;
ciBaseObject* v = deps->at(i+j);
+ int idx;
if (v->is_object()) {
! idx = _oop_recorder->find_index(v->as_object()->constant_encoding());
} else {
ciMetadata* meta = v->as_metadata();
! idx = _oop_recorder->find_index(meta->constant_encoding());
}
+ bytes.write_int(idx);
}
}
}
// write a sentinel byte to mark the end
*** 663,672 ****
--- 665,682 ----
: JNIHandles::resolve(_deps->oop_recorder()->oop_at(i));
}
Metadata* Dependencies::DepStream::argument(int i) {
Metadata* result = recorded_metadata_at(argument_index(i));
+
+ if (result == NULL) { // Explicit context argument can be compressed
+ int ctxkj = dep_context_arg(type()); // -1 if no explicit context arg
+ if (ctxkj >= 0 && i == ctxkj && ctxkj+1 < argument_count()) {
+ result = ctxk_encoded_as_null(type(), argument(ctxkj+1));
+ }
+ }
+
assert(result == NULL || result->is_klass() || result->is_method(), "must be");
return result;
}
oop Dependencies::DepStream::argument_oop(int i) {
*** 678,706 ****
Klass* Dependencies::DepStream::context_type() {
assert(must_be_in_vm(), "raw oops here");
// Most dependencies have an explicit context type argument.
{
! int ctxkj = dep_context_arg(_type); // -1 if no explicit context arg
if (ctxkj >= 0) {
Metadata* k = argument(ctxkj);
! if (k != NULL) { // context type was not compressed away
! assert(k->is_klass(), "type check");
! return (Klass*) k;
! }
! // recompute "default" context type
! return ctxk_encoded_as_null(_type, argument(ctxkj+1));
}
}
// Some dependencies are using the klass of the first object
// argument as implicit context type (e.g. call_site_target_value).
{
! int ctxkj = dep_implicit_context_arg(_type);
if (ctxkj >= 0) {
Klass* k = argument_oop(ctxkj)->klass();
! assert(k->is_klass(), "type check");
return (Klass*) k;
}
}
// And some dependencies don't have a context type at all,
--- 688,712 ----
Klass* Dependencies::DepStream::context_type() {
assert(must_be_in_vm(), "raw oops here");
// Most dependencies have an explicit context type argument.
{
! int ctxkj = dep_context_arg(type()); // -1 if no explicit context arg
if (ctxkj >= 0) {
Metadata* k = argument(ctxkj);
! assert(k != NULL && k->is_klass(), "type check");
! return (Klass*)k;
}
}
// Some dependencies are using the klass of the first object
// argument as implicit context type (e.g. call_site_target_value).
{
! int ctxkj = dep_implicit_context_arg(type());
if (ctxkj >= 0) {
Klass* k = argument_oop(ctxkj)->klass();
! assert(k != NULL && k->is_klass(), "type check");
return (Klass*) k;
}
}
// And some dependencies don't have a context type at all,