hotspot/src/share/vm/oops/instanceKlass.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 14385 959bbcc16725
child 14490 5bb45ed999ee
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
12114
9a825a536095 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 11407
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    26
#include "classfile/javaClasses.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    27
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    28
#include "classfile/verifier.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    29
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    30
#include "compiler/compileBroker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    31
#include "gc_implementation/shared/markSweep.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    32
#include "gc_interface/collectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    33
#include "interpreter/oopMapCache.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    34
#include "interpreter/rewriter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    35
#include "jvmtifiles/jvmti.h"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    36
#include "memory/genOopClosures.inline.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    37
#include "memory/metadataFactory.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    38
#include "memory/oopFactory.hpp"
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
    39
#include "oops/fieldStreams.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    40
#include "oops/instanceClassLoaderKlass.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    41
#include "oops/instanceKlass.hpp"
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
    42
#include "oops/instanceMirrorKlass.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    43
#include "oops/instanceOop.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    44
#include "oops/klass.inline.hpp"
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    45
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    46
#include "oops/oop.inline.hpp"
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    47
#include "oops/symbol.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    48
#include "prims/jvmtiExport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    49
#include "prims/jvmtiRedefineClassesTrace.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    50
#include "runtime/fieldDescriptor.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    51
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    52
#include "runtime/javaCalls.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    53
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    54
#include "services/threadService.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    55
#include "utilities/dtrace.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    56
#ifdef TARGET_OS_FAMILY_linux
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    57
# include "thread_linux.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    58
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    59
#ifdef TARGET_OS_FAMILY_solaris
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    60
# include "thread_solaris.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    61
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    62
#ifdef TARGET_OS_FAMILY_windows
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    63
# include "thread_windows.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    64
#endif
10565
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10547
diff changeset
    65
#ifdef TARGET_OS_FAMILY_bsd
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10547
diff changeset
    66
# include "thread_bsd.inline.hpp"
dc90c239f4ec 7089790: integrate bsd-port changes
never
parents: 10547
diff changeset
    67
#endif
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    68
#ifndef SERIALGC
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    69
#include "gc_implementation/concurrentMarkSweep/cmsOopClosures.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    70
#include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    71
#include "gc_implementation/g1/g1OopClosures.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    72
#include "gc_implementation/g1/g1RemSet.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    73
#include "gc_implementation/g1/heapRegionSeq.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    74
#include "gc_implementation/parNew/parOopClosures.inline.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    75
#include "gc_implementation/parallelScavenge/parallelScavengeHeap.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    76
#include "gc_implementation/parallelScavenge/psPromotionManager.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    77
#include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    78
#include "oops/oop.pcgc.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    79
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    80
#ifdef COMPILER1
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    81
#include "c1/c1_Compiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    82
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    84
#ifdef DTRACE_ENABLED
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    85
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
    86
#ifndef USDT2
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
    87
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    88
HS_DTRACE_PROBE_DECL4(hotspot, class__initialization__required,
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    89
  char*, intptr_t, oop, intptr_t);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    90
HS_DTRACE_PROBE_DECL5(hotspot, class__initialization__recursive,
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    91
  char*, intptr_t, oop, intptr_t, int);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    92
HS_DTRACE_PROBE_DECL5(hotspot, class__initialization__concurrent,
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    93
  char*, intptr_t, oop, intptr_t, int);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    94
HS_DTRACE_PROBE_DECL5(hotspot, class__initialization__erroneous,
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    95
  char*, intptr_t, oop, intptr_t, int);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    96
HS_DTRACE_PROBE_DECL5(hotspot, class__initialization__super__failed,
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    97
  char*, intptr_t, oop, intptr_t, int);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    98
HS_DTRACE_PROBE_DECL5(hotspot, class__initialization__clinit,
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
    99
  char*, intptr_t, oop, intptr_t, int);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   100
HS_DTRACE_PROBE_DECL5(hotspot, class__initialization__error,
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   101
  char*, intptr_t, oop, intptr_t, int);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   102
HS_DTRACE_PROBE_DECL5(hotspot, class__initialization__end,
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   103
  char*, intptr_t, oop, intptr_t, int);
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   104
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   105
#define DTRACE_CLASSINIT_PROBE(type, clss, thread_type)          \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   106
  {                                                              \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   107
    char* data = NULL;                                           \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   108
    int len = 0;                                                 \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   109
    Symbol* name = (clss)->name();                               \
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   110
    if (name != NULL) {                                          \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   111
      data = (char*)name->bytes();                               \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   112
      len = name->utf8_length();                                 \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   113
    }                                                            \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   114
    HS_DTRACE_PROBE4(hotspot, class__initialization__##type,     \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   115
      data, len, (clss)->class_loader(), thread_type);           \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   116
  }
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   117
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   118
#define DTRACE_CLASSINIT_PROBE_WAIT(type, clss, thread_type, wait) \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   119
  {                                                              \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   120
    char* data = NULL;                                           \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   121
    int len = 0;                                                 \
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   122
    Symbol* name = (clss)->name();                               \
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   123
    if (name != NULL) {                                          \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   124
      data = (char*)name->bytes();                               \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   125
      len = name->utf8_length();                                 \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   126
    }                                                            \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   127
    HS_DTRACE_PROBE5(hotspot, class__initialization__##type,     \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   128
      data, len, (clss)->class_loader(), thread_type, wait);     \
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   129
  }
10739
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   130
#else /* USDT2 */
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   131
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   132
#define HOTSPOT_CLASS_INITIALIZATION_required HOTSPOT_CLASS_INITIALIZATION_REQUIRED
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   133
#define HOTSPOT_CLASS_INITIALIZATION_recursive HOTSPOT_CLASS_INITIALIZATION_RECURSIVE
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   134
#define HOTSPOT_CLASS_INITIALIZATION_concurrent HOTSPOT_CLASS_INITIALIZATION_CONCURRENT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   135
#define HOTSPOT_CLASS_INITIALIZATION_erroneous HOTSPOT_CLASS_INITIALIZATION_ERRONEOUS
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   136
#define HOTSPOT_CLASS_INITIALIZATION_super__failed HOTSPOT_CLASS_INITIALIZATION_SUPER_FAILED
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   137
#define HOTSPOT_CLASS_INITIALIZATION_clinit HOTSPOT_CLASS_INITIALIZATION_CLINIT
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   138
#define HOTSPOT_CLASS_INITIALIZATION_error HOTSPOT_CLASS_INITIALIZATION_ERROR
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   139
#define HOTSPOT_CLASS_INITIALIZATION_end HOTSPOT_CLASS_INITIALIZATION_END
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   140
#define DTRACE_CLASSINIT_PROBE(type, clss, thread_type)          \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   141
  {                                                              \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   142
    char* data = NULL;                                           \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   143
    int len = 0;                                                 \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   144
    Symbol* name = (clss)->name();                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   145
    if (name != NULL) {                                          \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   146
      data = (char*)name->bytes();                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   147
      len = name->utf8_length();                                 \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   148
    }                                                            \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   149
    HOTSPOT_CLASS_INITIALIZATION_##type(                         \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   150
      data, len, (clss)->class_loader(), thread_type);           \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   151
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   152
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   153
#define DTRACE_CLASSINIT_PROBE_WAIT(type, clss, thread_type, wait) \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   154
  {                                                              \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   155
    char* data = NULL;                                           \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   156
    int len = 0;                                                 \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   157
    Symbol* name = (clss)->name();                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   158
    if (name != NULL) {                                          \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   159
      data = (char*)name->bytes();                               \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   160
      len = name->utf8_length();                                 \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   161
    }                                                            \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   162
    HOTSPOT_CLASS_INITIALIZATION_##type(                         \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   163
      data, len, (clss)->class_loader(), thread_type, wait);     \
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   164
  }
91935236600e 7098194: integrate macosx-port changes
dcubed
parents: 10565
diff changeset
   165
#endif /* USDT2 */
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   166
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   167
#else //  ndef DTRACE_ENABLED
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   168
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   169
#define DTRACE_CLASSINIT_PROBE(type, clss, thread_type)
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   170
#define DTRACE_CLASSINIT_PROBE_WAIT(type, clss, thread_type, wait)
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   171
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   172
#endif //  ndef DTRACE_ENABLED
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   173
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   174
Klass* InstanceKlass::allocate_instance_klass(ClassLoaderData* loader_data,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   175
                                                int vtable_len,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   176
                                                int itable_len,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   177
                                                int static_field_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   178
                                                int nonstatic_oop_map_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   179
                                                ReferenceType rt,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   180
                                                AccessFlags access_flags,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   181
                                                Symbol* name,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   182
                                              Klass* super_klass,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   183
                                                KlassHandle host_klass,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   184
                                                TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   185
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   186
  int size = InstanceKlass::size(vtable_len, itable_len, nonstatic_oop_map_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   187
                                 access_flags.is_interface(),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   188
                                 !host_klass.is_null());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   189
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   190
  // Allocation
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   191
  InstanceKlass* ik;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   192
  if (rt == REF_NONE) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   193
    if (name == vmSymbols::java_lang_Class()) {
13738
d67be49a5beb 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 13736
diff changeset
   194
      ik = new (loader_data, size, THREAD) InstanceMirrorKlass(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   195
        vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   196
        access_flags, !host_klass.is_null());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   197
    } else if (name == vmSymbols::java_lang_ClassLoader() ||
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   198
          (SystemDictionary::ClassLoader_klass_loaded() &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   199
          super_klass != NULL &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   200
          super_klass->is_subtype_of(SystemDictionary::ClassLoader_klass()))) {
13738
d67be49a5beb 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 13736
diff changeset
   201
      ik = new (loader_data, size, THREAD) InstanceClassLoaderKlass(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   202
        vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   203
        access_flags, !host_klass.is_null());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   204
    } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   205
      // normal class
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   206
      ik = new (loader_data, size, THREAD) InstanceKlass(
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   207
        vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   208
        access_flags, !host_klass.is_null());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   209
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   210
  } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   211
    // reference klass
13738
d67be49a5beb 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 13736
diff changeset
   212
    ik = new (loader_data, size, THREAD) InstanceRefKlass(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   213
        vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   214
        access_flags, !host_klass.is_null());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   215
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   216
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   217
  return ik;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   218
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   219
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   220
InstanceKlass::InstanceKlass(int vtable_len,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   221
                             int itable_len,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   222
                             int static_field_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   223
                             int nonstatic_oop_map_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   224
                             ReferenceType rt,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   225
                             AccessFlags access_flags,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   226
                             bool is_anonymous) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   227
  No_Safepoint_Verifier no_safepoint; // until k becomes parsable
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   228
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   229
  int size = InstanceKlass::size(vtable_len, itable_len, nonstatic_oop_map_size,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   230
                                 access_flags.is_interface(), is_anonymous);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   231
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   232
  // The sizes of these these three variables are used for determining the
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   233
  // size of the instanceKlassOop. It is critical that these are set to the right
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   234
  // sizes before the first GC, i.e., when we allocate the mirror.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   235
  this->set_vtable_length(vtable_len);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   236
  this->set_itable_length(itable_len);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   237
  this->set_static_field_size(static_field_size);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   238
  this->set_nonstatic_oop_map_size(nonstatic_oop_map_size);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   239
  this->set_access_flags(access_flags);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   240
  this->set_is_anonymous(is_anonymous);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   241
  assert(this->size() == size, "wrong size for object");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   242
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   243
  this->set_array_klasses(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   244
  this->set_methods(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   245
  this->set_method_ordering(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   246
  this->set_local_interfaces(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   247
  this->set_transitive_interfaces(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   248
  this->init_implementor();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   249
  this->set_fields(NULL, 0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   250
  this->set_constants(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   251
  this->set_class_loader_data(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   252
  this->set_protection_domain(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   253
  this->set_signers(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   254
  this->set_source_file_name(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   255
  this->set_source_debug_extension(NULL, 0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   256
  this->set_array_name(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   257
  this->set_inner_classes(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   258
  this->set_static_oop_field_count(0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   259
  this->set_nonstatic_field_size(0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   260
  this->set_is_marked_dependent(false);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   261
  this->set_init_state(InstanceKlass::allocated);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   262
  this->set_init_thread(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   263
  this->set_init_lock(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   264
  this->set_reference_type(rt);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   265
  this->set_oop_map_cache(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   266
  this->set_jni_ids(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   267
  this->set_osr_nmethods_head(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   268
  this->set_breakpoints(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   269
  this->init_previous_versions();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   270
  this->set_generic_signature(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   271
  this->release_set_methods_jmethod_ids(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   272
  this->release_set_methods_cached_itable_indices(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   273
  this->set_annotations(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   274
  this->set_jvmti_cached_class_field_map(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   275
  this->set_initial_method_idnum(0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   276
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   277
  // initialize the non-header words to zero
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   278
  intptr_t* p = (intptr_t*)this;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   279
  for (int index = InstanceKlass::header_size(); index < size; index++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   280
    p[index] = NULL_WORD;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   281
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   282
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   283
  // Set temporary value until parseClassFile updates it with the real instance
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   284
  // size.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   285
  this->set_layout_helper(Klass::instance_layout_helper(0, true));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   286
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   287
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   288
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   289
// This function deallocates the metadata and C heap pointers that the
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   290
// InstanceKlass points to.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   291
void InstanceKlass::deallocate_contents(ClassLoaderData* loader_data) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   292
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   293
  // Orphan the mirror first, CMS thinks it's still live.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   294
  java_lang_Class::set_klass(java_mirror(), NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   295
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   296
  // Need to take this class off the class loader data list.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   297
  loader_data->remove_class(this);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   298
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   299
  // The array_klass for this class is created later, after error handling.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   300
  // For class redefinition, we keep the original class so this scratch class
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   301
  // doesn't have an array class.  Either way, assert that there is nothing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   302
  // to deallocate.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   303
  assert(array_klasses() == NULL, "array classes shouldn't be created for this class yet");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   304
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   305
  // Release C heap allocated data that this might point to, which includes
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   306
  // reference counting symbol names.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   307
  release_C_heap_structures();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   308
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   309
  Array<Method*>* ms = methods();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   310
  if (ms != Universe::the_empty_method_array()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   311
    for (int i = 0; i <= methods()->length() -1 ; i++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   312
      Method* method = methods()->at(i);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   313
      // Only want to delete methods that are not executing for RedefineClasses.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   314
      // The previous version will point to them so they're not totally dangling
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   315
      assert (!method->on_stack(), "shouldn't be called with methods on stack");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   316
      MetadataFactory::free_metadata(loader_data, method);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   317
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   318
    MetadataFactory::free_array<Method*>(loader_data, methods());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   319
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   320
  set_methods(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   321
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   322
  if (method_ordering() != Universe::the_empty_int_array()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   323
    MetadataFactory::free_array<int>(loader_data, method_ordering());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   324
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   325
  set_method_ordering(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   326
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   327
  // This array is in Klass, but remove it with the InstanceKlass since
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   328
  // this place would be the only caller and it can share memory with transitive
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   329
  // interfaces.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   330
  if (secondary_supers() != Universe::the_empty_klass_array() &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   331
      secondary_supers() != transitive_interfaces()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   332
    MetadataFactory::free_array<Klass*>(loader_data, secondary_supers());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   333
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   334
  set_secondary_supers(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   335
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   336
  // Only deallocate transitive interfaces if not empty, same as super class
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   337
  // or same as local interfaces.   See code in parseClassFile.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   338
  Array<Klass*>* ti = transitive_interfaces();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   339
  if (ti != Universe::the_empty_klass_array() && ti != local_interfaces()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   340
    // check that the interfaces don't come from super class
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   341
    Array<Klass*>* sti = (super() == NULL) ? NULL :
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   342
       InstanceKlass::cast(super())->transitive_interfaces();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   343
    if (ti != sti) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   344
      MetadataFactory::free_array<Klass*>(loader_data, ti);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   345
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   346
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   347
  set_transitive_interfaces(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   348
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   349
  // local interfaces can be empty
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   350
  Array<Klass*>* li = local_interfaces();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   351
  if (li != Universe::the_empty_klass_array()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   352
    MetadataFactory::free_array<Klass*>(loader_data, li);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   353
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   354
  set_local_interfaces(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   355
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   356
  MetadataFactory::free_array<jushort>(loader_data, fields());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   357
  set_fields(NULL, 0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   358
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   359
  // If a method from a redefined class is using this constant pool, don't
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   360
  // delete it, yet.  The new class's previous version will point to this.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   361
  assert (!constants()->on_stack(), "shouldn't be called if anything is onstack");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   362
  MetadataFactory::free_metadata(loader_data, constants());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   363
  set_constants(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   364
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   365
  if (inner_classes() != Universe::the_empty_short_array()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   366
    MetadataFactory::free_array<jushort>(loader_data, inner_classes());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   367
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   368
  set_inner_classes(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   369
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   370
  // Null out Java heap objects, although these won't be walked to keep
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   371
  // alive once this InstanceKlass is deallocated.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   372
  set_protection_domain(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   373
  set_signers(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   374
  set_init_lock(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   375
  set_annotations(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   376
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   377
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   378
volatile oop InstanceKlass::init_lock() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   379
  volatile oop lock = _init_lock;  // read once
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   380
  assert((oop)lock != NULL || !is_not_initialized(), // initialized or in_error state
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   381
         "only fully initialized state can have a null lock");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   382
  return lock;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   383
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   384
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   385
// Set the initialization lock to null so the object can be GC'ed.  Any racing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   386
// threads to get this lock will see a null lock and will not lock.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   387
// That's okay because they all check for initialized state after getting
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   388
// the lock and return.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   389
void InstanceKlass::fence_and_clear_init_lock() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   390
  // make sure previous stores are all done, notably the init_state.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   391
  OrderAccess::storestore();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   392
  klass_oop_store(&_init_lock, NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   393
  assert(!is_not_initialized(), "class must be initialized now");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   394
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   395
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   396
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   397
bool InstanceKlass::should_be_initialized() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
  return !is_initialized();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   401
klassVtable* InstanceKlass::vtable() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   402
  return new klassVtable(this, start_of_vtable(), vtable_length() / vtableEntry::size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   405
klassItable* InstanceKlass::itable() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   406
  return new klassItable(instanceKlassHandle(this));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   409
void InstanceKlass::eager_initialize(Thread *thread) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
  if (!EagerInitialization) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
  if (this->is_not_initialized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    // abort if the the class has a class initializer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
    if (this->class_initializer() != NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
    // abort if it is java.lang.Object (initialization is handled in genesis)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   417
    Klass* super = this->super();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
    if (super == NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
    // abort if the super class should be initialized
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   421
    if (!InstanceKlass::cast(super)->is_initialized()) return;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
    // call body to expose the this pointer
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   424
    instanceKlassHandle this_oop(thread, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
    eager_initialize_impl(this_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   430
void InstanceKlass::eager_initialize_impl(instanceKlassHandle this_oop) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  EXCEPTION_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   432
  volatile oop init_lock = this_oop->init_lock();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   433
  ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // abort if someone beat us to the initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  if (!this_oop->is_not_initialized()) return;  // note: not equivalent to is_initialized()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
11407
5399831730cd 7117052: instanceKlass::_init_state can be u1 type
coleenp
parents: 10739
diff changeset
   438
  ClassState old_state = this_oop->init_state();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  link_class_impl(this_oop, true, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    // Abort if linking the class throws an exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    // Use a test to avoid redundantly resetting the state if there's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
    // no change.  Set_init_state() asserts that state changes make
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
    // progress, whereas here we might just be spinning in place.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
    if( old_state != this_oop->_init_state )
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
      this_oop->set_init_state (old_state);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
    // linking successfull, mark class as initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
    this_oop->set_init_state (fully_initialized);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   452
    this_oop->fence_and_clear_init_lock();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
    // trace
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
    if (TraceClassInitialization) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
      ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
      tty->print_cr("[Initialized %s without side effects]", this_oop->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
// See "The Virtual Machine Specification" section 2.16.5 for a detailed explanation of the class initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
// process. The step comments refers to the procedure described in that section.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
// Note: implementation moved to static method to expose the this pointer.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   465
void InstanceKlass::initialize(TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  if (this->should_be_initialized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
    HandleMark hm(THREAD);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   468
    instanceKlassHandle this_oop(THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
    initialize_impl(this_oop, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    // Note: at this point the class may be initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
    //       OR it may be in the state of being initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    //       in case of recursive initialization!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
    assert(is_initialized(), "sanity check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   479
bool InstanceKlass::verify_code(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
    instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  // 1) Verify the bytecodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  Verifier::Mode mode =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    throw_verifyerror ? Verifier::ThrowException : Verifier::NoException;
3820
0a8fbbe180db 6830542: Performance: JVM_DefineClass already verified.
acorn
parents: 3811
diff changeset
   484
  return Verifier::verify(this_oop, mode, this_oop->should_verify_class(), CHECK_false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
// Used exclusively by the shared spaces dump mechanism to prevent
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
// classes mapped into the shared regions in new VMs from appearing linked.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   491
void InstanceKlass::unlink_class() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  assert(is_linked(), "must be linked");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  _init_state = loaded;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   496
void InstanceKlass::link_class(TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  assert(is_loaded(), "must be loaded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  if (!is_linked()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   499
    HandleMark hm(THREAD);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   500
    instanceKlassHandle this_oop(THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    link_class_impl(this_oop, true, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
// Called to verify that a class can link during initialization, without
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
// throwing a VerifyError.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   507
bool InstanceKlass::link_class_or_fail(TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  assert(is_loaded(), "must be loaded");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  if (!is_linked()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   510
    HandleMark hm(THREAD);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   511
    instanceKlassHandle this_oop(THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    link_class_impl(this_oop, false, CHECK_false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
  return is_linked();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   517
bool InstanceKlass::link_class_impl(
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
    instanceKlassHandle this_oop, bool throw_verifyerror, TRAPS) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
  // check for error state
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
  if (this_oop->is_in_error_state()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
    THROW_MSG_(vmSymbols::java_lang_NoClassDefFoundError(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
               this_oop->external_name(), false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
  // return if already verified
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
  if (this_oop->is_linked()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  // Timing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  // timer handles recursion
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  assert(THREAD->is_Java_thread(), "non-JavaThread in link_class_impl");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
  JavaThread* jt = (JavaThread*)THREAD;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
  // link super class before linking this class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
  instanceKlassHandle super(THREAD, this_oop->super());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  if (super.not_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
    if (super->is_interface()) {  // check if super class is an interface
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
      ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
      Exceptions::fthrow(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
        THREAD_AND_LOCATION,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   542
        vmSymbols::java_lang_IncompatibleClassChangeError(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
        "class %s has interface %s as super class",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
        this_oop->external_name(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
        super->external_name()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
      );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
    link_class_impl(super, throw_verifyerror, CHECK_false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  // link all interfaces implemented by this class before linking this class
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   554
  Array<Klass*>* interfaces = this_oop->local_interfaces();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  int num_interfaces = interfaces->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  for (int index = 0; index < num_interfaces; index++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
    HandleMark hm(THREAD);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   558
    instanceKlassHandle ih(THREAD, interfaces->at(index));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
    link_class_impl(ih, throw_verifyerror, CHECK_false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  // in case the class is linked in the process of linking its superclasses
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  if (this_oop->is_linked()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
3575
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   567
  // trace only the link time for this klass that includes
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   568
  // the verification time
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   569
  PerfClassTraceTime vmtimer(ClassLoader::perf_class_link_time(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   570
                             ClassLoader::perf_class_link_selftime(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   571
                             ClassLoader::perf_classes_linked(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   572
                             jt->get_thread_stat()->perf_recursion_counts_addr(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   573
                             jt->get_thread_stat()->perf_timers_addr(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   574
                             PerfClassTraceTime::CLASS_LINK);
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   575
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  // verification & rewriting
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   578
    volatile oop init_lock = this_oop->init_lock();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   579
    ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    // rewritten will have been set if loader constraint error found
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    // on an earlier link attempt
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    // don't verify or rewrite if already rewritten
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   583
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
    if (!this_oop->is_linked()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
      if (!this_oop->is_rewritten()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
        {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
          // Timer includes any side effects of class verification (resolution,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
          // etc), but not recursive entry into verify_code().
3575
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   589
          PerfClassTraceTime timer(ClassLoader::perf_class_verify_time(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   590
                                   ClassLoader::perf_class_verify_selftime(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   591
                                   ClassLoader::perf_classes_verified(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   592
                                   jt->get_thread_stat()->perf_recursion_counts_addr(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   593
                                   jt->get_thread_stat()->perf_timers_addr(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   594
                                   PerfClassTraceTime::CLASS_VERIFY);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
          bool verify_ok = verify_code(this_oop, throw_verifyerror, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
          if (!verify_ok) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
            return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
        // Just in case a side-effect of verify linked this class already
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
        // (which can sometimes happen since the verifier loads classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
        // using custom class loaders, which are free to initialize things)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
        if (this_oop->is_linked()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
          return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
        // also sets rewritten
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
        this_oop->rewrite_class(CHECK_false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
9971
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   612
      // relocate jsrs and link methods after they are all rewritten
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   613
      this_oop->relocate_and_link_methods(CHECK_false);
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   614
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
      // Initialize the vtable and interface table after
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
      // methods have been rewritten since rewrite may
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   617
      // fabricate new Method*s.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
      // also does loader constraint checking
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
      if (!this_oop()->is_shared()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
        ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
        this_oop->vtable()->initialize_vtable(true, CHECK_false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
        this_oop->itable()->initialize_itable(true, CHECK_false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
      else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
        ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
        this_oop->vtable()->verify(tty, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
        // In case itable verification is ever added.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
        // this_oop->itable()->verify(tty, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
      this_oop->set_init_state(linked);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
      if (JvmtiExport::should_post_class_prepare()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
        Thread *thread = THREAD;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
        assert(thread->is_Java_thread(), "thread->is_Java_thread()");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
        JvmtiExport::post_class_prepare((JavaThread *) thread, this_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
// Rewrite the byte codes of all of the methods of a class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
// The rewriter must be called exactly once. Rewriting must happen after
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
// verification but before the first method of the class is executed.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   647
void InstanceKlass::rewrite_class(TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  assert(is_loaded(), "must be loaded");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   649
  instanceKlassHandle this_oop(THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  if (this_oop->is_rewritten()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
    assert(this_oop()->is_shared(), "rewriting an unshared class?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
  }
9971
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   654
  Rewriter::rewrite(this_oop, CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  this_oop->set_rewritten();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
9971
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   658
// Now relocate and link method entry points after class is rewritten.
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   659
// This is outside is_rewritten flag. In case of an exception, it can be
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   660
// executed more than once.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   661
void InstanceKlass::relocate_and_link_methods(TRAPS) {
9971
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   662
  assert(is_loaded(), "must be loaded");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   663
  instanceKlassHandle this_oop(THREAD, this);
9971
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   664
  Rewriter::relocate_and_link(this_oop, CHECK);
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   665
}
d496ecd7b9de 7033141: assert(has_cp_cache(i)) failed: oob
coleenp
parents: 8875
diff changeset
   666
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   668
void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  // Make sure klass is linked (verified) before initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  // A class could already be verified, since it has been reflected upon.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
  this_oop->link_class(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   673
  DTRACE_CLASSINIT_PROBE(required, InstanceKlass::cast(this_oop()), -1);
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   674
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   675
  bool wait = false;
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   676
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
  // refer to the JVM book page 47 for description of steps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
  // Step 1
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   679
  {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   680
    volatile oop init_lock = this_oop->init_lock();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   681
    ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
    Thread *self = THREAD; // it's passed the current thread
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
    // Step 2
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
    // If we were to use wait() instead of waitInterruptibly() then
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
    // we might end up throwing IE from link/symbol resolution sites
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
    // that aren't expected to throw.  This would wreak havoc.  See 6320309.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
    while(this_oop->is_being_initialized() && !this_oop->is_reentrant_initialization(self)) {
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   690
        wait = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
      ol.waitUninterruptibly(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
    // Step 3
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   695
    if (this_oop->is_being_initialized() && this_oop->is_reentrant_initialization(self)) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   696
      DTRACE_CLASSINIT_PROBE_WAIT(recursive, InstanceKlass::cast(this_oop()), -1,wait);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
      return;
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   698
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
    // Step 4
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   701
    if (this_oop->is_initialized()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   702
      DTRACE_CLASSINIT_PROBE_WAIT(concurrent, InstanceKlass::cast(this_oop()), -1,wait);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
      return;
5089
0cce506a0158 6935224: Adding new DTrace probes to work with Palantir
fparain
parents: 4584
diff changeset
   704
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
    // Step 5
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
    if (this_oop->is_in_error_state()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   708
      DTRACE_CLASSINIT_PROBE_WAIT(erroneous, InstanceKlass::cast(this_oop()), -1,wait);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
      ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
      const char* desc = "Could not initialize class ";
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
      const char* className = this_oop->external_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
      size_t msglen = strlen(desc) + strlen(className) + 1;
6421
7c02a5af38e7 6980262: Memory leak when exception is thrown in static initializer
kamg
parents: 6248
diff changeset
   713
      char* message = NEW_RESOURCE_ARRAY(char, msglen);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
      if (NULL == message) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
        // Out of memory: can't create detailed error message
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
        THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), className);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
      } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
        jio_snprintf(message, msglen, "%s%s", desc, className);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
        THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
    // Step 6
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    this_oop->set_init_state(being_initialized);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
    this_oop->set_init_thread(self);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
  // Step 7
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   729
  Klass* super_klass = this_oop->super();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
  if (super_klass != NULL && !this_oop->is_interface() && Klass::cast(super_klass)->should_be_initialized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
    Klass::cast(super_klass)->initialize(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
      Handle e(THREAD, PENDING_EXCEPTION);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
        EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
        this_oop->set_initialization_state_and_notify(initialization_error, THREAD); // Locks object, set state, and notify all waiting threads
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
        CLEAR_PENDING_EXCEPTION;   // ignore any exception thrown, superclass initialization error is thrown below
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
      }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   741
      DTRACE_CLASSINIT_PROBE_WAIT(super__failed, InstanceKlass::cast(this_oop()), -1,wait);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
      THROW_OOP(e());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   746
  if (this_oop->has_default_methods()) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   747
    // Step 7.5: initialize any interfaces which have default methods
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   748
    for (int i = 0; i < this_oop->local_interfaces()->length(); ++i) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   749
      Klass* iface = this_oop->local_interfaces()->at(i);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   750
      InstanceKlass* ik = InstanceKlass::cast(iface);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   751
      if (ik->has_default_methods() && ik->should_be_initialized()) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   752
        ik->initialize(THREAD);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   753
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   754
        if (HAS_PENDING_EXCEPTION) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   755
          Handle e(THREAD, PENDING_EXCEPTION);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   756
          CLEAR_PENDING_EXCEPTION;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   757
          {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   758
            EXCEPTION_MARK;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   759
            // Locks object, set state, and notify all waiting threads
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   760
            this_oop->set_initialization_state_and_notify(
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   761
                initialization_error, THREAD);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   762
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   763
            // ignore any exception thrown, superclass initialization error is
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   764
            // thrown below
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   765
            CLEAR_PENDING_EXCEPTION;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   766
          }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   767
          DTRACE_CLASSINIT_PROBE_WAIT(
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   768
              super__failed, InstanceKlass::cast(this_oop()), -1, wait);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   769
          THROW_OOP(e());
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   770
        }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   771
      }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   772
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   773
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
   774
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
  // Step 8
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
    assert(THREAD->is_Java_thread(), "non-JavaThread in initialize_impl");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
    JavaThread* jt = (JavaThread*)THREAD;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   779
    DTRACE_CLASSINIT_PROBE_WAIT(clinit, InstanceKlass::cast(this_oop()), -1,wait);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
    // Timer includes any side effects of class initialization (resolution,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
    // etc), but not recursive entry into call_class_initializer().
3575
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   782
    PerfClassTraceTime timer(ClassLoader::perf_class_init_time(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   783
                             ClassLoader::perf_class_init_selftime(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   784
                             ClassLoader::perf_classes_inited(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   785
                             jt->get_thread_stat()->perf_recursion_counts_addr(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   786
                             jt->get_thread_stat()->perf_timers_addr(),
224791e7ecab 6857194: Add hotspot perf counters to aid class loading performance measurement
mchung
parents: 2343
diff changeset
   787
                             PerfClassTraceTime::CLASS_CLINIT);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
    this_oop->call_class_initializer(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
  // Step 9
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
  if (!HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
    this_oop->set_initialization_state_and_notify(fully_initialized, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    { ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
      debug_only(this_oop->vtable()->verify(tty, true);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
  else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
    // Step 10 and 11
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
    Handle e(THREAD, PENDING_EXCEPTION);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
    CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
      EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
      this_oop->set_initialization_state_and_notify(initialization_error, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
      CLEAR_PENDING_EXCEPTION;   // ignore any exception thrown, class initialization error is thrown below
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   807
    DTRACE_CLASSINIT_PROBE_WAIT(error, InstanceKlass::cast(this_oop()), -1,wait);
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 4094
diff changeset
   808
    if (e->is_a(SystemDictionary::Error_klass())) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
      THROW_OOP(e());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
      JavaCallArguments args(e);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   812
      THROW_ARG(vmSymbols::java_lang_ExceptionInInitializerError(),
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   813
                vmSymbols::throwable_void_signature(),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
                &args);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   817
  DTRACE_CLASSINIT_PROBE_WAIT(end, InstanceKlass::cast(this_oop()), -1,wait);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
// Note: implementation moved to static method to expose the this pointer.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   822
void InstanceKlass::set_initialization_state_and_notify(ClassState state, TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   823
  instanceKlassHandle kh(THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  set_initialization_state_and_notify_impl(kh, state, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   827
void InstanceKlass::set_initialization_state_and_notify_impl(instanceKlassHandle this_oop, ClassState state, TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   828
  volatile oop init_lock = this_oop->init_lock();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   829
  ObjectLocker ol(init_lock, THREAD, init_lock != NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  this_oop->set_init_state(state);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   831
  this_oop->fence_and_clear_init_lock();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
  ol.notify_all(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   835
// The embedded _implementor field can only record one implementor.
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   836
// When there are more than one implementors, the _implementor field
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   837
// is set to the interface Klass* itself. Following are the possible
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   838
// values for the _implementor field:
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   839
//   NULL                  - no implementor
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   840
//   implementor Klass*    - one implementor
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   841
//   self                  - more than one implementor
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   842
//
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   843
// The _implementor field only exists for interfaces.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   844
void InstanceKlass::add_implementor(Klass* k) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  assert(Compile_lock->owned_by_self(), "");
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   846
  assert(is_interface(), "not interface");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  // Filter out my subinterfaces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
  // (Note: Interfaces are never on the subklass list.)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   849
  if (InstanceKlass::cast(k)->is_interface()) return;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  // Filter out subclasses whose supers already implement me.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  // (Note: CHA must walk subclasses of direct implementors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  // in order to locate indirect implementors.)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   854
  Klass* sk = InstanceKlass::cast(k)->super();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   855
  if (sk != NULL && InstanceKlass::cast(sk)->implements_interface(this))
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
    // We only need to check one immediate superclass, since the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
    // implements_interface query looks at transitive_interfaces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
    // Any supers of the super have the same (or fewer) transitive_interfaces.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   861
  Klass* ik = implementor();
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   862
  if (ik == NULL) {
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   863
    set_implementor(k);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   864
  } else if (ik != this) {
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   865
    // There is already an implementor. Use itself as an indicator of
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   866
    // more than one implementors.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   867
    set_implementor(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
  // The implementor also implements the transitive_interfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
  for (int index = 0; index < local_interfaces()->length(); index++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   872
    InstanceKlass::cast(local_interfaces()->at(index))->add_implementor(k);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   876
void InstanceKlass::init_implementor() {
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   877
  if (is_interface()) {
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   878
    set_implementor(NULL);
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
   879
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   883
void InstanceKlass::process_interfaces(Thread *thread) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  // link this class into the implementors list of every interface it implements
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   885
  Klass* this_as_klass_oop = this;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  for (int i = local_interfaces()->length() - 1; i >= 0; i--) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   887
    assert(local_interfaces()->at(i)->is_klass(), "must be a klass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   888
    InstanceKlass* interf = InstanceKlass::cast(local_interfaces()->at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
    assert(interf->is_interface(), "expected interface");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   890
    interf->add_implementor(this_as_klass_oop);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   894
bool InstanceKlass::can_be_primary_super_slow() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  if (is_interface())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
  else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
    return Klass::can_be_primary_super_slow();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   901
GrowableArray<Klass*>* InstanceKlass::compute_secondary_supers(int num_extra_slots) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  // The secondaries are the implemented interfaces.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   903
  InstanceKlass* ik = InstanceKlass::cast(this);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   904
  Array<Klass*>* interfaces = ik->transitive_interfaces();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  int num_secondaries = num_extra_slots + interfaces->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  if (num_secondaries == 0) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   907
    // Must share this for correct bootstrapping!
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   908
    set_secondary_supers(Universe::the_empty_klass_array());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   909
    return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
  } else if (num_extra_slots == 0) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   911
    // The secondary super list is exactly the same as the transitive interfaces.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   912
    // Redefine classes has to be careful not to delete this!
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   913
    set_secondary_supers(interfaces);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   914
    return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  } else {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   916
    // Copy transitive interfaces to a temporary growable array to be constructed
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   917
    // into the secondary super list with extra slots.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   918
    GrowableArray<Klass*>* secondaries = new GrowableArray<Klass*>(interfaces->length());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
    for (int i = 0; i < interfaces->length(); i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   920
      secondaries->push(interfaces->at(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
    return secondaries;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   926
bool InstanceKlass::compute_is_subtype_of(Klass* k) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  if (Klass::cast(k)->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
    return implements_interface(k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
    return Klass::compute_is_subtype_of(k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   934
bool InstanceKlass::implements_interface(Klass* k) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   935
  if (this == k) return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  assert(Klass::cast(k)->is_interface(), "should be an interface class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  for (int i = 0; i < transitive_interfaces()->length(); i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   938
    if (transitive_interfaces()->at(i) == k) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   945
objArrayOop InstanceKlass::allocate_objArray(int n, int length, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
  if (length < 0) THROW_0(vmSymbols::java_lang_NegativeArraySizeException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  if (length > arrayOopDesc::max_array_length(T_OBJECT)) {
3576
4ceec8fb3e18 6850957: Honor -XX:OnOutOfMemoryError when array size exceeds VM limit
martin
parents: 3575
diff changeset
   948
    report_java_out_of_memory("Requested array size exceeds VM limit");
12114
9a825a536095 7123170: JCK vm/jvmti/ResourceExhausted/resexh001/resexh00101/ tests fails since 7u4 b02
sspitsyn
parents: 11407
diff changeset
   949
    JvmtiExport::post_array_size_exhausted();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
    THROW_OOP_0(Universe::out_of_memory_error_array_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
  int size = objArrayOopDesc::object_size(length);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   953
  Klass* ak = array_klass(n, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
  KlassHandle h_ak (THREAD, ak);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
  objArrayOop o =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
    (objArrayOop)CollectedHeap::array_allocate(h_ak, size, length, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
  return o;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   960
instanceOop InstanceKlass::register_finalizer(instanceOop i, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  if (TraceFinalizerRegistration) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
    tty->print("Registered ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
    i->print_value_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
    tty->print_cr(" (" INTPTR_FORMAT ") as finalizable", (address)i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
  instanceHandle h_i(THREAD, i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  // Pass the handle as argument, JavaCalls::call expects oop as jobjects
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  JavaCallArguments args(h_i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  methodHandle mh (THREAD, Universe::finalizer_register_method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  JavaCalls::call(&result, mh, &args, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  return h_i();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   975
instanceOop InstanceKlass::allocate_instance(TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  bool has_finalizer_flag = has_finalizer(); // Query before possible GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
  int size = size_helper();  // Query before forming handle.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   979
  KlassHandle h_k(THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
  instanceOop i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  i = (instanceOop)CollectedHeap::obj_allocate(h_k, size, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
  if (has_finalizer_flag && !RegisterFinalizersAtInit) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
    i = register_finalizer(i, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
  return i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   990
void InstanceKlass::check_valid_for_instantiation(bool throwError, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  if (is_interface() || is_abstract()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
    THROW_MSG(throwError ? vmSymbols::java_lang_InstantiationError()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
              : vmSymbols::java_lang_InstantiationException(), external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   996
  if (this == SystemDictionary::Class_klass()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
    THROW_MSG(throwError ? vmSymbols::java_lang_IllegalAccessError()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
              : vmSymbols::java_lang_IllegalAccessException(), external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1003
Klass* InstanceKlass::array_klass_impl(bool or_null, int n, TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1004
  instanceKlassHandle this_oop(THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
  return array_klass_impl(this_oop, or_null, n, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1008
Klass* InstanceKlass::array_klass_impl(instanceKlassHandle this_oop, bool or_null, int n, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
  if (this_oop->array_klasses() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
    if (or_null) return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
    JavaThread *jt = (JavaThread *)THREAD;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
      // Atomic creation of array_klasses
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
      MutexLocker mc(Compile_lock, THREAD);   // for vtables
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
      MutexLocker ma(MultiArray_lock, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
      // Check if update has already taken place
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
      if (this_oop->array_klasses() == NULL) {
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13738
diff changeset
  1021
        Klass*    k = ObjArrayKlass::allocate_objArray_klass(this_oop->class_loader_data(), 1, this_oop, CHECK_NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
        this_oop->set_array_klasses(k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
  // _this will always be set at this point
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13738
diff changeset
  1027
  ObjArrayKlass* oak = (ObjArrayKlass*)this_oop->array_klasses();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
  if (or_null) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
    return oak->array_klass_or_null(n);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
  return oak->array_klass(n, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1034
Klass* InstanceKlass::array_klass_impl(bool or_null, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
  return array_klass_impl(or_null, 1, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1038
void InstanceKlass::call_class_initializer(TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1039
  instanceKlassHandle ik (THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
  call_class_initializer_impl(ik, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
static int call_class_initializer_impl_counter = 0;   // for debugging
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1045
Method* InstanceKlass::class_initializer() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1046
  Method* clinit = find_method(
8653
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8297
diff changeset
  1047
      vmSymbols::class_initializer_name(), vmSymbols::void_method_signature());
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8297
diff changeset
  1048
  if (clinit != NULL && clinit->has_valid_initializer_flags()) {
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8297
diff changeset
  1049
    return clinit;
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8297
diff changeset
  1050
  }
8797d788a4f1 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 8297
diff changeset
  1051
  return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1054
void InstanceKlass::call_class_initializer_impl(instanceKlassHandle this_oop, TRAPS) {
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14385
diff changeset
  1055
  if (ReplayCompiles &&
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14385
diff changeset
  1056
      (ReplaySuppressInitializers == 1 ||
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14385
diff changeset
  1057
       ReplaySuppressInitializers >= 2 && this_oop->class_loader() != NULL)) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14385
diff changeset
  1058
    // Hide the existence of the initializer for the purpose of replaying the compile
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14385
diff changeset
  1059
    return;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14385
diff changeset
  1060
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14385
diff changeset
  1061
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
  methodHandle h_method(THREAD, this_oop->class_initializer());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
  assert(!this_oop->is_initialized(), "we cannot initialize twice");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  if (TraceClassInitialization) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
    tty->print("%d Initializing ", call_class_initializer_impl_counter++);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
    this_oop->name()->print_value();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
    tty->print_cr("%s (" INTPTR_FORMAT ")", h_method() == NULL ? "(no method)" : "", (address)this_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  if (h_method() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
    JavaCallArguments args; // No arguments
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
    JavaValue result(T_VOID);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
    JavaCalls::call(&result, h_method, &args, CHECK); // Static call (no args)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1077
void InstanceKlass::mask_for(methodHandle method, int bci,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  InterpreterOopMap* entry_for) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
  // Dirty read, then double-check under a lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
  if (_oop_map_cache == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
    // Otherwise, allocate a new one.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
    MutexLocker x(OopMapCacheAlloc_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
    // First time use. Allocate a cache in C heap
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
    if (_oop_map_cache == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
      _oop_map_cache = new OopMapCache();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
  // _oop_map_cache is constant after init; lookup below does is own locking.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
  _oop_map_cache->lookup(method, bci, entry_for);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1093
bool InstanceKlass::find_local_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1094
  for (JavaFieldStream fs(this); !fs.done(); fs.next()) {
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1095
    Symbol* f_name = fs.name();
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1096
    Symbol* f_sig  = fs.signature();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
    if (f_name == name && f_sig == sig) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1098
      fd->initialize(const_cast<InstanceKlass*>(this), fs.index());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1106
Klass* InstanceKlass::find_interface_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  const int n = local_interfaces()->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  for (int i = 0; i < n; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1109
    Klass* intf1 = local_interfaces()->at(i);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
    assert(Klass::cast(intf1)->is_interface(), "just checking type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
    // search for field in current interface
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1112
    if (InstanceKlass::cast(intf1)->find_local_field(name, sig, fd)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
      assert(fd->is_static(), "interface field must be static");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
      return intf1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
    // search for field in direct superinterfaces
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1117
    Klass* intf2 = InstanceKlass::cast(intf1)->find_interface_field(name, sig, fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
    if (intf2 != NULL) return intf2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
  // otherwise field lookup fails
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1125
Klass* InstanceKlass::find_field(Symbol* name, Symbol* sig, fieldDescriptor* fd) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  // search order according to newest JVM spec (5.4.3.2, p.167).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
  // 1) search for field in current klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  if (find_local_field(name, sig, fd)) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1129
    return const_cast<InstanceKlass*>(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  // 2) search for field recursively in direct superinterfaces
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1132
  { Klass* intf = find_interface_field(name, sig, fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
    if (intf != NULL) return intf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
  // 3) apply field lookup recursively if superclass exists
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1136
  { Klass* supr = super();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1137
    if (supr != NULL) return InstanceKlass::cast(supr)->find_field(name, sig, fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
  // 4) otherwise field lookup fails
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1144
Klass* InstanceKlass::find_field(Symbol* name, Symbol* sig, bool is_static, fieldDescriptor* fd) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
  // search order according to newest JVM spec (5.4.3.2, p.167).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  // 1) search for field in current klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  if (find_local_field(name, sig, fd)) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1148
    if (fd->is_static() == is_static) return const_cast<InstanceKlass*>(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
  // 2) search for field recursively in direct superinterfaces
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
  if (is_static) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1152
    Klass* intf = find_interface_field(name, sig, fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
    if (intf != NULL) return intf;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  // 3) apply field lookup recursively if superclass exists
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1156
  { Klass* supr = super();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1157
    if (supr != NULL) return InstanceKlass::cast(supr)->find_field(name, sig, is_static, fd);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  // 4) otherwise field lookup fails
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1164
bool InstanceKlass::find_local_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1165
  for (JavaFieldStream fs(this); !fs.done(); fs.next()) {
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1166
    if (fs.offset() == offset) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1167
      fd->initialize(const_cast<InstanceKlass*>(this), fs.index());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
      if (fd->is_static() == is_static) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1175
bool InstanceKlass::find_field_from_offset(int offset, bool is_static, fieldDescriptor* fd) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1176
  Klass* klass = const_cast<InstanceKlass*>(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
  while (klass != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1178
    if (InstanceKlass::cast(klass)->find_local_field_from_offset(offset, is_static, fd)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
    klass = Klass::cast(klass)->super();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1187
void InstanceKlass::methods_do(void f(Method* method)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
  int len = methods()->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  for (int index = 0; index < len; index++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1190
    Method* m = methods()->at(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
    assert(m->is_method(), "must be method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
    f(m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  1196
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1197
void InstanceKlass::do_local_static_fields(FieldClosure* cl) {
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1198
  for (JavaFieldStream fs(this); !fs.done(); fs.next()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1199
    if (fs.access_flags().is_static()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1200
      fieldDescriptor fd;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1201
      fd.initialize(this, fs.index());
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1202
      cl->do_field(&fd);
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1203
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1208
void InstanceKlass::do_local_static_fields(void f(fieldDescriptor*, TRAPS), TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1209
  instanceKlassHandle h_this(THREAD, this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
  do_local_static_fields_impl(h_this, f, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1214
void InstanceKlass::do_local_static_fields_impl(instanceKlassHandle this_oop, void f(fieldDescriptor* fd, TRAPS), TRAPS) {
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1215
  for (JavaFieldStream fs(this_oop()); !fs.done(); fs.next()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1216
    if (fs.access_flags().is_static()) {
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1217
      fieldDescriptor fd;
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1218
      fd.initialize(this_oop(), fs.index());
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1219
      f(&fd, CHECK);
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1220
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1225
static int compare_fields_by_offset(int* a, int* b) {
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1226
  return a[0] - b[0];
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1227
}
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1228
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1229
void InstanceKlass::do_nonstatic_fields(FieldClosure* cl) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1230
  InstanceKlass* super = superklass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  if (super != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
    super->do_nonstatic_fields(cl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
  }
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1234
  fieldDescriptor fd;
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1235
  int length = java_fields_count();
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1236
  // In DebugInfo nonstatic fields are sorted by offset.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12587
diff changeset
  1237
  int* fields_sorted = NEW_C_HEAP_ARRAY(int, 2*(length+1), mtClass);
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1238
  int j = 0;
10546
e79347eebbc5 7086585: make Java field injection more flexible
never
parents: 10265
diff changeset
  1239
  for (int i = 0; i < length; i += 1) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1240
    fd.initialize(this, i);
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1241
    if (!fd.is_static()) {
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1242
      fields_sorted[j + 0] = fd.offset();
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1243
      fields_sorted[j + 1] = i;
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1244
      j += 2;
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1245
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
  }
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1247
  if (j > 0) {
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1248
    length = j;
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1249
    // _sort_Fn is defined in growableArray.hpp.
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1250
    qsort(fields_sorted, length/2, 2*sizeof(int), (_sort_Fn)compare_fields_by_offset);
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1251
    for (int i = 0; i < length; i += 2) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1252
      fd.initialize(this, fields_sorted[i + 1]);
217
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1253
      assert(!fd.is_static() && fd.offset() == fields_sorted[i], "only nonstatic fields");
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1254
      cl->do_field(&fd);
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1255
    }
c646ef2f5d58 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 1
diff changeset
  1256
  }
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12587
diff changeset
  1257
  FREE_C_HEAP_ARRAY(int, fields_sorted, mtClass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1261
void InstanceKlass::array_klasses_do(void f(Klass* k, TRAPS), TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1262
  if (array_klasses() != NULL)
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13738
diff changeset
  1263
    ArrayKlass::cast(array_klasses())->array_klasses_do(f, THREAD);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1264
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1265
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1266
void InstanceKlass::array_klasses_do(void f(Klass* k)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
  if (array_klasses() != NULL)
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13738
diff changeset
  1268
    ArrayKlass::cast(array_klasses())->array_klasses_do(f);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1272
void InstanceKlass::with_array_klasses_do(void f(Klass* k)) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1273
  f(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
  array_klasses_do(f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
#ifdef ASSERT
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1278
static int linear_search(Array<Method*>* methods, Symbol* name, Symbol* signature) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
  int len = methods->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
  for (int index = 0; index < len; index++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1281
    Method* m = methods->at(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
    assert(m->is_method(), "must be method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
    if (m->signature() == signature && m->name() == name) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
       return index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
  return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1291
static int binary_search(Array<Method*>* methods, Symbol* name) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
  int len = methods->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
  // methods are sorted, so do binary search
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
  int l = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
  int h = len - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
  while (l <= h) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
    int mid = (l + h) >> 1;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1298
    Method* m = methods->at(mid);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
    assert(m->is_method(), "must be method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
    int res = m->name()->fast_compare(name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
    if (res == 0) {
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1302
      return mid;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
    } else if (res < 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
      l = mid + 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
      h = mid - 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
  }
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1309
  return -1;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1310
}
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1311
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1312
Method* InstanceKlass::find_method(Symbol* name, Symbol* signature) const {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1313
  return InstanceKlass::find_method(methods(), name, signature);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1314
}
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1315
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1316
Method* InstanceKlass::find_method(
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1317
    Array<Method*>* methods, Symbol* name, Symbol* signature) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1318
  int hit = binary_search(methods, name);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1319
  if (hit != -1) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1320
    Method* m = methods->at(hit);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1321
    // Do linear search to find matching signature.  First, quick check
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1322
    // for common case
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1323
    if (m->signature() == signature) return m;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1324
    // search downwards through overloaded methods
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1325
    int i;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1326
    for (i = hit - 1; i >= 0; --i) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1327
        Method* m = methods->at(i);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1328
        assert(m->is_method(), "must be method");
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1329
        if (m->name() != name) break;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1330
        if (m->signature() == signature) return m;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1331
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1332
    // search upwards
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1333
    for (i = hit + 1; i < methods->length(); ++i) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1334
        Method* m = methods->at(i);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1335
        assert(m->is_method(), "must be method");
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1336
        if (m->name() != name) break;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1337
        if (m->signature() == signature) return m;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1338
    }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1339
    // not found
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
#ifdef ASSERT
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1341
    int index = linear_search(methods, name, signature);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1342
    assert(index == -1, err_msg("binary search should have found entry %d", index));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
#endif
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1344
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
14385
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1348
int InstanceKlass::find_method_by_name(Symbol* name, int* end) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1349
  return find_method_by_name(methods(), name, end);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1350
}
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1351
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1352
int InstanceKlass::find_method_by_name(
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1353
    Array<Method*>* methods, Symbol* name, int* end_ptr) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1354
  assert(end_ptr != NULL, "just checking");
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1355
  int start = binary_search(methods, name);
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1356
  int end = start + 1;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1357
  if (start != -1) {
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1358
    while (start - 1 >= 0 && (methods->at(start - 1))->name() == name) --start;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1359
    while (end < methods->length() && (methods->at(end))->name() == name) ++end;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1360
    *end_ptr = end;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1361
    return start;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1362
  }
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1363
  return -1;
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1364
}
959bbcc16725 7200776: Implement default methods in interfaces
kamg
parents: 13952
diff changeset
  1365
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1366
Method* InstanceKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1367
  Klass* klass = const_cast<InstanceKlass*>(this);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
  while (klass != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1369
    Method* method = InstanceKlass::cast(klass)->find_method(name, signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
    if (method != NULL) return method;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1371
    klass = InstanceKlass::cast(klass)->super();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
// lookup a method in all the interfaces that this class implements
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1377
Method* InstanceKlass::lookup_method_in_all_interfaces(Symbol* name,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  1378
                                                         Symbol* signature) const {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1379
  Array<Klass*>* all_ifs = transitive_interfaces();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
  int num_ifs = all_ifs->length();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1381
  InstanceKlass *ik = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
  for (int i = 0; i < num_ifs; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1383
    ik = InstanceKlass::cast(all_ifs->at(i));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1384
    Method* m = ik->lookup_method(name, signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
    if (m != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
      return m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
/* jni_id_for_impl for jfieldIds only */
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1393
JNIid* InstanceKlass::jni_id_for_impl(instanceKlassHandle this_oop, int offset) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
  MutexLocker ml(JfieldIdCreation_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
  // Retry lookup after we got the lock
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
  JNIid* probe = this_oop->jni_ids() == NULL ? NULL : this_oop->jni_ids()->find(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
  if (probe == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
    // Slow case, allocate new static field identifier
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1399
    probe = new JNIid(this_oop(), offset, this_oop->jni_ids());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
    this_oop->set_jni_ids(probe);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
  return probe;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
/* jni_id_for for jfieldIds only */
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1407
JNIid* InstanceKlass::jni_id_for(int offset) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
  JNIid* probe = jni_ids() == NULL ? NULL : jni_ids()->find(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
  if (probe == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1410
    probe = jni_id_for_impl(this, offset);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
  return probe;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1415
u2 InstanceKlass::enclosing_method_data(int offset) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1416
  Array<jushort>* inner_class_list = inner_classes();
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1417
  if (inner_class_list == NULL) {
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1418
    return 0;
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1419
  }
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1420
  int length = inner_class_list->length();
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1421
  if (length % inner_class_next_offset == 0) {
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1422
    return 0;
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1423
  } else {
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1424
    int index = length - enclosing_method_attribute_size;
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1425
    assert(offset < enclosing_method_attribute_size, "invalid offset");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1426
    return inner_class_list->at(index + offset);
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1427
  }
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1428
}
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1429
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1430
void InstanceKlass::set_enclosing_method_indices(u2 class_index,
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1431
                                                 u2 method_index) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1432
  Array<jushort>* inner_class_list = inner_classes();
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1433
  assert (inner_class_list != NULL, "_inner_classes list is not set up");
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1434
  int length = inner_class_list->length();
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1435
  if (length % inner_class_next_offset == enclosing_method_attribute_size) {
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1436
    int index = length - enclosing_method_attribute_size;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1437
    inner_class_list->at_put(
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1438
      index + enclosing_method_class_index_offset, class_index);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1439
    inner_class_list->at_put(
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1440
      index + enclosing_method_method_index_offset, method_index);
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1441
  }
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  1442
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
// Lookup or create a jmethodID.
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1445
// This code is called by the VMThread and JavaThreads so the
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1446
// locking has to be done very carefully to avoid deadlocks
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1447
// and/or other cache consistency problems.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1448
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1449
jmethodID InstanceKlass::get_jmethod_id(instanceKlassHandle ik_h, methodHandle method_h) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
  size_t idnum = (size_t)method_h->method_idnum();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
  jmethodID* jmeths = ik_h->methods_jmethod_ids_acquire();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
  size_t length = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
  jmethodID id = NULL;
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1454
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1455
  // We use a double-check locking idiom here because this cache is
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1456
  // performance sensitive. In the normal system, this cache only
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1457
  // transitions from NULL to non-NULL which is safe because we use
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1458
  // release_set_methods_jmethod_ids() to advertise the new cache.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1459
  // A partially constructed cache should never be seen by a racing
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1460
  // thread. We also use release_store_ptr() to save a new jmethodID
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1461
  // in the cache so a partially constructed jmethodID should never be
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1462
  // seen either. Cache reads of existing jmethodIDs proceed without a
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1463
  // lock, but cache writes of a new jmethodID requires uniqueness and
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1464
  // creation of the cache itself requires no leaks so a lock is
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1465
  // generally acquired in those two cases.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1466
  //
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1467
  // If the RedefineClasses() API has been used, then this cache can
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1468
  // grow and we'll have transitions from non-NULL to bigger non-NULL.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1469
  // Cache creation requires no leaks and we require safety between all
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1470
  // cache accesses and freeing of the old cache so a lock is generally
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1471
  // acquired when the RedefineClasses() API has been used.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1473
  if (jmeths != NULL) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1474
    // the cache already exists
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1475
    if (!ik_h->idnum_can_increment()) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1476
      // the cache can't grow so we can just get the current values
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1477
      get_jmethod_id_length_value(jmeths, idnum, &length, &id);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1478
    } else {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1479
      // cache can grow so we have to be more careful
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1480
      if (Threads::number_of_threads() == 0 ||
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1481
          SafepointSynchronize::is_at_safepoint()) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1482
        // we're single threaded or at a safepoint - no locking needed
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1483
        get_jmethod_id_length_value(jmeths, idnum, &length, &id);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1484
      } else {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1485
        MutexLocker ml(JmethodIdCreation_lock);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1486
        get_jmethod_id_length_value(jmeths, idnum, &length, &id);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1487
      }
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1488
    }
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1489
  }
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1490
  // implied else:
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1491
  // we need to allocate a cache so default length and id values are good
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1493
  if (jmeths == NULL ||   // no cache yet
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1494
      length <= idnum ||  // cache is too short
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1495
      id == NULL) {       // cache doesn't contain entry
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1496
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1497
    // This function can be called by the VMThread so we have to do all
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1498
    // things that might block on a safepoint before grabbing the lock.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1499
    // Otherwise, we can deadlock with the VMThread or have a cache
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1500
    // consistency issue. These vars keep track of what we might have
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1501
    // to free after the lock is dropped.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1502
    jmethodID  to_dealloc_id     = NULL;
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1503
    jmethodID* to_dealloc_jmeths = NULL;
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1504
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1505
    // may not allocate new_jmeths or use it if we allocate it
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
    jmethodID* new_jmeths = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
    if (length <= idnum) {
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1508
      // allocate a new cache that might be used
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
      size_t size = MAX2(idnum+1, (size_t)ik_h->idnum_allocated_count());
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12587
diff changeset
  1510
      new_jmeths = NEW_C_HEAP_ARRAY(jmethodID, size+1, mtClass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
      memset(new_jmeths, 0, (size+1)*sizeof(jmethodID));
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1512
      // cache size is stored in element[0], other elements offset by one
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1513
      new_jmeths[0] = (jmethodID)size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1514
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1516
    // allocate a new jmethodID that might be used
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1517
    jmethodID new_id = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1518
    if (method_h->is_old() && !method_h->is_obsolete()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
      // The method passed in is old (but not obsolete), we need to use the current version
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1520
      Method* current_method = ik_h->method_with_idnum((int)idnum);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
      assert(current_method != NULL, "old and but not obsolete, so should exist");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1522
      new_id = Method::make_jmethod_id(ik_h->class_loader_data(), current_method);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
      // It is the current version of the method or an obsolete method,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
      // use the version passed in
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1526
      new_id = Method::make_jmethod_id(ik_h->class_loader_data(), method_h());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1527
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1529
    if (Threads::number_of_threads() == 0 ||
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1530
        SafepointSynchronize::is_at_safepoint()) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1531
      // we're single threaded or at a safepoint - no locking needed
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1532
      id = get_jmethod_id_fetch_or_update(ik_h, idnum, new_id, new_jmeths,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1533
                                          &to_dealloc_id, &to_dealloc_jmeths);
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1534
    } else {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
      MutexLocker ml(JmethodIdCreation_lock);
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1536
      id = get_jmethod_id_fetch_or_update(ik_h, idnum, new_id, new_jmeths,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1537
                                          &to_dealloc_id, &to_dealloc_jmeths);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1538
    }
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1539
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1540
    // The lock has been dropped so we can free resources.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1541
    // Free up either the old cache or the new cache if we allocated one.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1542
    if (to_dealloc_jmeths != NULL) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1543
      FreeHeap(to_dealloc_jmeths);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1544
    }
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1545
    // free up the new ID since it wasn't needed
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1546
    if (to_dealloc_id != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1547
      Method::destroy_jmethod_id(ik_h->class_loader_data(), to_dealloc_id);
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1548
    }
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1549
  }
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1550
  return id;
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1551
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1553
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1554
// Common code to fetch the jmethodID from the cache or update the
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1555
// cache with the new jmethodID. This function should never do anything
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1556
// that causes the caller to go to a safepoint or we can deadlock with
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1557
// the VMThread or have cache consistency issues.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1558
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1559
jmethodID InstanceKlass::get_jmethod_id_fetch_or_update(
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1560
            instanceKlassHandle ik_h, size_t idnum, jmethodID new_id,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1561
            jmethodID* new_jmeths, jmethodID* to_dealloc_id_p,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1562
            jmethodID** to_dealloc_jmeths_p) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1563
  assert(new_id != NULL, "sanity check");
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1564
  assert(to_dealloc_id_p != NULL, "sanity check");
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1565
  assert(to_dealloc_jmeths_p != NULL, "sanity check");
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1566
  assert(Threads::number_of_threads() == 0 ||
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1567
         SafepointSynchronize::is_at_safepoint() ||
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1568
         JmethodIdCreation_lock->owned_by_self(), "sanity check");
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1569
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1570
  // reacquire the cache - we are locked, single threaded or at a safepoint
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1571
  jmethodID* jmeths = ik_h->methods_jmethod_ids_acquire();
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1572
  jmethodID  id     = NULL;
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1573
  size_t     length = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1575
  if (jmeths == NULL ||                         // no cache yet
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1576
      (length = (size_t)jmeths[0]) <= idnum) {  // cache is too short
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1577
    if (jmeths != NULL) {
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1578
      // copy any existing entries from the old cache
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1579
      for (size_t index = 0; index < length; index++) {
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1580
        new_jmeths[index+1] = jmeths[index+1];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1581
      }
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1582
      *to_dealloc_jmeths_p = jmeths;  // save old cache for later delete
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1583
    }
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1584
    ik_h->release_set_methods_jmethod_ids(jmeths = new_jmeths);
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1585
  } else {
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1586
    // fetch jmethodID (if any) from the existing cache
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1587
    id = jmeths[idnum+1];
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1588
    *to_dealloc_jmeths_p = new_jmeths;  // save new cache for later delete
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1589
  }
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1590
  if (id == NULL) {
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1591
    // No matching jmethodID in the existing cache or we have a new
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1592
    // cache or we just grew the cache. This cache write is done here
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1593
    // by the first thread to win the foot race because a jmethodID
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1594
    // needs to be unique once it is generally available.
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1595
    id = new_id;
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1596
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1597
    // The jmethodID cache can be read while unlocked so we have to
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1598
    // make sure the new jmethodID is complete before installing it
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1599
    // in the cache.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1600
    OrderAccess::release_store_ptr(&jmeths[idnum+1], id);
222
3d1795325749 6453355: 4/4 new No_Safepoint_Verifier uses fail during GC
dcubed
parents: 220
diff changeset
  1601
  } else {
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1602
    *to_dealloc_id_p = new_id; // save new id for later delete
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
  return id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1608
// Common code to get the jmethodID cache length and the jmethodID
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1609
// value at index idnum if there is one.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1610
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1611
void InstanceKlass::get_jmethod_id_length_value(jmethodID* cache,
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1612
       size_t idnum, size_t *length_p, jmethodID* id_p) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1613
  assert(cache != NULL, "sanity check");
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1614
  assert(length_p != NULL, "sanity check");
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1615
  assert(id_p != NULL, "sanity check");
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1616
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1617
  // cache size is stored in element[0], other elements offset by one
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1618
  *length_p = (size_t)cache[0];
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1619
  if (*length_p <= idnum) {  // cache is too short
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1620
    *id_p = NULL;
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1621
  } else {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1622
    *id_p = cache[idnum+1];  // fetch jmethodID (if any)
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1623
  }
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1624
}
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1625
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1626
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
// Lookup a jmethodID, NULL if not found.  Do no blocking, no allocations, no handles
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1628
jmethodID InstanceKlass::jmethod_id_or_null(Method* method) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
  size_t idnum = (size_t)method->method_idnum();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
  jmethodID* jmeths = methods_jmethod_ids_acquire();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
  size_t length;                                // length assigned as debugging crumb
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
  jmethodID id = NULL;
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1633
  if (jmeths != NULL &&                         // If there is a cache
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
      (length = (size_t)jmeths[0]) > idnum) {   // and if it is long enough,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
    id = jmeths[idnum+1];                       // Look up the id (may be NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
  return id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
// Cache an itable index
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1642
void InstanceKlass::set_cached_itable_index(size_t idnum, int index) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
  int* indices = methods_cached_itable_indices_acquire();
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1644
  int* to_dealloc_indices = NULL;
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1645
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1646
  // We use a double-check locking idiom here because this cache is
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1647
  // performance sensitive. In the normal system, this cache only
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1648
  // transitions from NULL to non-NULL which is safe because we use
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1649
  // release_set_methods_cached_itable_indices() to advertise the
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1650
  // new cache. A partially constructed cache should never be seen
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1651
  // by a racing thread. Cache reads and writes proceed without a
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1652
  // lock, but creation of the cache itself requires no leaks so a
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1653
  // lock is generally acquired in that case.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1654
  //
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1655
  // If the RedefineClasses() API has been used, then this cache can
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1656
  // grow and we'll have transitions from non-NULL to bigger non-NULL.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1657
  // Cache creation requires no leaks and we require safety between all
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1658
  // cache accesses and freeing of the old cache so a lock is generally
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1659
  // acquired when the RedefineClasses() API has been used.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1660
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1661
  if (indices == NULL || idnum_can_increment()) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1662
    // we need a cache or the cache can grow
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
    MutexLocker ml(JNICachedItableIndex_lock);
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1664
    // reacquire the cache to see if another thread already did the work
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
    indices = methods_cached_itable_indices_acquire();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
    size_t length = 0;
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1667
    // cache size is stored in element[0], other elements offset by one
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
    if (indices == NULL || (length = (size_t)indices[0]) <= idnum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
      size_t size = MAX2(idnum+1, (size_t)idnum_allocated_count());
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12587
diff changeset
  1670
      int* new_indices = NEW_C_HEAP_ARRAY(int, size+1, mtClass);
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1671
      new_indices[0] = (int)size;
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1672
      // copy any existing entries
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
      size_t i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1674
      for (i = 0; i < length; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
        new_indices[i+1] = indices[i+1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
      // Set all the rest to -1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
      for (i = length; i < size; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
        new_indices[i+1] = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1681
      if (indices != NULL) {
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1682
        // We have an old cache to delete so save it for after we
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1683
        // drop the lock.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1684
        to_dealloc_indices = indices;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
      release_set_methods_cached_itable_indices(indices = new_indices);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
    }
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1688
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1689
    if (idnum_can_increment()) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1690
      // this cache can grow so we have to write to it safely
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1691
      indices[idnum+1] = index;
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1692
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1693
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
    CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
  }
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1696
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1697
  if (!idnum_can_increment()) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1698
    // The cache cannot grow and this JNI itable index value does not
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1699
    // have to be unique like a jmethodID. If there is a race to set it,
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1700
    // it doesn't matter.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1701
    indices[idnum+1] = index;
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1702
  }
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1703
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1704
  if (to_dealloc_indices != NULL) {
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1705
    // we allocated a new cache so free the old one
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1706
    FreeHeap(to_dealloc_indices);
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  1707
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
// Retrieve a cached itable index
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1712
int InstanceKlass::cached_itable_index(size_t idnum) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
  int* indices = methods_cached_itable_indices_acquire();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
  if (indices != NULL && ((size_t)indices[0]) > idnum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
     // indices exist and are long enough, retrieve possible cached
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
    return indices[idnum+1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
  return -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1720
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
// Walk the list of dependent nmethods searching for nmethods which
10265
4c869854aebd 7071653: JSR 292: call site change notification should be pushed not pulled
twisti
parents: 9971
diff changeset
  1724
// are dependent on the changes that were passed in and mark them for
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
// deoptimization.  Returns the number of nmethods found.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1727
int InstanceKlass::mark_dependent_nmethods(DepChange& changes) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
  assert_locked_or_safepoint(CodeCache_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1729
  int found = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
  nmethodBucket* b = _dependencies;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
  while (b != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
    nmethod* nm = b->get_nmethod();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
    // since dependencies aren't removed until an nmethod becomes a zombie,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
    // the dependency list may contain nmethods which aren't alive.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
    if (nm->is_alive() && !nm->is_marked_for_deoptimization() && nm->check_dependency_on(changes)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
      if (TraceDependencies) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
        ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
        tty->print_cr("Marked for deoptimization");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
        tty->print_cr("  context = %s", this->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
        changes.print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
        nm->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
        nm->print_dependencies();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1743
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
      nm->mark_for_deoptimization();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
      found++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
    b = b->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1748
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1749
  return found;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1754
// Add an nmethodBucket to the list of dependencies for this nmethod.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1755
// It's possible that an nmethod has multiple dependencies on this klass
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1756
// so a count is kept for each bucket to guarantee that creation and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1757
// deletion of dependencies is consistent.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1759
void InstanceKlass::add_dependent_nmethod(nmethod* nm) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1760
  assert_locked_or_safepoint(CodeCache_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1761
  nmethodBucket* b = _dependencies;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1762
  nmethodBucket* last = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1763
  while (b != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
    if (nm == b->get_nmethod()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1765
      b->increment();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
    b = b->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
  _dependencies = new nmethodBucket(nm, _dependencies);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
// Decrement count of the nmethod in the dependency list and remove
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
// the bucket competely when the count goes to 0.  This method must
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
// find a corresponding bucket otherwise there's a bug in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
// recording of dependecies.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1780
void InstanceKlass::remove_dependent_nmethod(nmethod* nm) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
  assert_locked_or_safepoint(CodeCache_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
  nmethodBucket* b = _dependencies;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
  nmethodBucket* last = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
  while (b != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
    if (nm == b->get_nmethod()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
      if (b->decrement() == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
        if (last == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
          _dependencies = b->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
          last->set_next(b->next());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
        delete b;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
    last = b;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
    b = b->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
  tty->print_cr("### %s can't find dependent nmethod:", this->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
  nm->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
#endif // ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1806
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1807
#ifndef PRODUCT
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1808
void InstanceKlass::print_dependent_nmethods(bool verbose) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1809
  nmethodBucket* b = _dependencies;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1810
  int idx = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1811
  while (b != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1812
    nmethod* nm = b->get_nmethod();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1813
    tty->print("[%d] count=%d { ", idx++, b->count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1814
    if (!verbose) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1815
      nm->print_on(tty, "nmethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1816
      tty->print_cr(" } ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1817
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1818
      nm->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1819
      nm->print_dependencies();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1820
      tty->print_cr("--- } ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1821
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1822
    b = b->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1823
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1824
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1825
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1826
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1827
bool InstanceKlass::is_dependent_nmethod(nmethod* nm) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1828
  nmethodBucket* b = _dependencies;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1829
  while (b != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1830
    if (nm == b->get_nmethod()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1831
      return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1832
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1833
    b = b->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1834
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1835
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1836
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1837
#endif //PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1838
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1839
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1840
// Garbage collection
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1841
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1842
void InstanceKlass::oops_do(OopClosure* cl) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1843
  Klass::oops_do(cl);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1844
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1845
  cl->do_oop(adr_protection_domain());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1846
  cl->do_oop(adr_signers());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1847
  cl->do_oop(adr_init_lock());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1848
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1849
  // Don't walk the arrays since they are walked from the ClassLoaderData objects.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1850
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1851
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1852
#ifdef ASSERT
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1853
template <class T> void assert_is_in(T *p) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1854
  T heap_oop = oopDesc::load_heap_oop(p);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1855
  if (!oopDesc::is_null(heap_oop)) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1856
    oop o = oopDesc::decode_heap_oop_not_null(heap_oop);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1857
    assert(Universe::heap()->is_in(o), "should be in heap");
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1858
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1859
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1860
template <class T> void assert_is_in_closed_subset(T *p) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1861
  T heap_oop = oopDesc::load_heap_oop(p);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1862
  if (!oopDesc::is_null(heap_oop)) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1863
    oop o = oopDesc::decode_heap_oop_not_null(heap_oop);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1864
    assert(Universe::heap()->is_in_closed_subset(o),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1865
           err_msg("should be in closed *p " INTPTR_FORMAT " " INTPTR_FORMAT, (address)p, (address)o));
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1866
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1867
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1868
template <class T> void assert_is_in_reserved(T *p) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1869
  T heap_oop = oopDesc::load_heap_oop(p);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1870
  if (!oopDesc::is_null(heap_oop)) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1871
    oop o = oopDesc::decode_heap_oop_not_null(heap_oop);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1872
    assert(Universe::heap()->is_in_reserved(o), "should be in reserved");
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1873
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1874
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1875
template <class T> void assert_nothing(T *p) {}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1876
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1877
#else
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1878
template <class T> void assert_is_in(T *p) {}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1879
template <class T> void assert_is_in_closed_subset(T *p) {}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1880
template <class T> void assert_is_in_reserved(T *p) {}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1881
template <class T> void assert_nothing(T *p) {}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1882
#endif // ASSERT
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1883
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1884
//
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1885
// Macros that iterate over areas of oops which are specialized on type of
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1886
// oop pointer either narrow or wide, depending on UseCompressedOops
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1887
//
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1888
// Parameters are:
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1889
//   T         - type of oop to point to (either oop or narrowOop)
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1890
//   start_p   - starting pointer for region to iterate over
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1891
//   count     - number of oops or narrowOops to iterate over
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1892
//   do_oop    - action to perform on each oop (it's arbitrary C code which
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1893
//               makes it more efficient to put in a macro rather than making
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1894
//               it a template function)
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1895
//   assert_fn - assert function which is template function because performance
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1896
//               doesn't matter when enabled.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1897
#define InstanceKlass_SPECIALIZED_OOP_ITERATE( \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1898
  T, start_p, count, do_oop,                \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1899
  assert_fn)                                \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1900
{                                           \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1901
  T* p         = (T*)(start_p);             \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1902
  T* const end = p + (count);               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1903
  while (p < end) {                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1904
    (assert_fn)(p);                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1905
    do_oop;                                 \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1906
    ++p;                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1907
  }                                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1908
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1909
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1910
#define InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE( \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1911
  T, start_p, count, do_oop,                \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1912
  assert_fn)                                \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1913
{                                           \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1914
  T* const start = (T*)(start_p);           \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1915
  T*       p     = start + (count);         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1916
  while (start < p) {                       \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1917
    --p;                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1918
    (assert_fn)(p);                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1919
    do_oop;                                 \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1920
  }                                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1921
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1922
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1923
#define InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE( \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1924
  T, start_p, count, low, high,             \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1925
  do_oop, assert_fn)                        \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1926
{                                           \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1927
  T* const l = (T*)(low);                   \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1928
  T* const h = (T*)(high);                  \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1929
  assert(mask_bits((intptr_t)l, sizeof(T)-1) == 0 && \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1930
         mask_bits((intptr_t)h, sizeof(T)-1) == 0,   \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1931
         "bounded region must be properly aligned"); \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1932
  T* p       = (T*)(start_p);               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1933
  T* end     = p + (count);                 \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1934
  if (p < l) p = l;                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1935
  if (end > h) end = h;                     \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1936
  while (p < end) {                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1937
    (assert_fn)(p);                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1938
    do_oop;                                 \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1939
    ++p;                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1940
  }                                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1941
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1942
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1943
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1944
// The following macros call specialized macros, passing either oop or
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1945
// narrowOop as the specialization type.  These test the UseCompressedOops
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1946
// flag.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1947
#define InstanceKlass_OOP_MAP_ITERATE(obj, do_oop, assert_fn)            \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1948
{                                                                        \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1949
  /* Compute oopmap block range. The common case                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1950
     is nonstatic_oop_map_size == 1. */                                  \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1951
  OopMapBlock* map           = start_of_nonstatic_oop_maps();            \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  1952
  OopMapBlock* const end_map = map + nonstatic_oop_map_count();          \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1953
  if (UseCompressedOops) {                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1954
    while (map < end_map) {                                              \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1955
      InstanceKlass_SPECIALIZED_OOP_ITERATE(narrowOop,                   \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  1956
        obj->obj_field_addr<narrowOop>(map->offset()), map->count(),     \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1957
        do_oop, assert_fn)                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1958
      ++map;                                                             \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1959
    }                                                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1960
  } else {                                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1961
    while (map < end_map) {                                              \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1962
      InstanceKlass_SPECIALIZED_OOP_ITERATE(oop,                         \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  1963
        obj->obj_field_addr<oop>(map->offset()), map->count(),           \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1964
        do_oop, assert_fn)                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1965
      ++map;                                                             \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1966
    }                                                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1967
  }                                                                      \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1968
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1969
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1970
#define InstanceKlass_OOP_MAP_REVERSE_ITERATE(obj, do_oop, assert_fn)    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1971
{                                                                        \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1972
  OopMapBlock* const start_map = start_of_nonstatic_oop_maps();          \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  1973
  OopMapBlock* map             = start_map + nonstatic_oop_map_count();  \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1974
  if (UseCompressedOops) {                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1975
    while (start_map < map) {                                            \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1976
      --map;                                                             \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1977
      InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(narrowOop,           \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  1978
        obj->obj_field_addr<narrowOop>(map->offset()), map->count(),     \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1979
        do_oop, assert_fn)                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1980
    }                                                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1981
  } else {                                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1982
    while (start_map < map) {                                            \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1983
      --map;                                                             \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1984
      InstanceKlass_SPECIALIZED_OOP_REVERSE_ITERATE(oop,                 \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  1985
        obj->obj_field_addr<oop>(map->offset()), map->count(),           \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1986
        do_oop, assert_fn)                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1987
    }                                                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1988
  }                                                                      \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1989
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1990
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1991
#define InstanceKlass_BOUNDED_OOP_MAP_ITERATE(obj, low, high, do_oop,    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1992
                                              assert_fn)                 \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1993
{                                                                        \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1994
  /* Compute oopmap block range. The common case is                      \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1995
     nonstatic_oop_map_size == 1, so we accept the                       \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1996
     usually non-existent extra overhead of examining                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1997
     all the maps. */                                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  1998
  OopMapBlock* map           = start_of_nonstatic_oop_maps();            \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  1999
  OopMapBlock* const end_map = map + nonstatic_oop_map_count();          \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2000
  if (UseCompressedOops) {                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2001
    while (map < end_map) {                                              \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2002
      InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(narrowOop,           \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  2003
        obj->obj_field_addr<narrowOop>(map->offset()), map->count(),     \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2004
        low, high,                                                       \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2005
        do_oop, assert_fn)                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2006
      ++map;                                                             \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2007
    }                                                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2008
  } else {                                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2009
    while (map < end_map) {                                              \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2010
      InstanceKlass_SPECIALIZED_BOUNDED_OOP_ITERATE(oop,                 \
3693
af387bf37e8d 6861660: OopMapBlock count/size confusion
jcoomes
parents: 3576
diff changeset
  2011
        obj->obj_field_addr<oop>(map->offset()), map->count(),           \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2012
        low, high,                                                       \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2013
        do_oop, assert_fn)                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2014
      ++map;                                                             \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2015
    }                                                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2016
  }                                                                      \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2017
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2018
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2019
void InstanceKlass::oop_follow_contents(oop obj) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2020
  assert(obj != NULL, "can't follow the content of NULL object");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2021
  MarkSweep::follow_klass(obj->klass());
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2022
  InstanceKlass_OOP_MAP_ITERATE( \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2023
    obj, \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2024
    MarkSweep::mark_and_push(p), \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2025
    assert_is_in_closed_subset)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
#ifndef SERIALGC
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2029
void InstanceKlass::oop_follow_contents(ParCompactionManager* cm,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
                                        oop obj) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2031
  assert(obj != NULL, "can't follow the content of NULL object");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2032
  PSParallelCompact::follow_klass(cm, obj->klass());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2033
  // Only mark the header and let the scan of the meta-data mark
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2034
  // everything else.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2035
  InstanceKlass_OOP_MAP_ITERATE( \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2036
    obj, \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2037
    PSParallelCompact::mark_and_push(cm, p), \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2038
    assert_is_in)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2042
// closure's do_metadata() method dictates whether the given closure should be
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
// applied to the klass ptr in the object header.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2044
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2045
#define if_do_metadata_checked(closure, nv_suffix)                    \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2046
  /* Make sure the non-virtual and the virtual versions match. */     \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2047
  assert(closure->do_metadata##nv_suffix() == closure->do_metadata(), \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2048
      "Inconsistency in do_metadata");                                \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2049
  if (closure->do_metadata##nv_suffix())
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2050
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2051
#define InstanceKlass_OOP_OOP_ITERATE_DEFN(OopClosureType, nv_suffix)        \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2052
                                                                             \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2053
int InstanceKlass::oop_oop_iterate##nv_suffix(oop obj, OopClosureType* closure) { \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2054
  SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::ik);\
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2055
  /* header */                                                          \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2056
  if_do_metadata_checked(closure, nv_suffix) {                          \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2057
    closure->do_klass##nv_suffix(obj->klass());                         \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2058
  }                                                                     \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2059
  InstanceKlass_OOP_MAP_ITERATE(                                        \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2060
    obj,                                                                \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2061
    SpecializationStats::                                               \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2062
      record_do_oop_call##nv_suffix(SpecializationStats::ik);           \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2063
    (closure)->do_oop##nv_suffix(p),                                    \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2064
    assert_is_in_closed_subset)                                         \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2065
  return size_helper();                                                 \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2066
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2068
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2069
#define InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN(OopClosureType, nv_suffix) \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2070
                                                                                \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2071
int InstanceKlass::oop_oop_iterate_backwards##nv_suffix(oop obj,                \
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2072
                                              OopClosureType* closure) {        \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2073
  SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::ik); \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2074
  /* header */                                                                  \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2075
  if_do_metadata_checked(closure, nv_suffix) {                                  \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2076
    closure->do_klass##nv_suffix(obj->klass());                                 \
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2077
  }                                                                             \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2078
  /* instance variables */                                                      \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2079
  InstanceKlass_OOP_MAP_REVERSE_ITERATE(                                        \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2080
    obj,                                                                        \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2081
    SpecializationStats::record_do_oop_call##nv_suffix(SpecializationStats::ik);\
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2082
    (closure)->do_oop##nv_suffix(p),                                            \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2083
    assert_is_in_closed_subset)                                                 \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2084
   return size_helper();                                                        \
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2085
}
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2086
#endif // !SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2087
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2088
#define InstanceKlass_OOP_OOP_ITERATE_DEFN_m(OopClosureType, nv_suffix) \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2089
                                                                        \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2090
int InstanceKlass::oop_oop_iterate##nv_suffix##_m(oop obj,              \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2091
                                                  OopClosureType* closure, \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2092
                                                  MemRegion mr) {          \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2093
  SpecializationStats::record_iterate_call##nv_suffix(SpecializationStats::ik);\
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2094
  if_do_metadata_checked(closure, nv_suffix) {                           \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2095
    if (mr.contains(obj)) {                                              \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2096
      closure->do_klass##nv_suffix(obj->klass());                        \
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2097
    }                                                                    \
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2098
  }                                                                      \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2099
  InstanceKlass_BOUNDED_OOP_MAP_ITERATE(                                 \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2100
    obj, mr.start(), mr.end(),                                           \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2101
    (closure)->do_oop##nv_suffix(p),                                     \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2102
    assert_is_in_closed_subset)                                          \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2103
  return size_helper();                                                  \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2106
ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_DEFN)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2107
ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_DEFN)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_DEFN_m)
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2109
ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_DEFN_m)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2110
#ifndef SERIALGC
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2111
ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2112
ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceKlass_OOP_OOP_ITERATE_BACKWARDS_DEFN)
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
  2113
#endif // !SERIALGC
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2115
int InstanceKlass::oop_adjust_pointers(oop obj) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
  int size = size_helper();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2117
  InstanceKlass_OOP_MAP_ITERATE( \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2118
    obj, \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2119
    MarkSweep::adjust_pointer(p), \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2120
    assert_is_in)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2121
  MarkSweep::adjust_klass(obj->klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
  return size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
#ifndef SERIALGC
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2126
void InstanceKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2127
  InstanceKlass_OOP_MAP_REVERSE_ITERATE( \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2128
    obj, \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2129
    if (PSScavenge::should_scavenge(p)) { \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2130
      pm->claim_or_forward_depth(p); \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2131
    }, \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2132
    assert_nothing )
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2135
int InstanceKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2136
  int size = size_helper();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2137
  InstanceKlass_OOP_MAP_ITERATE( \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2138
    obj, \
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2139
    PSParallelCompact::adjust_pointer(p), \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2140
    assert_is_in)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2141
  obj->update_header(cm);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2142
  return size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
#endif // SERIALGC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2147
void InstanceKlass::clean_implementors_list(BoolObjectClosure* is_alive) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2148
  assert(is_loader_alive(is_alive), "this klass should be live");
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
  2149
  if (is_interface()) {
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
  2150
    if (ClassUnloading) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2151
      Klass* impl = implementor();
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
  2152
      if (impl != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2153
        if (!impl->is_loader_alive(is_alive)) {
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
  2154
          // remove this guy
12587
8f819769ca1b 7158552: The instanceKlsss::_host_klass is only needed for anonymous class for JSR 292 support.
jiangli
parents: 12369
diff changeset
  2155
          *adr_implementor() = NULL;
12369
48fd3da4025c 7154670: The instanceKlass _implementors[] and _nof_implementors are not needed for non-interface klass.
jiangli
parents: 12233
diff changeset
  2156
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
      }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2158
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2159
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2160
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2161
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2162
void InstanceKlass::clean_method_data(BoolObjectClosure* is_alive) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2163
#ifdef COMPILER2
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2164
  // Currently only used by C2.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2165
  for (int m = 0; m < methods()->length(); m++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2166
    MethodData* mdo = methods()->at(m)->method_data();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2167
    if (mdo != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2168
      for (ProfileData* data = mdo->first_data();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2169
           mdo->is_valid(data);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2170
           data = mdo->next_data(data)) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2171
        data->clean_weak_klass_links(is_alive);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2172
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2175
#else
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2176
#ifdef ASSERT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2177
  // Verify that we haven't started to use MDOs for C1.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2178
  for (int m = 0; m < methods()->length(); m++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2179
    MethodData* mdo = methods()->at(m)->method_data();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2180
    assert(mdo == NULL, "Didn't expect C1 to use MDOs");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2181
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2182
#endif // ASSERT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2183
#endif // !COMPILER2
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2184
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2185
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2186
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2187
static void remove_unshareable_in_class(Klass* k) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2188
  // remove klass's unshareable info
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2189
  k->remove_unshareable_info();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2190
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2191
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2192
void InstanceKlass::remove_unshareable_info() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2193
  Klass::remove_unshareable_info();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2194
  // Unlink the class
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2195
  if (is_linked()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2196
    unlink_class();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2197
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2198
  init_implementor();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2199
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2200
  constants()->remove_unshareable_info();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2201
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2202
  for (int i = 0; i < methods()->length(); i++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2203
    Method* m = methods()->at(i);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2204
    m->remove_unshareable_info();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2205
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2206
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2207
  // Need to reinstate when reading back the class.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2208
  set_init_lock(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2209
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2210
  // do array classes also.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2211
  array_klasses_do(remove_unshareable_in_class);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2214
void restore_unshareable_in_class(Klass* k, TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2215
  k->restore_unshareable_info(CHECK);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2218
void InstanceKlass::restore_unshareable_info(TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2219
  Klass::restore_unshareable_info(CHECK);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2220
  instanceKlassHandle ik(THREAD, this);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2221
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2222
  Array<Method*>* methods = ik->methods();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2223
  int num_methods = methods->length();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2224
  for (int index2 = 0; index2 < num_methods; ++index2) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2225
    methodHandle m(THREAD, methods->at(index2));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2226
    m()->link_method(m, CHECK);
13736
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
  2227
    // restore method's vtable by calling a virtual function
5b15a8f57979 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 13728
diff changeset
  2228
    m->restore_vtable();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2229
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2230
  if (JvmtiExport::has_redefined_a_class()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2231
    // Reinitialize vtable because RedefineClasses may have changed some
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2232
    // entries in this vtable for super classes so the CDS vtable might
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2233
    // point to old or obsolete entries.  RedefineClasses doesn't fix up
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2234
    // vtables in the shared system dictionary, only the main one.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2235
    // It also redefines the itable too so fix that too.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2236
    ResourceMark rm(THREAD);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2237
    ik->vtable()->initialize_vtable(false, CHECK);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2238
    ik->itable()->initialize_itable(false, CHECK);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2239
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2240
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2241
  // Allocate a simple java object for a lock.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2242
  // This needs to be a java object because during class initialization
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2243
  // it can be held across a java call.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2244
  typeArrayOop r = oopFactory::new_typeArray(T_INT, 0, CHECK);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2245
  Handle h(THREAD, (oop)r);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2246
  ik->set_init_lock(h());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2247
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2248
  // restore constant pool resolved references
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2249
  ik->constants()->restore_unshareable_info(CHECK);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2250
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2251
  ik->array_klasses_do(restore_unshareable_in_class, CHECK);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2252
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2253
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2254
static void clear_all_breakpoints(Method* m) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2255
  m->clear_all_breakpoints();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2257
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2258
void InstanceKlass::release_C_heap_structures() {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2259
  // Deallocate oop map cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
  if (_oop_map_cache != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
    delete _oop_map_cache;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2262
    _oop_map_cache = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2263
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2265
  // Deallocate JNI identifiers for jfieldIDs
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2266
  JNIid::deallocate(jni_ids());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
  set_jni_ids(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2268
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2269
  jmethodID* jmeths = methods_jmethod_ids_acquire();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
  if (jmeths != (jmethodID*)NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
    release_set_methods_jmethod_ids(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
    FreeHeap(jmeths);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
  int* indices = methods_cached_itable_indices_acquire();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2276
  if (indices != (int*)NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2277
    release_set_methods_cached_itable_indices(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
    FreeHeap(indices);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2279
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
  // release dependencies
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2282
  nmethodBucket* b = _dependencies;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
  _dependencies = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
  while (b != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
    nmethodBucket* next = b->next();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2286
    delete b;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2287
    b = next;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2290
  // Deallocate breakpoint records
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
  if (breakpoints() != 0x0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2292
    methods_do(clear_all_breakpoints);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
    assert(breakpoints() == 0x0, "should have cleared breakpoints");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2296
  // deallocate information about previous versions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2297
  if (_previous_versions != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
    for (int i = _previous_versions->length() - 1; i >= 0; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2299
      PreviousVersionNode * pv_node = _previous_versions->at(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2300
      delete pv_node;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
    delete _previous_versions;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
    _previous_versions = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
  // deallocate the cached class file
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
  if (_cached_class_file_bytes != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12587
diff changeset
  2308
    os::free(_cached_class_file_bytes, mtClass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
    _cached_class_file_bytes = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
    _cached_class_file_len = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2312
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2313
  // Decrement symbol reference counts associated with the unloaded class.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2314
  if (_name != NULL) _name->decrement_refcount();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2315
  // unreference array name derived from this class name (arrays of an unloaded
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2316
  // class can't be referenced anymore).
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2317
  if (_array_name != NULL)  _array_name->decrement_refcount();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2318
  if (_source_file_name != NULL) _source_file_name->decrement_refcount();
13201
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2319
  if (_source_debug_extension != NULL) FREE_C_HEAP_ARRAY(char, _source_debug_extension, mtClass);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2320
}
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2321
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2322
void InstanceKlass::set_source_file_name(Symbol* n) {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2323
  _source_file_name = n;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2324
  if (_source_file_name != NULL) _source_file_name->increment_refcount();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2325
}
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2326
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2327
void InstanceKlass::set_source_debug_extension(char* array, int length) {
13201
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2328
  if (array == NULL) {
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2329
    _source_debug_extension = NULL;
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2330
  } else {
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2331
    // Adding one to the attribute length in order to store a null terminator
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2332
    // character could cause an overflow because the attribute length is
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2333
    // already coded with an u4 in the classfile, but in practice, it's
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2334
    // unlikely to happen.
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2335
    assert((length+1) > length, "Overflow checking");
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2336
    char* sde = NEW_C_HEAP_ARRAY(char, (length + 1), mtClass);
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2337
    for (int i = 0; i < length; i++) {
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2338
      sde[i] = array[i];
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2339
    }
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2340
    sde[length] = '\0';
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2341
    _source_debug_extension = sde;
69f157caabcc 6294277: java -Xdebug crashes on SourceDebugExtension attribute larger than 64K
fparain
parents: 13195
diff changeset
  2342
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2343
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2344
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2345
address InstanceKlass::static_field_addr(int offset) {
13738
d67be49a5beb 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 13736
diff changeset
  2346
  return (address)(offset + InstanceMirrorKlass::offset_of_static_fields() + (intptr_t)java_mirror());
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2347
}
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2348
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2349
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2350
const char* InstanceKlass::signature_name() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
  const char* src = (const char*) (name()->as_C_string());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
  const int src_length = (int)strlen(src);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
  char* dest = NEW_RESOURCE_ARRAY(char, src_length + 3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
  int src_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
  int dest_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
  dest[dest_index++] = 'L';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
  while (src_index < src_length) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
    dest[dest_index++] = src[src_index++];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
  dest[dest_index++] = ';';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
  dest[dest_index] = '\0';
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
  return dest;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2363
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
// different verisons of is_same_class_package
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2366
bool InstanceKlass::is_same_class_package(Klass* class2) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2367
  Klass* class1 = this;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2368
  oop classloader1 = InstanceKlass::cast(class1)->class_loader();
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2369
  Symbol* classname1 = Klass::cast(class1)->name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
  if (Klass::cast(class2)->oop_is_objArray()) {
13952
e3cf184080bc 8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents: 13738
diff changeset
  2372
    class2 = ObjArrayKlass::cast(class2)->bottom_klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
  oop classloader2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
  if (Klass::cast(class2)->oop_is_instance()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2376
    classloader2 = InstanceKlass::cast(class2)->class_loader();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2378
    assert(Klass::cast(class2)->oop_is_typeArray(), "should be type array");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2379
    classloader2 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2380
  }
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2381
  Symbol* classname2 = Klass::cast(class2)->name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2382
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2383
  return InstanceKlass::is_same_class_package(classloader1, classname1,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2384
                                              classloader2, classname2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2385
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2386
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2387
bool InstanceKlass::is_same_class_package(oop classloader2, Symbol* classname2) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2388
  Klass* class1 = this;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2389
  oop classloader1 = InstanceKlass::cast(class1)->class_loader();
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2390
  Symbol* classname1 = Klass::cast(class1)->name();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2391
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2392
  return InstanceKlass::is_same_class_package(classloader1, classname1,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2393
                                              classloader2, classname2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2394
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2395
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2396
// return true if two classes are in the same package, classloader
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2397
// and classname information is enough to determine a class's package
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2398
bool InstanceKlass::is_same_class_package(oop class_loader1, Symbol* class_name1,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2399
                                          oop class_loader2, Symbol* class_name2) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2400
  if (class_loader1 != class_loader2) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2401
    return false;
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2402
  } else if (class_name1 == class_name2) {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2403
    return true;                // skip painful bytewise comparison
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2404
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2405
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2406
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2407
    // The Symbol*'s are in UTF8 encoding. Since we only need to check explicitly
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2408
    // for ASCII characters ('/', 'L', '['), we can keep them in UTF8 encoding.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2409
    // Otherwise, we just compare jbyte values between the strings.
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2410
    const jbyte *name1 = class_name1->base();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2411
    const jbyte *name2 = class_name2->base();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2412
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2413
    const jbyte *last_slash1 = UTF8::strrchr(name1, class_name1->utf8_length(), '/');
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2414
    const jbyte *last_slash2 = UTF8::strrchr(name2, class_name2->utf8_length(), '/');
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2415
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2416
    if ((last_slash1 == NULL) || (last_slash2 == NULL)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2417
      // One of the two doesn't have a package.  Only return true
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2418
      // if the other one also doesn't have a package.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2419
      return last_slash1 == last_slash2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2420
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2421
      // Skip over '['s
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2422
      if (*name1 == '[') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2423
        do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2424
          name1++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2425
        } while (*name1 == '[');
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2426
        if (*name1 != 'L') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2427
          // Something is terribly wrong.  Shouldn't be here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2428
          return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2429
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2430
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2431
      if (*name2 == '[') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2432
        do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2433
          name2++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2434
        } while (*name2 == '[');
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2435
        if (*name2 != 'L') {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2436
          // Something is terribly wrong.  Shouldn't be here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2437
          return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2438
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2439
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2440
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2441
      // Check that package part is identical
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2442
      int length1 = last_slash1 - name1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2443
      int length2 = last_slash2 - name2;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2444
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2445
      return UTF8::equal(name1, length1, name2, length2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2446
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2447
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2448
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2449
2264
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2450
// Returns true iff super_method can be overridden by a method in targetclassname
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2451
// See JSL 3rd edition 8.4.6.1
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2452
// Assumes name-signature match
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2453
// "this" is InstanceKlass of super_method which must exist
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2454
// note that the InstanceKlass of the method in the targetclassname has not always been created yet
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2455
bool InstanceKlass::is_override(methodHandle super_method, Handle targetclassloader, Symbol* targetclassname, TRAPS) {
2264
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2456
   // Private methods can not be overridden
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2457
   if (super_method->is_private()) {
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2458
     return false;
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2459
   }
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2460
   // If super method is accessible, then override
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2461
   if ((super_method->is_protected()) ||
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2462
       (super_method->is_public())) {
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2463
     return true;
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2464
   }
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2465
   // Package-private methods are not inherited outside of package
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2466
   assert(super_method->is_package_private(), "must be package private");
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2467
   return(is_same_class_package(targetclassloader(), targetclassname));
2264
55d0115a54fe 4766230: Hotspot vtable inconsistencies cause core dumps. 6579515. 6582242.
acorn
parents: 2131
diff changeset
  2468
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2469
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2470
/* defined for now in jvm.cpp, for historical reasons *--
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2471
Klass* InstanceKlass::compute_enclosing_class_impl(instanceKlassHandle self,
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  2472
                                                     Symbol*& simple_name_result, TRAPS) {
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2473
  ...
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2474
}
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2475
*/
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2476
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2477
// tell if two classes have the same enclosing class (at package level)
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2478
bool InstanceKlass::is_same_package_member_impl(instanceKlassHandle class1,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2479
                                                Klass* class2_oop, TRAPS) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2480
  if (class2_oop == class1())                       return true;
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2481
  if (!Klass::cast(class2_oop)->oop_is_instance())  return false;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2482
  instanceKlassHandle class2(THREAD, class2_oop);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2483
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2484
  // must be in same package before we try anything else
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2485
  if (!class1->is_same_class_package(class2->class_loader(), class2->name()))
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2486
    return false;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2487
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2488
  // As long as there is an outer1.getEnclosingClass,
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2489
  // shift the search outward.
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2490
  instanceKlassHandle outer1 = class1;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2491
  for (;;) {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2492
    // As we walk along, look for equalities between outer1 and class2.
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2493
    // Eventually, the walks will terminate as outer1 stops
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2494
    // at the top-level class around the original class.
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4094
diff changeset
  2495
    bool ignore_inner_is_member;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2496
    Klass* next = outer1->compute_enclosing_class(&ignore_inner_is_member,
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4094
diff changeset
  2497
                                                    CHECK_false);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2498
    if (next == NULL)  break;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2499
    if (next == class2())  return true;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2500
    outer1 = instanceKlassHandle(THREAD, next);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2501
  }
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2502
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2503
  // Now do the same for class2.
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2504
  instanceKlassHandle outer2 = class2;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2505
  for (;;) {
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4094
diff changeset
  2506
    bool ignore_inner_is_member;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2507
    Klass* next = outer2->compute_enclosing_class(&ignore_inner_is_member,
4496
c5a0b15a8e7d 6895168: JCK api/signaturetest/sigtest.basic.html#basic test fails for jdk 5.0 with HS 16 in nightly build
xlu
parents: 4094
diff changeset
  2508
                                                    CHECK_false);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2509
    if (next == NULL)  break;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2510
    // Might as well check the new outer against all available values.
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2511
    if (next == class1())  return true;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2512
    if (next == outer1())  return true;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2513
    outer2 = instanceKlassHandle(THREAD, next);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2514
  }
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2515
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2516
  // If by this point we have not found an equality between the
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2517
  // two classes, we know they are in separate package members.
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2518
  return false;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2519
}
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2520
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2521
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2522
jint InstanceKlass::compute_modifier_flags(TRAPS) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
  jint access = access_flags().as_int();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
  // But check if it happens to be member class.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2526
  instanceKlassHandle ik(THREAD, this);
12231
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2527
  InnerClassesIterator iter(ik);
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2528
  for (; !iter.done(); iter.next()) {
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2529
    int ioff = iter.inner_class_info_index();
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2530
    // Inner class attribute can be zero, skip it.
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2531
    // Strange but true:  JVM spec. allows null inner class refs.
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2532
    if (ioff == 0) continue;
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2533
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2534
    // only look at classes that are already loaded
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2535
    // since we are looking for the flags for our self.
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2536
    Symbol* inner_name = ik->constants()->klass_name_at(ioff);
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2537
    if ((ik->name() == inner_name)) {
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2538
      // This is really a member class.
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2539
      access = iter.inner_access_flags();
6a9cfc59a18a 7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents: 11407
diff changeset
  2540
      break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2543
  // Remember to strip ACC_SUPER bit
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
  return (access & (~JVM_ACC_SUPER)) & JVM_ACC_WRITTEN_FLAGS;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2546
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2547
jint InstanceKlass::jvmti_class_status() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2548
  jint result = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2550
  if (is_linked()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
    result |= JVMTI_CLASS_STATUS_VERIFIED | JVMTI_CLASS_STATUS_PREPARED;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
  if (is_initialized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
    assert(is_linked(), "Class status is not consistent");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
    result |= JVMTI_CLASS_STATUS_INITIALIZED;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2558
  if (is_in_error_state()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
    result |= JVMTI_CLASS_STATUS_ERROR;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2564
Method* InstanceKlass::method_at_itable(Klass* holder, int index, TRAPS) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
  itableOffsetEntry* ioe = (itableOffsetEntry*)start_of_itable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
  int method_table_offset_in_words = ioe->offset()/wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
  int nof_interfaces = (method_table_offset_in_words - itable_offset_in_words())
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
                       / itableOffsetEntry::size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2570
  for (int cnt = 0 ; ; cnt ++, ioe ++) {
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1388
diff changeset
  2571
    // If the interface isn't implemented by the receiver class,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
    // the VM should throw IncompatibleClassChangeError.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2573
    if (cnt >= nof_interfaces) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2574
      THROW_NULL(vmSymbols::java_lang_IncompatibleClassChangeError());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2577
    Klass* ik = ioe->interface_klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
    if (ik == holder) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2580
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2581
  itableMethodEntry* ime = ioe->first_method_entry(this);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2582
  Method* m = ime[index].method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2583
  if (m == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2584
    THROW_NULL(vmSymbols::java_lang_AbstractMethodError());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
  return m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2588
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
// On-stack replacement stuff
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2590
void InstanceKlass::add_osr_nmethod(nmethod* n) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2591
  // only one compilation can be active
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
  NEEDS_CLEANUP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2593
  // This is a short non-blocking critical region, so the no safepoint check is ok.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2594
  OsrList_lock->lock_without_safepoint_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2595
  assert(n->is_osr_method(), "wrong kind of nmethod");
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3576
diff changeset
  2596
  n->set_osr_link(osr_nmethods_head());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
  set_osr_nmethods_head(n);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2598
  // Raise the highest osr level if necessary
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2599
  if (TieredCompilation) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2600
    Method* m = n->method();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2601
    m->set_highest_osr_comp_level(MAX2(m->highest_osr_comp_level(), n->comp_level()));
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2602
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2603
  // Remember to unlock again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
  OsrList_lock->unlock();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2605
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2606
  // Get rid of the osr methods for the same bci that have lower levels.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2607
  if (TieredCompilation) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2608
    for (int l = CompLevel_limited_profile; l < n->comp_level(); l++) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2609
      nmethod *inv = lookup_osr_nmethod(n->method(), n->osr_entry_bci(), l, true);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2610
      if (inv != NULL && inv->is_in_use()) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2611
        inv->make_not_entrant();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2612
      }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2613
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2614
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2618
void InstanceKlass::remove_osr_nmethod(nmethod* n) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
  // This is a short non-blocking critical region, so the no safepoint check is ok.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2620
  OsrList_lock->lock_without_safepoint_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2621
  assert(n->is_osr_method(), "wrong kind of nmethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2622
  nmethod* last = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2623
  nmethod* cur  = osr_nmethods_head();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2624
  int max_level = CompLevel_none;  // Find the max comp level excluding n
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2625
  Method* m = n->method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
  // Search for match
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
  while(cur != NULL && cur != n) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2628
    if (TieredCompilation) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2629
      // Find max level before n
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2630
      max_level = MAX2(max_level, cur->comp_level());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2631
    }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
    last = cur;
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3576
diff changeset
  2633
    cur = cur->osr_link();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
  }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2635
  nmethod* next = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2636
  if (cur == n) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2637
    next = cur->osr_link();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
    if (last == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
      // Remove first element
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2640
      set_osr_nmethods_head(next);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
    } else {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2642
      last->set_osr_link(next);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
  }
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3576
diff changeset
  2645
  n->set_osr_link(NULL);
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2646
  if (TieredCompilation) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2647
    cur = next;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2648
    while (cur != NULL) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2649
      // Find max level after n
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2650
      max_level = MAX2(max_level, cur->comp_level());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2651
      cur = cur->osr_link();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2652
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2653
    m->set_highest_osr_comp_level(max_level);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2654
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
  // Remember to unlock again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
  OsrList_lock->unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2657
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2659
nmethod* InstanceKlass::lookup_osr_nmethod(Method* const m, int bci, int comp_level, bool match_level) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2660
  // This is a short non-blocking critical region, so the no safepoint check is ok.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
  OsrList_lock->lock_without_safepoint_check();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
  nmethod* osr = osr_nmethods_head();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2663
  nmethod* best = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
  while (osr != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
    assert(osr->is_osr_method(), "wrong kind of nmethod found in chain");
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2666
    // There can be a time when a c1 osr method exists but we are waiting
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2667
    // for a c2 version. When c2 completes its osr nmethod we will trash
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2668
    // the c1 version and only be able to find the c2 version. However
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2669
    // while we overflow in the c1 code at back branches we don't want to
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2670
    // try and switch to the same code as we are already running
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2671
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
    if (osr->method() == m &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
        (bci == InvocationEntryBci || osr->osr_entry_bci() == bci)) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2674
      if (match_level) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2675
        if (osr->comp_level() == comp_level) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2676
          // Found a match - return it.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2677
          OsrList_lock->unlock();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2678
          return osr;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2679
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2680
      } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2681
        if (best == NULL || (osr->comp_level() > best->comp_level())) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2682
          if (osr->comp_level() == CompLevel_highest_tier) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2683
            // Found the best possible - return it.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2684
            OsrList_lock->unlock();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2685
            return osr;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2686
          }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2687
          best = osr;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2688
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2689
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
    }
3908
24b55ad4c228 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 3576
diff changeset
  2691
    osr = osr->osr_link();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
  OsrList_lock->unlock();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2694
  if (best != NULL && best->comp_level() >= comp_level && match_level == false) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2695
    return best;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6421
diff changeset
  2696
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2697
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
// -----------------------------------------------------------------------------------------------------
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2701
// Printing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2702
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2703
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2704
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2705
#define BULLET  " - "
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2706
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2707
static const char* state_names[] = {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2708
  "allocated", "loaded", "linked", "being_initialized", "fully_initialized", "initialization_error"
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2709
};
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2710
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2711
void InstanceKlass::print_on(outputStream* st) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2712
  assert(is_klass(), "must be klass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2713
  Klass::print_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2714
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2715
  st->print(BULLET"instance size:     %d", size_helper());                        st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2716
  st->print(BULLET"klass size:        %d", size());                               st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2717
  st->print(BULLET"access:            "); access_flags().print_on(st);            st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2718
  st->print(BULLET"state:             "); st->print_cr(state_names[_init_state]);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2719
  st->print(BULLET"name:              "); name()->print_value_on(st);             st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2720
  st->print(BULLET"super:             "); super()->print_value_on_maybe_null(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2721
  st->print(BULLET"sub:               ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2722
  Klass* sub = subklass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2723
  int n;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2724
  for (n = 0; sub != NULL; n++, sub = sub->next_sibling()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2725
    if (n < MaxSubklassPrintSize) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2726
      sub->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2727
      st->print("   ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2728
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2729
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2730
  if (n >= MaxSubklassPrintSize) st->print("(%d more klasses...)", n - MaxSubklassPrintSize);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2731
  st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2732
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2733
  if (is_interface()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2734
    st->print_cr(BULLET"nof implementors:  %d", nof_implementors());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2735
    if (nof_implementors() == 1) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2736
      st->print_cr(BULLET"implementor:    ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2737
      st->print("   ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2738
      implementor()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2739
      st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2740
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2741
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2742
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2743
  st->print(BULLET"arrays:            "); array_klasses()->print_value_on_maybe_null(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2744
  st->print(BULLET"methods:           "); methods()->print_value_on(st);                  st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2745
  if (Verbose) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2746
    Array<Method*>* method_array = methods();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2747
    for(int i = 0; i < method_array->length(); i++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2748
      st->print("%d : ", i); method_array->at(i)->print_value(); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2749
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2750
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2751
  st->print(BULLET"method ordering:   "); method_ordering()->print_value_on(st);       st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2752
  st->print(BULLET"local interfaces:  "); local_interfaces()->print_value_on(st);      st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2753
  st->print(BULLET"trans. interfaces: "); transitive_interfaces()->print_value_on(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2754
  st->print(BULLET"constants:         "); constants()->print_value_on(st);         st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2755
  if (class_loader_data() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2756
    st->print(BULLET"class loader data:  ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2757
    class_loader_data()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2758
    st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2759
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2760
  st->print(BULLET"protection domain: "); ((InstanceKlass*)this)->protection_domain()->print_value_on(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2761
  st->print(BULLET"host class:        "); host_klass()->print_value_on_maybe_null(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2762
  st->print(BULLET"signers:           "); signers()->print_value_on(st);               st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2763
  st->print(BULLET"init_lock:         "); ((oop)init_lock())->print_value_on(st);             st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2764
  if (source_file_name() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2765
    st->print(BULLET"source file:       ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2766
    source_file_name()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2767
    st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2768
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2769
  if (source_debug_extension() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2770
    st->print(BULLET"source debug extension:       ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2771
    st->print("%s", source_debug_extension());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2772
    st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2773
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2774
  st->print(BULLET"annotations:       "); annotations()->print_value_on(st); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2775
  {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2776
    ResourceMark rm;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2777
    // PreviousVersionInfo objects returned via PreviousVersionWalker
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2778
    // contain a GrowableArray of handles. We have to clean up the
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2779
    // GrowableArray _after_ the PreviousVersionWalker destructor
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2780
    // has destroyed the handles.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2781
    {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2782
      bool have_pv = false;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2783
      PreviousVersionWalker pvw((InstanceKlass*)this);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2784
      for (PreviousVersionInfo * pv_info = pvw.next_previous_version();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2785
           pv_info != NULL; pv_info = pvw.next_previous_version()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2786
        if (!have_pv)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2787
          st->print(BULLET"previous version:  ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2788
        have_pv = true;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2789
        pv_info->prev_constant_pool_handle()()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2790
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2791
      if (have_pv)  st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2792
    } // pvw is cleaned up
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2793
  } // rm is cleaned up
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2794
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2795
  if (generic_signature() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2796
    st->print(BULLET"generic signature: ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2797
    generic_signature()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2798
    st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2799
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2800
  st->print(BULLET"inner classes:     "); inner_classes()->print_value_on(st);     st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2801
  st->print(BULLET"java mirror:       "); java_mirror()->print_value_on(st);       st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2802
  st->print(BULLET"vtable length      %d  (start addr: " INTPTR_FORMAT ")", vtable_length(), start_of_vtable());  st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2803
  st->print(BULLET"itable length      %d (start addr: " INTPTR_FORMAT ")", itable_length(), start_of_itable()); st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2804
  st->print_cr(BULLET"---- static fields (%d words):", static_field_size());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2805
  FieldPrinter print_static_field(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2806
  ((InstanceKlass*)this)->do_local_static_fields(&print_static_field);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2807
  st->print_cr(BULLET"---- non-static fields (%d words):", nonstatic_field_size());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2808
  FieldPrinter print_nonstatic_field(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2809
  ((InstanceKlass*)this)->do_nonstatic_fields(&print_nonstatic_field);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2810
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2811
  st->print(BULLET"non-static oop maps: ");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2812
  OopMapBlock* map     = start_of_nonstatic_oop_maps();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2813
  OopMapBlock* end_map = map + nonstatic_oop_map_count();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2814
  while (map < end_map) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2815
    st->print("%d-%d ", map->offset(), map->offset() + heapOopSize*(map->count() - 1));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2816
    map++;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2817
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2818
  st->cr();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2819
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2820
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2821
#endif //PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2822
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2823
void InstanceKlass::print_value_on(outputStream* st) const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2824
  assert(is_klass(), "must be klass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2825
  name()->print_value_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2826
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2827
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2828
#ifndef PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2829
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2830
void FieldPrinter::do_field(fieldDescriptor* fd) {
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2831
  _st->print(BULLET);
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2832
   if (_obj == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2833
     fd->print_on(_st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2834
     _st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2835
   } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2836
     fd->print_on_for(_st, _obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2837
     _st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2838
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2839
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2840
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2841
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2842
void InstanceKlass::oop_print_on(oop obj, outputStream* st) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2843
  Klass::oop_print_on(obj, st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2844
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2845
  if (this == SystemDictionary::String_klass()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2846
    typeArrayOop value  = java_lang_String::value(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2847
    juint        offset = java_lang_String::offset(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2848
    juint        length = java_lang_String::length(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2849
    if (value != NULL &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2850
        value->is_typeArray() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2851
        offset          <= (juint) value->length() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2852
        offset + length <= (juint) value->length()) {
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2853
      st->print(BULLET"string: ");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2854
      Handle h_obj(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2855
      java_lang_String::print(h_obj, st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2856
      st->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2857
      if (!WizardMode)  return;  // that is enough
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2858
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2859
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2860
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2861
  st->print_cr(BULLET"---- fields (total size %d words):", oop_size(obj));
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2862
  FieldPrinter print_field(st, obj);
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2863
  do_nonstatic_fields(&print_field);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2864
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2865
  if (this == SystemDictionary::Class_klass()) {
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2866
    st->print(BULLET"signature: ");
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2867
    java_lang_Class::print_signature(obj, st);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2868
    st->cr();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2869
    Klass* mirrored_klass = java_lang_Class::as_Klass(obj);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2870
    st->print(BULLET"fake entry for mirror: ");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2871
    mirrored_klass->print_value_on_maybe_null(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2872
    st->cr();
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2873
    st->print(BULLET"fake entry resolved_constructor: ");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2874
    Method* ctor = java_lang_Class::resolved_constructor(obj);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2875
    ctor->print_value_on_maybe_null(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2876
    Klass* array_klass = java_lang_Class::array_klass(obj);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2877
    st->cr();
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2878
    st->print(BULLET"fake entry for array: ");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2879
    array_klass->print_value_on_maybe_null(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2880
    st->cr();
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2881
    st->print_cr(BULLET"fake entry for oop_size: %d", java_lang_Class::oop_size(obj));
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2882
    st->print_cr(BULLET"fake entry for static_oop_field_count: %d", java_lang_Class::static_oop_field_count(obj));
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2883
    Klass* real_klass = java_lang_Class::as_Klass(obj);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2884
    if (real_klass != NULL && real_klass->oop_is_instance()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2885
      InstanceKlass::cast(real_klass)->do_local_static_fields(&print_field);
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8676
diff changeset
  2886
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2887
  } else if (this == SystemDictionary::MethodType_klass()) {
4094
1f424b2b2171 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 3916
diff changeset
  2888
    st->print(BULLET"signature: ");
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 8653
diff changeset
  2889
    java_lang_invoke_MethodType::print_signature(obj, st);
4094
1f424b2b2171 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 3916
diff changeset
  2890
    st->cr();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2892
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2893
4584
e2a449e8cc6f 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 4573
diff changeset
  2894
#endif //PRODUCT
e2a449e8cc6f 6912062: disassembler plugin needs to produce symbolic information in product mode
jrose
parents: 4573
diff changeset
  2895
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2896
void InstanceKlass::oop_print_value_on(oop obj, outputStream* st) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2897
  st->print("a ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
  name()->print_value_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
  obj->print_address_on(st);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2900
  if (this == SystemDictionary::String_klass()
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2901
      && java_lang_String::value(obj) != NULL) {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2902
    ResourceMark rm;
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2903
    int len = java_lang_String::length(obj);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2904
    int plen = (len < 24 ? len : 12);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2905
    char* str = java_lang_String::as_utf8_string(obj, 0, plen);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2906
    st->print(" = \"%s\"", str);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2907
    if (len > plen)
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2908
      st->print("...[%d]", len);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2909
  } else if (this == SystemDictionary::Class_klass()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2910
    Klass* k = java_lang_Class::as_Klass(obj);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2911
    st->print(" = ");
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2912
    if (k != NULL) {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2913
      k->print_value_on(st);
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2914
    } else {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2915
      const char* tname = type2name(java_lang_Class::primitive_type(obj));
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2916
      st->print("%s", tname ? tname : "type?");
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2917
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2918
  } else if (this == SystemDictionary::MethodType_klass()) {
4094
1f424b2b2171 6815692: method handle code needs some cleanup (post-6655638)
jrose
parents: 3916
diff changeset
  2919
    st->print(" = ");
8676
9098d4e927e1 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 8653
diff changeset
  2920
    java_lang_invoke_MethodType::print_signature(obj, st);
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2921
  } else if (java_lang_boxing_object::is_instance(obj)) {
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2922
    st->print(" = ");
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2923
    java_lang_boxing_object::print(obj, st);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2924
  } else if (this == SystemDictionary::LambdaForm_klass()) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2925
    oop vmentry = java_lang_invoke_LambdaForm::vmentry(obj);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2926
    if (vmentry != NULL) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2927
      st->print(" => ");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2928
      vmentry->print_value_on(st);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2929
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2930
  } else if (this == SystemDictionary::MemberName_klass()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2931
    Metadata* vmtarget = java_lang_invoke_MemberName::vmtarget(obj);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2932
    if (vmtarget != NULL) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2933
      st->print(" = ");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2934
      vmtarget->print_value_on(st);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2935
    } else {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2936
      java_lang_invoke_MemberName::clazz(obj)->print_value_on(st);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2937
      st->print(".");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2938
      java_lang_invoke_MemberName::name(obj)->print_value_on(st);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13201
diff changeset
  2939
    }
2332
5c7b6f4ce0a1 6814659: separable cleanups and subroutines for 6655638
jrose
parents: 2131
diff changeset
  2940
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2943
const char* InstanceKlass::internal_name() const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
  return external_name();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
// Verification
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
class VerifyFieldClosure: public OopClosure {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2950
 protected:
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2951
  template <class T> void do_oop_work(T* p) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2952
    oop obj = oopDesc::load_decode_heap_oop(p);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2953
    if (!obj->is_oop_or_null()) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2954
      tty->print_cr("Failed: " PTR_FORMAT " -> " PTR_FORMAT, p, (address)obj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2955
      Universe::print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2956
      guarantee(false, "boom");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2957
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2958
  }
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2959
 public:
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2960
  virtual void do_oop(oop* p)       { VerifyFieldClosure::do_oop_work(p); }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  2961
  virtual void do_oop(narrowOop* p) { VerifyFieldClosure::do_oop_work(p); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2962
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2963
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2964
void InstanceKlass::verify_on(outputStream* st) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2965
  Klass::verify_on(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2966
  Thread *thread = Thread::current();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2967
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2968
#ifndef PRODUCT
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2969
  // Avoid redundant verifies
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2970
  if (_verify_count == Universe::verify_count()) return;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2971
  _verify_count = Universe::verify_count();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2972
#endif
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2973
  // Verify that klass is present in SystemDictionary
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2974
  if (is_loaded() && !is_anonymous()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2975
    Symbol* h_name = name();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2976
    SystemDictionary::verify_obj_klass_present(h_name, class_loader_data());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2977
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2978
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2979
  // Verify static fields
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2980
  VerifyFieldClosure blk;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2981
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2982
  // Verify vtables
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2983
  if (is_linked()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2984
    ResourceMark rm(thread);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2985
    // $$$ This used to be done only for m/s collections.  Doing it
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2986
    // always seemed a valid generalization.  (DLD -- 6/00)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2987
    vtable()->verify(st);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2988
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2989
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2990
  // Verify first subklass
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2991
  if (subklass_oop() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2992
    guarantee(subklass_oop()->is_metadata(), "should be in metaspace");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2993
    guarantee(subklass_oop()->is_klass(), "should be klass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2994
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2995
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2996
  // Verify siblings
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2997
  Klass* super = this->super();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2998
  Klass* sib = next_sibling();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2999
  if (sib != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3000
    if (sib == this) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3001
      fatal(err_msg("subclass points to itself " PTR_FORMAT, sib));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3002
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3003
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3004
    guarantee(sib->is_metadata(), "should be in metaspace");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3005
    guarantee(sib->is_klass(), "should be klass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3006
    guarantee(sib->super() == super, "siblings should have same superklass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3007
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3008
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3009
  // Verify implementor fields
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3010
  Klass* im = implementor();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3011
  if (im != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3012
    guarantee(is_interface(), "only interfaces should have implementor set");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3013
    guarantee(im->is_klass(), "should be klass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3014
    guarantee(!Klass::cast(im)->is_interface() || im == this,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3015
      "implementors cannot be interfaces");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3016
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3017
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3018
  // Verify local interfaces
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3019
  if (local_interfaces()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3020
    Array<Klass*>* local_interfaces = this->local_interfaces();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3021
    for (int j = 0; j < local_interfaces->length(); j++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3022
      Klass* e = local_interfaces->at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3023
      guarantee(e->is_klass() && Klass::cast(e)->is_interface(), "invalid local interface");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3024
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3025
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3026
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3027
  // Verify transitive interfaces
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3028
  if (transitive_interfaces() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3029
    Array<Klass*>* transitive_interfaces = this->transitive_interfaces();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3030
    for (int j = 0; j < transitive_interfaces->length(); j++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3031
      Klass* e = transitive_interfaces->at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3032
      guarantee(e->is_klass() && Klass::cast(e)->is_interface(), "invalid transitive interface");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3033
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3034
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3035
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3036
  // Verify methods
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3037
  if (methods() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3038
    Array<Method*>* methods = this->methods();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3039
    for (int j = 0; j < methods->length(); j++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3040
      guarantee(methods->at(j)->is_metadata(), "should be in metaspace");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3041
      guarantee(methods->at(j)->is_method(), "non-method in methods array");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3042
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3043
    for (int j = 0; j < methods->length() - 1; j++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3044
      Method* m1 = methods->at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3045
      Method* m2 = methods->at(j + 1);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3046
      guarantee(m1->name()->fast_compare(m2->name()) <= 0, "methods not sorted correctly");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3047
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3048
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3049
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3050
  // Verify method ordering
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3051
  if (method_ordering() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3052
    Array<int>* method_ordering = this->method_ordering();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3053
    int length = method_ordering->length();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3054
    if (JvmtiExport::can_maintain_original_method_order() ||
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3055
        (UseSharedSpaces && length != 0)) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3056
      guarantee(length == methods()->length(), "invalid method ordering length");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3057
      jlong sum = 0;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3058
      for (int j = 0; j < length; j++) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3059
        int original_index = method_ordering->at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3060
        guarantee(original_index >= 0, "invalid method ordering index");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3061
        guarantee(original_index < length, "invalid method ordering index");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3062
        sum += original_index;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3063
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3064
      // Verify sum of indices 0,1,...,length-1
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3065
      guarantee(sum == ((jlong)length*(length-1))/2, "invalid method ordering sum");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3066
    } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3067
      guarantee(length == 0, "invalid method ordering length");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3068
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3069
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3070
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3071
  // Verify JNI static field identifiers
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3072
  if (jni_ids() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3073
    jni_ids()->verify(this);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3074
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3075
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3076
  // Verify other fields
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3077
  if (array_klasses() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3078
    guarantee(array_klasses()->is_metadata(), "should be in metaspace");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3079
    guarantee(array_klasses()->is_klass(), "should be klass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3080
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3081
  if (constants() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3082
    guarantee(constants()->is_metadata(), "should be in metaspace");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3083
    guarantee(constants()->is_constantPool(), "should be constant pool");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3084
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3085
  if (protection_domain() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3086
    guarantee(protection_domain()->is_oop(), "should be oop");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3087
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3088
  if (host_klass() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3089
    guarantee(host_klass()->is_metadata(), "should be in metaspace");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3090
    guarantee(host_klass()->is_klass(), "should be klass");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3091
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3092
  if (signers() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3093
    guarantee(signers()->is_objArray(), "should be obj array");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3094
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3095
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3096
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3097
void InstanceKlass::oop_verify_on(oop obj, outputStream* st) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3098
  Klass::oop_verify_on(obj, st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3099
  VerifyFieldClosure blk;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3100
  obj->oop_iterate_no_header(&blk);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3101
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3103
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3104
// JNIid class for jfieldIDs only
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3105
// Note to reviewers:
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3106
// These JNI functions are just moved over to column 1 and not changed
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3107
// in the compressed oops workspace.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3108
JNIid::JNIid(Klass* holder, int offset, JNIid* next) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3109
  _holder = holder;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3110
  _offset = offset;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3111
  _next = next;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3112
  debug_only(_is_static_field_id = false;)
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3113
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3116
JNIid* JNIid::find(int offset) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3117
  JNIid* current = this;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3118
  while (current != NULL) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3119
    if (current->offset() == offset) return current;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3120
    current = current->next();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3121
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3122
  return NULL;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3123
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3124
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3125
void JNIid::deallocate(JNIid* current) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3126
  while (current != NULL) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3127
    JNIid* next = current->next();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3128
    delete current;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3129
    current = next;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3130
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3131
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3134
void JNIid::verify(Klass* holder) {
13738
d67be49a5beb 7195833: NPG: Rename instanceClassLoaderKlass, instanceRefKlass and instanceMirrorKlass
coleenp
parents: 13736
diff changeset
  3135
  int first_field_offset  = InstanceMirrorKlass::offset_of_static_fields();
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3136
  int end_field_offset;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3137
  end_field_offset = first_field_offset + (InstanceKlass::cast(holder)->static_field_size() * wordSize);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3139
  JNIid* current = this;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3140
  while (current != NULL) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3141
    guarantee(current->holder() == holder, "Invalid klass in JNIid");
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3142
#ifdef ASSERT
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3143
    int o = current->offset();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3144
    if (current->is_static_field_id()) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3145
      guarantee(o >= first_field_offset  && o < end_field_offset,  "Invalid static field offset in JNIid");
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3146
    }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3147
#endif
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3148
    current = current->next();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3149
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3150
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3151
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3152
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3153
#ifdef ASSERT
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3154
void InstanceKlass::set_init_state(ClassState state) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3155
  bool good_state = is_shared() ? (_init_state <= state)
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3156
                                               : (_init_state < state);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3157
  assert(good_state || state == allocated, "illegal state transition");
11407
5399831730cd 7117052: instanceKlass::_init_state can be u1 type
coleenp
parents: 10739
diff changeset
  3158
  _init_state = (u1)state;
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3159
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3160
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3161
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3162
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3163
// RedefineClasses() support for previous versions:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3164
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3165
// Purge previous versions
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3166
static void purge_previous_versions_internal(InstanceKlass* ik, int emcp_method_count) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3167
  if (ik->previous_versions() != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3168
    // This klass has previous versions so see what we can cleanup
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3169
    // while it is safe to do so.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3170
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3171
    int deleted_count = 0;    // leave debugging breadcrumbs
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3172
    int live_count = 0;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3173
    ClassLoaderData* loader_data = ik->class_loader_data() == NULL ?
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3174
                       ClassLoaderData::the_null_class_loader_data() :
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3175
                       ik->class_loader_data();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3176
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3177
    // RC_TRACE macro has an embedded ResourceMark
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3178
    RC_TRACE(0x00000200, ("purge: %s: previous version length=%d",
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3179
      ik->external_name(), ik->previous_versions()->length()));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3180
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3181
    for (int i = ik->previous_versions()->length() - 1; i >= 0; i--) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3182
      // check the previous versions array
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3183
      PreviousVersionNode * pv_node = ik->previous_versions()->at(i);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3184
      ConstantPool* cp_ref = pv_node->prev_constant_pool();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3185
      assert(cp_ref != NULL, "cp ref was unexpectedly cleared");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3186
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3187
      ConstantPool* pvcp = cp_ref;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3188
      if (!pvcp->on_stack()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3189
        // If the constant pool isn't on stack, none of the methods
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3190
        // are executing.  Delete all the methods, the constant pool and
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3191
        // and this previous version node.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3192
        GrowableArray<Method*>* method_refs = pv_node->prev_EMCP_methods();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3193
        if (method_refs != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3194
          for (int j = method_refs->length() - 1; j >= 0; j--) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3195
            Method* method = method_refs->at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3196
            assert(method != NULL, "method ref was unexpectedly cleared");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3197
            method_refs->remove_at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3198
            // method will be freed with associated class.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3199
          }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3200
        }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3201
        // Remove the constant pool
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3202
        delete pv_node;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3203
        // Since we are traversing the array backwards, we don't have to
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3204
        // do anything special with the index.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3205
        ik->previous_versions()->remove_at(i);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3206
        deleted_count++;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3207
        continue;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3208
      } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3209
        RC_TRACE(0x00000200, ("purge: previous version @%d is alive", i));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3210
        assert(pvcp->pool_holder() != NULL, "Constant pool with no holder");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3211
        guarantee (!loader_data->is_unloading(), "unloaded classes can't be on the stack");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3212
        live_count++;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3213
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3214
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3215
      // At least one method is live in this previous version, clean out
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3216
      // the others or mark them as obsolete.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3217
      GrowableArray<Method*>* method_refs = pv_node->prev_EMCP_methods();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3218
      if (method_refs != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3219
        RC_TRACE(0x00000200, ("purge: previous methods length=%d",
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3220
          method_refs->length()));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3221
        for (int j = method_refs->length() - 1; j >= 0; j--) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3222
          Method* method = method_refs->at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3223
          assert(method != NULL, "method ref was unexpectedly cleared");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3224
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3225
          // Remove the emcp method if it's not executing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3226
          // If it's been made obsolete by a redefinition of a non-emcp
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3227
          // method, mark it as obsolete but leave it to clean up later.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3228
          if (!method->on_stack()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3229
            method_refs->remove_at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3230
          } else if (emcp_method_count == 0) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3231
            method->set_is_obsolete();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3232
          } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3233
            // RC_TRACE macro has an embedded ResourceMark
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3234
            RC_TRACE(0x00000200,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3235
              ("purge: %s(%s): prev method @%d in version @%d is alive",
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3236
              method->name()->as_C_string(),
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3237
              method->signature()->as_C_string(), j, i));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3238
          }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3239
        }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3240
      }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3241
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3242
    assert(ik->previous_versions()->length() == live_count, "sanity check");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3243
    RC_TRACE(0x00000200,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3244
      ("purge: previous version stats: live=%d, deleted=%d", live_count,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3245
      deleted_count));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3246
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3247
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3248
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3249
// External interface for use during class unloading.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3250
void InstanceKlass::purge_previous_versions(InstanceKlass* ik) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3251
  // Call with >0 emcp methods since they are not currently being redefined.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3252
  purge_previous_versions_internal(ik, 1);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3253
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3254
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3255
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3256
// Potentially add an information node that contains pointers to the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
// interesting parts of the previous version of the_class.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3258
// This is also where we clean out any unused references.
3824
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  3259
// Note that while we delete nodes from the _previous_versions
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  3260
// array, we never delete the array itself until the klass is
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  3261
// unloaded. The has_been_redefined() query depends on that fact.
86e9e4b25bdf 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 3821
diff changeset
  3262
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3263
void InstanceKlass::add_previous_version(instanceKlassHandle ikh,
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3264
       BitMap* emcp_methods, int emcp_method_count) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
  assert(Thread::current()->is_VM_thread(),
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 225
diff changeset
  3266
         "only VMThread can add previous versions");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
  if (_previous_versions == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
    // This is the first previous version so make some space.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
    // Start with 2 elements under the assumption that the class
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
    // won't be redefined much.
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12587
diff changeset
  3272
    _previous_versions =  new (ResourceObj::C_HEAP, mtClass)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
                            GrowableArray<PreviousVersionNode *>(2, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3276
  ConstantPool* cp_ref = ikh->constants();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3277
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3278
  // RC_TRACE macro has an embedded ResourceMark
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3279
  RC_TRACE(0x00000400, ("adding previous version ref for %s @%d, EMCP_cnt=%d "
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3280
                        "on_stack=%d",
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3281
    ikh->external_name(), _previous_versions->length(), emcp_method_count,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3282
    cp_ref->on_stack()));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3283
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3284
  // If the constant pool for this previous version of the class
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3285
  // is not marked as being on the stack, then none of the methods
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3286
  // in this previous version of the class are on the stack so
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3287
  // we don't need to create a new PreviousVersionNode. However,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3288
  // we still need to examine older previous versions below.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3289
  Array<Method*>* old_methods = ikh->methods();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3290
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3291
  if (cp_ref->on_stack()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
  PreviousVersionNode * pv_node = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
  if (emcp_method_count == 0) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3294
      // non-shared ConstantPool gets a reference
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3295
      pv_node = new PreviousVersionNode(cp_ref, !cp_ref->is_shared(), NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
    RC_TRACE(0x00000400,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3297
        ("add: all methods are obsolete; flushing any EMCP refs"));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3298
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
    int local_count = 0;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3300
      GrowableArray<Method*>* method_refs = new (ResourceObj::C_HEAP, mtClass)
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3301
        GrowableArray<Method*>(emcp_method_count, true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
    for (int i = 0; i < old_methods->length(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3303
      if (emcp_methods->at(i)) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3304
          // this old method is EMCP. Save it only if it's on the stack
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3305
          Method* old_method = old_methods->at(i);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3306
          if (old_method->on_stack()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3307
            method_refs->append(old_method);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3308
          }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
        if (++local_count >= emcp_method_count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3310
          // no more EMCP methods so bail out now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3311
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3312
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3313
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3314
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3315
      // non-shared ConstantPool gets a reference
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3316
      pv_node = new PreviousVersionNode(cp_ref, !cp_ref->is_shared(), method_refs);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3317
    }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3318
    // append new previous version.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3319
  _previous_versions->append(pv_node);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3320
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3321
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3322
  // Since the caller is the VMThread and we are at a safepoint, this
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3323
  // is a good time to clear out unused references.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3325
  RC_TRACE(0x00000400, ("add: previous version length=%d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
    _previous_versions->length()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3327
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3328
  // Purge previous versions not executing on the stack
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3329
  purge_previous_versions_internal(this, emcp_method_count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
  int obsolete_method_count = old_methods->length() - emcp_method_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
  if (emcp_method_count != 0 && obsolete_method_count != 0 &&
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3334
      _previous_versions->length() > 0) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3335
    // We have a mix of obsolete and EMCP methods so we have to
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
    // clear out any matching EMCP method entries the hard way.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
    int local_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
    for (int i = 0; i < old_methods->length(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
      if (!emcp_methods->at(i)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
        // only obsolete methods are interesting
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3341
        Method* old_method = old_methods->at(i);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  3342
        Symbol* m_name = old_method->name();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
  3343
        Symbol* m_signature = old_method->signature();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3345
        // we might not have added the last entry
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3346
        for (int j = _previous_versions->length() - 1; j >= 0; j--) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3347
          // check the previous versions array for non executing obsolete methods
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3348
          PreviousVersionNode * pv_node = _previous_versions->at(j);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3349
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3350
          GrowableArray<Method*>* method_refs = pv_node->prev_EMCP_methods();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
          if (method_refs == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
            // We have run into a PreviousVersion generation where
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
            // all methods were made obsolete during that generation's
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
            // RedefineClasses() operation. At the time of that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
            // operation, all EMCP methods were flushed so we don't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
            // have to go back any further.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
            //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
            // A NULL method_refs is different than an empty method_refs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3359
            // We cannot infer any optimizations about older generations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
            // from an empty method_refs for the current generation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
          for (int k = method_refs->length() - 1; k >= 0; k--) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3365
            Method* method = method_refs->at(k);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3366
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3367
            if (!method->is_obsolete() &&
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3368
                method->name() == m_name &&
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
                method->signature() == m_signature) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
              // The current RedefineClasses() call has made all EMCP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
              // versions of this method obsolete so mark it as obsolete
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3372
              // and remove the reference.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
              RC_TRACE(0x00000400,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
                ("add: %s(%s): flush obsolete method @%d in version @%d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
                m_name->as_C_string(), m_signature->as_C_string(), k, j));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
              method->set_is_obsolete();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3378
              // Leave obsolete methods on the previous version list to
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3379
              // clean up later.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
              break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
          // The previous loop may not find a matching EMCP method, but
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
          // that doesn't mean that we can optimize and not go any
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
          // further back in the PreviousVersion generations. The EMCP
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3387
          // method for this generation could have already been deleted,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
          // but there still may be an older EMCP method that has not
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3389
          // been deleted.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
        if (++local_count >= obsolete_method_count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
          // no more obsolete methods so bail out now
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
          break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
} // end add_previous_version()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3402
// Determine if InstanceKlass has a previous version.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3403
bool InstanceKlass::has_previous_version() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3404
  return (_previous_versions != NULL && _previous_versions->length() > 0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3405
} // end has_previous_version()
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3407
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3408
Method* InstanceKlass::method_with_idnum(int idnum) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3409
  Method* m = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
  if (idnum < methods()->length()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3411
    m = methods()->at(idnum);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3413
  if (m == NULL || m->method_idnum() != idnum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3414
    for (int index = 0; index < methods()->length(); ++index) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3415
      m = methods()->at(index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3416
      if (m->method_idnum() == idnum) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3417
        return m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3420
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3421
  return m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3422
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3423
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3424
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3425
// Construct a PreviousVersionNode entry for the array hung off
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3426
// the InstanceKlass.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3427
PreviousVersionNode::PreviousVersionNode(ConstantPool* prev_constant_pool,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3428
  bool prev_cp_is_weak, GrowableArray<Method*>* prev_EMCP_methods) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3430
  _prev_constant_pool = prev_constant_pool;
220
e6ef4818c49d 6497639: 4/3 Profiling Swing application caused JVM crash
dcubed
parents: 1
diff changeset
  3431
  _prev_cp_is_weak = prev_cp_is_weak;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3432
  _prev_EMCP_methods = prev_EMCP_methods;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3433
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3434
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3435
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3436
// Destroy a PreviousVersionNode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3437
PreviousVersionNode::~PreviousVersionNode() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3438
  if (_prev_constant_pool != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3439
    _prev_constant_pool = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3440
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3441
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3442
  if (_prev_EMCP_methods != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3443
    delete _prev_EMCP_methods;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3444
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3445
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3446
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3447
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3448
// Construct a PreviousVersionInfo entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3449
PreviousVersionInfo::PreviousVersionInfo(PreviousVersionNode *pv_node) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3450
  _prev_constant_pool_handle = constantPoolHandle();  // NULL handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3451
  _prev_EMCP_method_handles = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3452
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3453
  ConstantPool* cp = pv_node->prev_constant_pool();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3454
  assert(cp != NULL, "constant pool ref was unexpectedly cleared");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3455
  if (cp == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3456
    return;  // robustness
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3457
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3458
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3459
  // make the ConstantPool* safe to return
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3460
  _prev_constant_pool_handle = constantPoolHandle(cp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3461
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3462
  GrowableArray<Method*>* method_refs = pv_node->prev_EMCP_methods();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3463
  if (method_refs == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3464
    // the InstanceKlass did not have any EMCP methods
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3465
    return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3466
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3467
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3468
  _prev_EMCP_method_handles = new GrowableArray<methodHandle>(10);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3469
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3470
  int n_methods = method_refs->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3471
  for (int i = 0; i < n_methods; i++) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3472
    Method* method = method_refs->at(i);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3473
    assert (method != NULL, "method has been cleared");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3474
    if (method == NULL) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3475
      continue;  // robustness
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3476
    }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3477
    // make the Method* safe to return
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3478
    _prev_EMCP_method_handles->append(methodHandle(method));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3479
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3480
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3481
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3482
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3483
// Destroy a PreviousVersionInfo
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3484
PreviousVersionInfo::~PreviousVersionInfo() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3485
  // Since _prev_EMCP_method_handles is not C-heap allocated, we
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3486
  // don't have to delete it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3487
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3488
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3489
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3490
// Construct a helper for walking the previous versions array
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3491
PreviousVersionWalker::PreviousVersionWalker(InstanceKlass *ik) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3492
  _previous_versions = ik->previous_versions();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3493
  _current_index = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3494
  // _hm needs no initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3495
  _current_p = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3496
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3497
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3498
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3499
// Destroy a PreviousVersionWalker
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3500
PreviousVersionWalker::~PreviousVersionWalker() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3501
  // Delete the current info just in case the caller didn't walk to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3502
  // the end of the previous versions list. No harm if _current_p is
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3503
  // already NULL.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3504
  delete _current_p;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3505
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3506
  // When _hm is destroyed, all the Handles returned in
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3507
  // PreviousVersionInfo objects will be destroyed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3508
  // Also, after this destructor is finished it will be
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3509
  // safe to delete the GrowableArray allocated in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3510
  // PreviousVersionInfo objects.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3511
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3512
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3513
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3514
// Return the interesting information for the next previous version
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3515
// of the klass. Returns NULL if there are no more previous versions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3516
PreviousVersionInfo* PreviousVersionWalker::next_previous_version() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3517
  if (_previous_versions == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3518
    // no previous versions so nothing to return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3519
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3520
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3521
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3522
  delete _current_p;  // cleanup the previous info for the caller
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3523
  _current_p = NULL;  // reset to NULL so we don't delete same object twice
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3524
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3525
  int length = _previous_versions->length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3526
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3527
  while (_current_index < length) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3528
    PreviousVersionNode * pv_node = _previous_versions->at(_current_index++);
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12587
diff changeset
  3529
    PreviousVersionInfo * pv_info = new (ResourceObj::C_HEAP, mtClass)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3530
                                          PreviousVersionInfo(pv_node);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3531
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3532
    constantPoolHandle cp_h = pv_info->prev_constant_pool_handle();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3533
    assert (!cp_h.is_null(), "null cp found in previous version");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3534
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3535
    // The caller will need to delete pv_info when they are done with it.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3536
    _current_p = pv_info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3537
    return pv_info;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3538
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3539
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  3540
  // all of the underlying nodes' info has been deleted
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3541
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3542
} // end next_previous_version()