diff -r 390896759aa2 -r fc4cfca10556 src/hotspot/share/jvmci/jvmciCodeInstaller.cpp --- a/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp Wed Oct 11 17:11:28 2017 -0700 +++ b/src/hotspot/share/jvmci/jvmciCodeInstaller.cpp Thu Oct 19 19:23:48 2017 -0700 @@ -174,43 +174,42 @@ } AOTOopRecorder::AOTOopRecorder(Arena* arena, bool deduplicate) : OopRecorder(arena, deduplicate) { - _meta_strings = new GrowableArray(); + _meta_refs = new GrowableArray(); } -int AOTOopRecorder::nr_meta_strings() const { - return _meta_strings->length(); +int AOTOopRecorder::nr_meta_refs() const { + return _meta_refs->length(); } -const char* AOTOopRecorder::meta_element(int pos) const { - return _meta_strings->at(pos); +jobject AOTOopRecorder::meta_element(int pos) const { + return _meta_refs->at(pos); } int AOTOopRecorder::find_index(Metadata* h) { + JavaThread* THREAD = JavaThread::current(); + int oldCount = metadata_count(); int index = this->OopRecorder::find_index(h); + int newCount = metadata_count(); + + if (oldCount == newCount) { + // found a match + return index; + } + + vmassert(index + 1 == newCount, "must be last"); Klass* klass = NULL; + oop result = NULL; if (h->is_klass()) { klass = (Klass*) h; - record_meta_string(klass->signature_name(), index); + result = CompilerToVM::get_jvmci_type(klass, CATCH); } else if (h->is_method()) { Method* method = (Method*) h; - // Need klass->signature_name() in method name - klass = method->method_holder(); - const char* klass_name = klass->signature_name(); - int klass_name_len = (int)strlen(klass_name); - Symbol* method_name = method->name(); - Symbol* signature = method->signature(); - int method_name_len = method_name->utf8_length(); - int method_sign_len = signature->utf8_length(); - int len = klass_name_len + 1 + method_name_len + method_sign_len; - char* dest = NEW_RESOURCE_ARRAY(char, len + 1); - strcpy(dest, klass_name); - dest[klass_name_len] = '.'; - strcpy(&dest[klass_name_len + 1], method_name->as_C_string()); - strcpy(&dest[klass_name_len + 1 + method_name_len], signature->as_C_string()); - dest[len] = 0; - record_meta_string(dest, index); + methodHandle mh(method); + result = CompilerToVM::get_jvmci_method(method, CATCH); } + jobject ref = JNIHandles::make_local(THREAD, result); + record_meta_ref(ref, index); return index; } @@ -224,16 +223,12 @@ return find_index(klass); } -void AOTOopRecorder::record_meta_string(const char* name, int index) { +void AOTOopRecorder::record_meta_ref(jobject o, int index) { assert(index > 0, "must be 1..n"); index -= 1; // reduce by one to convert to array index - if (index < _meta_strings->length()) { - assert(strcmp(name, _meta_strings->at(index)) == 0, "must match"); - } else { - assert(index == _meta_strings->length(), "must be last"); - _meta_strings->append(name); - } + assert(index == _meta_refs->length(), "must be last"); + _meta_refs->append(o); } void* CodeInstaller::record_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS) {