< prev index next >

src/hotspot/share/oops/instanceKlass.cpp

Print this page

        

@@ -151,11 +151,11 @@
                                        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.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,18 +256,19 @@
 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) {
+  _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_value_fields()) {
+    if (parser.has_flattenable_fields()) {
       set_has_value_fields();
     }
     _java_fields_count = parser.java_fields_count();
 
     assert(NULL == _methods, "underlying memory not zeroed?");

@@ -625,11 +626,11 @@
   // 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) {
+    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,15 +688,10 @@
     // 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;

@@ -800,15 +796,10 @@
 }
 
 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);

@@ -2391,11 +2382,11 @@
 
   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';
+  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,101 +3885,5 @@
 
 #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());
-}
-
< prev index next >