diff src/share/vm/ci/ciObject.hpp @ 6725:da91efe96a93

6964458: Reimplement class meta-data storage to use native memory Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author coleenp
date Sat, 01 Sep 2012 13:25:18 -0400
parents 1d7922586cf6
children f6b0eb4e44cf
line wrap: on
line diff
--- a/src/share/vm/ci/ciObject.hpp	Fri Aug 31 16:39:35 2012 -0700
+++ b/src/share/vm/ci/ciObject.hpp	Sat Sep 01 13:25:18 2012 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,7 @@
 #ifndef SHARE_VM_CI_CIOBJECT_HPP
 #define SHARE_VM_CI_CIOBJECT_HPP
 
+#include "ci/ciBaseObject.hpp"
 #include "ci/ciClassList.hpp"
 #include "memory/allocation.hpp"
 #include "runtime/handles.hpp"
@@ -45,10 +46,10 @@
 //
 // Within the VM, the oop and klass hierarchies are separate.
 // The compiler interface does not preserve this separation --
-// the distinction between `klassOop' and `Klass' are not
+// the distinction between `Klass*' and `Klass' are not
 // reflected in the interface and instead the Klass hierarchy
 // is directly modeled as the subclasses of ciKlass.
-class ciObject : public ResourceObj {
+class ciObject : public ciBaseObject {
   CI_PACKAGE_ACCESS
   friend class ciEnv;
 
@@ -57,13 +58,7 @@
   // handle may, in a small set of cases, correctly be NULL.
   jobject  _handle;
   ciKlass* _klass;
-  uint     _ident;
 
-  enum { FLAG_BITS   = 2 };
-  enum {
-         PERM_FLAG        = 1,
-         SCAVENGABLE_FLAG = 2
-       };
 protected:
   ciObject();
   ciObject(oop o);
@@ -77,30 +72,17 @@
     return JNIHandles::resolve_non_null(_handle);
   }
 
-  void init_flags_from(oop x) {
-    int flags = 0;
-    if (x != NULL) {
-      if (x->is_perm())
-        flags |= PERM_FLAG;
-      if (x->is_scavengable())
-        flags |= SCAVENGABLE_FLAG;
-    }
-    _ident |= flags;
-  }
+  void init_flags_from(oop x);
 
   // Virtual behavior of the print() method.
   virtual void print_impl(outputStream* st) {}
 
   virtual const char* type_string() { return "ciObject"; }
 
-  void set_ident(uint id);
 public:
   // The klass of this ciObject.
   ciKlass* klass();
 
-  // A number unique to this object.
-  uint ident();
-
   // Are two ciObjects equal?
   bool equals(ciObject* obj);
 
@@ -119,11 +101,6 @@
   // True if is_perm is true or ScavengeRootsInCode > 1.
   bool should_be_constant();
 
-  // Is this object guaranteed to be in the permanent part of the heap?
-  // If so, CollectedHeap::can_elide_permanent_oop_store_barriers is relevant.
-  // If the answer is false, no guarantees are made.
-  bool is_perm() { return (_ident & PERM_FLAG) != 0; }
-
   // Might this object possibly move during a scavenge operation?
   // If the answer is true and ScavengeRootsInCode==0, the oop cannot be embedded in code.
   bool is_scavengable() { return (_ident & SCAVENGABLE_FLAG) != 0; }
@@ -137,57 +114,29 @@
   // be registered with the oopRecorder.
   jobject constant_encoding();
 
+  virtual bool is_object() const            { return true; }
+
   // What kind of ciObject is this?
   virtual bool is_null_object()       const { return false; }
   virtual bool is_call_site()         const { return false; }
   virtual bool is_cpcache()           const { return false; }
   virtual bool is_instance()                { return false; }
   virtual bool is_member_name()       const { return false; }
-  virtual bool is_method()                  { return false; }
-  virtual bool is_method_data()             { return false; }
   virtual bool is_method_handle()     const { return false; }
   virtual bool is_array()                   { return false; }
   virtual bool is_obj_array()               { return false; }
   virtual bool is_type_array()              { return false; }
-  virtual bool is_symbol()                  { return false; }
-  virtual bool is_type()                    { return false; }
-  virtual bool is_return_address()          { return false; }
-  virtual bool is_klass()                   { return false; }
-  virtual bool is_instance_klass()          { return false; }
-  virtual bool is_method_klass()            { return false; }
-  virtual bool is_array_klass()             { return false; }
-  virtual bool is_obj_array_klass()         { return false; }
-  virtual bool is_type_array_klass()        { return false; }
-  virtual bool is_symbol_klass()            { return false; }
-  virtual bool is_klass_klass()             { return false; }
-  virtual bool is_instance_klass_klass()    { return false; }
-  virtual bool is_array_klass_klass()       { return false; }
-  virtual bool is_obj_array_klass_klass()   { return false; }
-  virtual bool is_type_array_klass_klass()  { return false; }
 
   // Is this a type or value which has no associated class?
   // It is true of primitive types and null objects.
   virtual bool is_classless() const         { return false; }
 
-  // Is this ciObject a Java Language Object?  That is,
-  // is the ciObject an instance or an array
-  virtual bool is_java_object()             { return false; }
-
-  // Does this ciObject represent a Java Language class?
-  // That is, is the ciObject an instanceKlass or arrayKlass?
-  virtual bool is_java_klass()              { return false; }
-
-  // Is this ciObject the ciInstanceKlass representing
-  // java.lang.Object()?
-  virtual bool is_java_lang_Object()        { return false; }
-
-  // Does this ciObject refer to a real oop in the VM?
-  //
-  // Note: some ciObjects refer to oops which have yet to be
-  // created.  We refer to these as "unloaded".  Specifically,
-  // there are unloaded ciMethods, ciObjArrayKlasses, and
-  // ciInstanceKlasses.  By convention the ciNullObject is
-  // considered loaded, and primitive types are considered loaded.
+  // Note: some ciObjects refer to oops which have yet to be created.
+  // We refer to these as "unloaded".  Specifically, there are
+  // unloaded instances of java.lang.Class,
+  // java.lang.invoke.MethodHandle, and java.lang.invoke.MethodType.
+  // By convention the ciNullObject is considered loaded, and
+  // primitive types are considered loaded.
   bool is_loaded() const {
     return handle() != NULL || is_classless();
   }
@@ -201,10 +150,6 @@
     assert(is_call_site(), "bad cast");
     return (ciCallSite*) this;
   }
-  ciCPCache*               as_cpcache() {
-    assert(is_cpcache(), "bad cast");
-    return (ciCPCache*) this;
-  }
   ciInstance*              as_instance() {
     assert(is_instance(), "bad cast");
     return (ciInstance*)this;
@@ -213,14 +158,6 @@
     assert(is_member_name(), "bad cast");
     return (ciMemberName*)this;
   }
-  ciMethod*                as_method() {
-    assert(is_method(), "bad cast");
-    return (ciMethod*)this;
-  }
-  ciMethodData*            as_method_data() {
-    assert(is_method_data(), "bad cast");
-    return (ciMethodData*)this;
-  }
   ciMethodHandle*          as_method_handle() {
     assert(is_method_handle(), "bad cast");
     return (ciMethodHandle*) this;
@@ -237,62 +174,6 @@
     assert(is_type_array(), "bad cast");
     return (ciTypeArray*)this;
   }
-  ciSymbol*                as_symbol() {
-    assert(is_symbol(), "bad cast");
-    return (ciSymbol*)this;
-  }
-  ciType*                  as_type() {
-    assert(is_type(), "bad cast");
-    return (ciType*)this;
-  }
-  ciReturnAddress*         as_return_address() {
-    assert(is_return_address(), "bad cast");
-    return (ciReturnAddress*)this;
-  }
-  ciKlass*                 as_klass() {
-    assert(is_klass(), "bad cast");
-    return (ciKlass*)this;
-  }
-  ciInstanceKlass*         as_instance_klass() {
-    assert(is_instance_klass(), "bad cast");
-    return (ciInstanceKlass*)this;
-  }
-  ciMethodKlass*           as_method_klass() {
-    assert(is_method_klass(), "bad cast");
-    return (ciMethodKlass*)this;
-  }
-  ciArrayKlass*            as_array_klass() {
-    assert(is_array_klass(), "bad cast");
-    return (ciArrayKlass*)this;
-  }
-  ciObjArrayKlass*         as_obj_array_klass() {
-    assert(is_obj_array_klass(), "bad cast");
-    return (ciObjArrayKlass*)this;
-  }
-  ciTypeArrayKlass*        as_type_array_klass() {
-    assert(is_type_array_klass(), "bad cast");
-    return (ciTypeArrayKlass*)this;
-  }
-  ciKlassKlass*            as_klass_klass() {
-    assert(is_klass_klass(), "bad cast");
-    return (ciKlassKlass*)this;
-  }
-  ciInstanceKlassKlass*    as_instance_klass_klass() {
-    assert(is_instance_klass_klass(), "bad cast");
-    return (ciInstanceKlassKlass*)this;
-  }
-  ciArrayKlassKlass*       as_array_klass_klass() {
-    assert(is_array_klass_klass(), "bad cast");
-    return (ciArrayKlassKlass*)this;
-  }
-  ciObjArrayKlassKlass*    as_obj_array_klass_klass() {
-    assert(is_obj_array_klass_klass(), "bad cast");
-    return (ciObjArrayKlassKlass*)this;
-  }
-  ciTypeArrayKlassKlass*   as_type_array_klass_klass() {
-    assert(is_type_array_klass_klass(), "bad cast");
-    return (ciTypeArrayKlassKlass*)this;
-  }
 
   // Print debugging output about this ciObject.
   void print(outputStream* st);