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,