src/share/vm/ci/ciInstanceKlass.hpp

Tue, 11 Mar 2008 11:25:13 -0700

author
kvn
date
Tue, 11 Mar 2008 11:25:13 -0700
changeset 479
52fed2ec0afb
parent 435
a61af66fc99e
child 548
ba764ed4b6f2
permissions
-rw-r--r--

6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
Summary: Deoptimization code for reallocation and relocking scalar replaced objects has to be fixed.
Reviewed-by: rasbold, never

     1 /*
     2  * Copyright 1999-2007 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 // ciInstanceKlass
    26 //
    27 // This class represents a klassOop in the HotSpot virtual machine
    28 // whose Klass part is an instanceKlass.  It may or may not
    29 // be loaded.
    30 class ciInstanceKlass : public ciKlass {
    31   CI_PACKAGE_ACCESS
    32   friend class ciEnv;
    33   friend class ciMethod;
    34   friend class ciField;
    35   friend class ciBytecodeStream;
    37 private:
    38   bool                   _is_shared;
    40   jobject                _loader;
    41   jobject                _protection_domain;
    43   bool                   _is_initialized;
    44   bool                   _is_linked;
    45   bool                   _has_finalizer;
    46   bool                   _has_subklass;
    47   ciFlags                _flags;
    48   jint                   _nonstatic_field_size;
    49   jint                   _nonstatic_oop_map_size;
    51   // Lazy fields get filled in only upon request.
    52   ciInstanceKlass*       _super;
    53   ciInstance*            _java_mirror;
    55   ciConstantPoolCache*   _field_cache;  // cached map index->field
    56   GrowableArray<ciField*>* _nonstatic_fields;
    58   enum { implementors_limit = instanceKlass::implementors_limit };
    59   ciInstanceKlass*       _implementors[implementors_limit];
    60   jint                   _nof_implementors;
    62   GrowableArray<ciField*>* _non_static_fields;
    64 protected:
    65   ciInstanceKlass(KlassHandle h_k);
    66   ciInstanceKlass(ciSymbol* name, jobject loader, jobject protection_domain);
    68   instanceKlass* get_instanceKlass() const {
    69     return (instanceKlass*)get_Klass();
    70   }
    72   oop loader();
    73   jobject loader_handle();
    75   oop protection_domain();
    76   jobject protection_domain_handle();
    78   const char* type_string() { return "ciInstanceKlass"; }
    80   void print_impl(outputStream* st);
    82   ciConstantPoolCache* field_cache();
    84   bool is_shared() { return _is_shared; }
    86   bool compute_shared_is_initialized();
    87   bool compute_shared_is_linked();
    88   bool compute_shared_has_subklass();
    89   int  compute_shared_nof_implementors();
    90   int  compute_nonstatic_fields();
    91   GrowableArray<ciField*>* compute_nonstatic_fields_impl(GrowableArray<ciField*>* super_fields);
    93 public:
    94   // Has this klass been initialized?
    95   bool                   is_initialized() {
    96     if (_is_shared && !_is_initialized) {
    97       return is_loaded() && compute_shared_is_initialized();
    98     }
    99     return _is_initialized;
   100   }
   101   // Has this klass been linked?
   102   bool                   is_linked() {
   103     if (_is_shared && !_is_linked) {
   104       return is_loaded() && compute_shared_is_linked();
   105     }
   106     return _is_linked;
   107   }
   109   // General klass information.
   110   ciFlags                flags()          {
   111     assert(is_loaded(), "must be loaded");
   112     return _flags;
   113   }
   114   bool                   has_finalizer()  {
   115     assert(is_loaded(), "must be loaded");
   116     return _has_finalizer; }
   117   bool                   has_subklass()   {
   118     assert(is_loaded(), "must be loaded");
   119     if (_is_shared && !_has_subklass) {
   120       if (flags().is_final()) {
   121         return false;
   122       } else {
   123         return compute_shared_has_subklass();
   124       }
   125     }
   126     return _has_subklass;
   127   }
   128   jint                   size_helper()  {
   129     return (Klass::layout_helper_size_in_bytes(layout_helper())
   130             >> LogHeapWordSize);
   131   }
   132   jint                   nonstatic_field_size()  {
   133     assert(is_loaded(), "must be loaded");
   134     return _nonstatic_field_size; }
   135   jint                   nonstatic_oop_map_size()  {
   136     assert(is_loaded(), "must be loaded");
   137     return _nonstatic_oop_map_size; }
   138   ciInstanceKlass*       super();
   139   jint                   nof_implementors()  {
   140     assert(is_loaded(), "must be loaded");
   141     if (_is_shared)  return compute_shared_nof_implementors();
   142     return _nof_implementors;
   143   }
   145   ciInstanceKlass* get_canonical_holder(int offset);
   146   ciField* get_field_by_offset(int field_offset, bool is_static);
   148   GrowableArray<ciField*>* non_static_fields();
   150   // total number of nonstatic fields (including inherited):
   151   int nof_nonstatic_fields() {
   152     if (_nonstatic_fields == NULL)
   153       return compute_nonstatic_fields();
   154     else
   155       return _nonstatic_fields->length();
   156   }
   157   // nth nonstatic field (presented by ascending address)
   158   ciField* nonstatic_field_at(int i) {
   159     assert(_nonstatic_fields != NULL, "");
   160     return _nonstatic_fields->at(i);
   161   }
   163   ciInstanceKlass* unique_concrete_subklass();
   164   bool has_finalizable_subclass();
   166   bool contains_field_offset(int offset) {
   167       return (offset/wordSize) >= instanceOopDesc::header_size()
   168              && (offset/wordSize)-instanceOopDesc::header_size() < nonstatic_field_size();
   169   }
   171   // Get the instance of java.lang.Class corresponding to
   172   // this klass.  This instance is used for locking of
   173   // synchronized static methods of this klass.
   174   ciInstance*            java_mirror();
   176   // Java access flags
   177   bool is_public      () { return flags().is_public(); }
   178   bool is_final       () { return flags().is_final(); }
   179   bool is_super       () { return flags().is_super(); }
   180   bool is_interface   () { return flags().is_interface(); }
   181   bool is_abstract    () { return flags().is_abstract(); }
   183   ciMethod* find_method(ciSymbol* name, ciSymbol* signature);
   184   // Note:  To find a method from name and type strings, use ciSymbol::make,
   185   // but consider adding to vmSymbols.hpp instead.
   187   bool is_leaf_type();
   188   ciInstanceKlass* implementor(int n);
   190   // Is the defining class loader of this class the default loader?
   191   bool uses_default_loader();
   193   bool is_java_lang_Object();
   195   // What kind of ciObject is this?
   196   bool is_instance_klass() { return true; }
   197   bool is_java_klass()     { return true; }
   198 };

mercurial