< prev index next >

src/hotspot/share/oops/instanceKlass.cpp

Print this page

        

*** 151,161 **** parser.itable_size(), nonstatic_oop_map_size(parser.total_oop_map_count()), parser.is_interface(), parser.is_anonymous(), should_store_fingerprint(parser.is_anonymous()), ! parser.has_value_fields() ? parser.java_fields_count() : 0, parser.is_value_type()); const Symbol* const class_name = parser.class_name(); assert(class_name != NULL, "invariant"); ClassLoaderData* loader_data = parser.loader_data(); --- 151,161 ---- parser.itable_size(), nonstatic_oop_map_size(parser.total_oop_map_count()), parser.is_interface(), parser.is_anonymous(), should_store_fingerprint(parser.is_anonymous()), ! parser.has_flattenable_fields() ? parser.java_fields_count() : 0, parser.is_value_type()); const Symbol* const class_name = parser.class_name(); assert(class_name != NULL, "invariant"); ClassLoaderData* loader_data = parser.loader_data();
*** 256,273 **** InstanceKlass::InstanceKlass(const ClassFileParser& parser, unsigned kind) : _static_field_size(parser.static_field_size()), _nonstatic_oop_map_size(nonstatic_oop_map_size(parser.total_oop_map_count())), _itable_len(parser.itable_size()), _reference_type(parser.reference_type()), ! _extra_flags(0) { set_vtable_length(parser.vtable_size()); set_kind(kind); set_access_flags(parser.access_flags()); set_is_anonymous(parser.is_anonymous()); set_layout_helper(Klass::instance_layout_helper(parser.layout_size(), false)); ! if (parser.has_value_fields()) { set_has_value_fields(); } _java_fields_count = parser.java_fields_count(); assert(NULL == _methods, "underlying memory not zeroed?"); --- 256,274 ---- InstanceKlass::InstanceKlass(const ClassFileParser& parser, unsigned kind) : _static_field_size(parser.static_field_size()), _nonstatic_oop_map_size(nonstatic_oop_map_size(parser.total_oop_map_count())), _itable_len(parser.itable_size()), _reference_type(parser.reference_type()), ! _extra_flags(0), ! _adr_valueklass_fixed_block(NULL) { set_vtable_length(parser.vtable_size()); set_kind(kind); set_access_flags(parser.access_flags()); set_is_anonymous(parser.is_anonymous()); set_layout_helper(Klass::instance_layout_helper(parser.layout_size(), false)); ! if (parser.has_flattenable_fields()) { set_has_value_fields(); } _java_fields_count = parser.java_fields_count(); assert(NULL == _methods, "underlying memory not zeroed?");
*** 625,635 **** // applicable to classes that are not verified // First step: fields for (JavaFieldStream fs(this); !fs.done(); fs.next()) { ResourceMark rm(THREAD); ! if (fs.field_descriptor().field_type() == T_VALUETYPE) { Symbol* signature = fs.field_descriptor().signature(); // Get current loader and protection domain first. oop loader = class_loader(); oop prot_domain = protection_domain(); Klass* klass = SystemDictionary::resolve_or_fail(signature, --- 626,636 ---- // applicable to classes that are not verified // First step: fields for (JavaFieldStream fs(this); !fs.done(); fs.next()) { ResourceMark rm(THREAD); ! if (fs.field_descriptor().access_flags().is_flattenable()) { Symbol* signature = fs.field_descriptor().signature(); // Get current loader and protection domain first. oop loader = class_loader(); oop prot_domain = protection_domain(); Klass* klass = SystemDictionary::resolve_or_fail(signature,
*** 687,701 **** // on an earlier link attempt // don't verify or rewrite if already rewritten // if (!is_linked()) { - // The VCC must be linked before the DVT - if (get_vcc_klass() != NULL) { - InstanceKlass::cast(get_vcc_klass())->link_class(CHECK_false); - } - if (!is_rewritten()) { { bool verify_ok = verify_code(throw_verifyerror, THREAD); if (!verify_ok) { return false; --- 688,697 ----
*** 800,814 **** } void InstanceKlass::initialize_impl(TRAPS) { HandleMark hm(THREAD); - // ensure outer VCC is initialized, possible some crafty code referred to VT 1st - if (get_vcc_klass() != NULL) { - get_vcc_klass()->initialize(CHECK); - } - // Make sure klass is linked (verified) before initialization // A class could already be verified, since it has been reflected upon. link_class(CHECK); DTRACE_CLASSINIT_PROBE(required, -1); --- 796,805 ----
*** 2391,2401 **** char* dest = NEW_RESOURCE_ARRAY(char, src_length + hash_len + 3); // Add L as type indicator int dest_index = 0; ! dest[dest_index++] = is_value_type_klass() ? 'Q' : 'L'; // Add the actual class name for (int src_index = 0; src_index < src_length; ) { dest[dest_index++] = src[src_index++]; } --- 2382,2392 ---- char* dest = NEW_RESOURCE_ARRAY(char, src_length + hash_len + 3); // Add L as type indicator int dest_index = 0; ! dest[dest_index++] = 'L'; // Add the actual class name for (int src_index = 0; src_index < src_length; ) { dest[dest_index++] = src[src_index++]; }
*** 3894,3994 **** #define THROW_DVT_ERROR(s) \ Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::java_lang_IncompatibleClassChangeError(), \ "ValueCapableClass class '%s' %s", external_name(),(s)); \ return - - void InstanceKlass::create_value_capable_class(Handle class_loader, Handle protection_domain, TRAPS) { - ResourceMark rm(THREAD); - HandleMark hm(THREAD); - - if (!EnableMVT) { - return; // Silent fail - } - // Validate VCC... - if (!has_nonstatic_fields()) { - THROW_DVT_ERROR("has no instance fields"); - } - if (is_value()) { - THROW_DVT_ERROR("is already a value type"); - } - if (!access_flags().is_final()) { - THROW_DVT_ERROR("is not a final class"); - } - if (super() != SystemDictionary::Object_klass()) { - THROW_DVT_ERROR("does not derive from Object only"); - } - - // All non-static are final - GrowableArray<Handle>* fields = new GrowableArray<Handle>(THREAD, java_fields_count()*2); - GrowableArray<jint>* fields_access = new GrowableArray<jint>(THREAD, java_fields_count()*2); - for (JavaFieldStream fs(this); !fs.done(); fs.next()) { - AccessFlags access_flags = fs.access_flags(); - if (access_flags.is_static()) { - continue; - } - if (!access_flags.is_final()) { - THROW_DVT_ERROR("contains non-final instance field"); - } - jint flags = access_flags.get_flags(); - // Remember the field name, signature, access modifiers - Handle h = java_lang_String::create_from_symbol(fs.name(), CHECK); - fields->append(h); - h = java_lang_String::create_from_symbol(fs.signature(), CHECK); - fields->append(h); - fields_access->append(access_flags.get_flags()); - } - - // Generate DVT... - log_debug(load)("Cooking DVT for VCC %s", external_name()); - const char* this_name = name()->as_C_string(); - - // Assemble the Java args...field descriptor array - objArrayOop fdarr_oop = oopFactory::new_objectArray(fields->length(), CHECK); - objArrayHandle fdarr(THREAD, fdarr_oop); - for (int i = 0; i < fields->length(); i++) { - fdarr->obj_at_put(i, fields->at(i)()); - } - //...field access modifiers array - typeArrayOop faarr_oop = oopFactory::new_intArray(fields_access->length(), CHECK); - typeArrayHandle faarr(THREAD, faarr_oop); - for (int i = 0; i < fields_access->length(); i++) { - faarr->int_at_put(i, fields_access->at(i)); - } - - Handle vcc_name_h = java_lang_String::create_from_symbol(name(), CHECK); - // Upcall to our Java helper... - JavaValue result(T_OBJECT); - JavaCallArguments args(5); - args.push_oop(vcc_name_h); - args.push_oop(class_loader); - args.push_oop(protection_domain); - args.push_oop(fdarr); - args.push_oop(faarr); - JavaCalls::call_static(&result, - SystemDictionary::Valhalla_MVT1_0_klass(), - vmSymbols::valhalla_shady_MVT1_0_createDerivedValueType(), - vmSymbols::valhalla_shady_MVT1_0_createDerivedValueType_signature(), - &args, - CHECK); - Handle returned(THREAD, (oop) result.get_jobject()); - if (returned.is_null()) { - THROW_DVT_ERROR("unknown error deriving value type"); - } - TempNewSymbol dvt_name_sym = java_lang_String::as_symbol(returned(), CHECK); - - Klass* dvt_klass = SystemDictionary::resolve_or_null(dvt_name_sym, - class_loader, - protection_domain, - CHECK); - if (!dvt_klass->is_value()) { - THROW_DVT_ERROR("failed to resolve derived value type"); - } - /** - * Found it, let's point to each other to denote "is_derive_vt()"... - */ - ValueKlass* vt_klass = ValueKlass::cast(dvt_klass); - assert(vt_klass->class_loader() == class_loader(), "DVT Not the same class loader as VCC"); - vt_klass->set_vcc_klass(this); - log_debug(load)("Cooked DVT %s for VCC %s", vt_klass->external_name(), external_name()); - } - --- 3885,3889 ----
< prev index next >