< prev index next >

hotspot/src/share/vm/classfile/systemDictionary.cpp

Print this page

        

*** 59,68 **** --- 59,69 ---- #include "oops/objArrayKlass.hpp" #include "oops/objArrayOop.inline.hpp" #include "oops/oop.inline.hpp" #include "oops/symbol.hpp" #include "oops/typeArrayKlass.hpp" + #include "oops/valueKlass.hpp" #include "prims/jvm.h" #include "prims/jvmtiEnvBase.hpp" #include "prims/resolvedMethodTable.hpp" #include "prims/methodHandles.hpp" #include "runtime/arguments.hpp"
*** 286,295 **** --- 287,324 ---- k = TypeArrayKlass::cast(k)->array_klass(fd.dimension(), CHECK_NULL); } return k; } + // Temporary Minimal Value Type support code. Attempt to load VCC for DVT descriptor + Klass* SystemDictionary::resolve_dvt_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS) { + assert(EnableMVT && FieldType::is_dvt_postfix(class_name), "Invariant"); + + ResourceMark rm(THREAD); + // Given a "Q-type" descriptor and EnableMVT, original exception is not so interesting + CLEAR_PENDING_EXCEPTION; + + TempNewSymbol vcc_name = SymbolTable::new_symbol(FieldType::dvt_unmangle_vcc(class_name), CHECK_NULL); + Klass* vcc = do_resolve_instance_class_or_null(vcc_name, class_loader, protection_domain, CHECK_NULL); + if (vcc == NULL) { + return NULL; + } + Klass* dvt = do_resolve_instance_class_or_null(class_name, class_loader, protection_domain, CHECK_NULL); + if ((dvt !=NULL) && dvt->is_value() && (ValueKlass::cast(dvt)->get_vcc_klass() == vcc)) { + return dvt; + } + if (vcc->is_instance_klass() && (!InstanceKlass::cast(vcc)->has_vcc_annotation())) { + static const char not_vcc_msg[] = + "Failed to resolve %s, found possible ValueCapableClass name mangle match is not ValueCapableClass annotated: %s"; + size_t buflen = strlen(not_vcc_msg) + class_name->utf8_length() + vcc_name->utf8_length(); + char* buf = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, buflen); + jio_snprintf(buf, buflen, not_vcc_msg, class_name->as_C_string(), vcc_name->as_C_string()); + THROW_MSG_NULL(vmSymbols::java_lang_NoClassDefFoundError(), buf); + } + return NULL; + } + // Must be called for any super-class or super-interface resolution // during class definition to allow class circularity checking // super-interface callers: // parse_interfaces - for defineClass & jvmtiRedefineClasses
*** 641,655 **** event.commit(); } #endif // INCLUDE_TRACE } // Be careful when modifying this code: once you have run // placeholders()->find_and_add(PlaceholderTable::LOAD_INSTANCE), // you need to find_and_remove it before returning. // So be careful to not exit with a CHECK_ macro betweeen these calls. ! Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, Handle class_loader, Handle protection_domain, TRAPS) { assert(name != NULL && !FieldType::is_array(name) && !FieldType::is_obj(name) && !FieldType::is_valuetype(name), "invalid class name"); --- 670,695 ---- event.commit(); } #endif // INCLUDE_TRACE } + Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name, + Handle class_loader, + Handle protection_domain, + TRAPS) { + Klass* k = do_resolve_instance_class_or_null(name, class_loader, protection_domain, THREAD); + if (EnableMVT && (k == NULL) && FieldType::is_dvt_postfix(name)) { + k = resolve_dvt_or_null(name, class_loader, protection_domain, THREAD); + } + return k; + } + // Be careful when modifying this code: once you have run // placeholders()->find_and_add(PlaceholderTable::LOAD_INSTANCE), // you need to find_and_remove it before returning. // So be careful to not exit with a CHECK_ macro betweeen these calls. ! Klass* SystemDictionary::do_resolve_instance_class_or_null(Symbol* name, Handle class_loader, Handle protection_domain, TRAPS) { assert(name != NULL && !FieldType::is_array(name) && !FieldType::is_obj(name) && !FieldType::is_valuetype(name), "invalid class name");
< prev index next >