hotspot/src/share/vm/oops/symbol.hpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 13728 882756847a04
child 15855 2ac9ebea17f3
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
/*
12263
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
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: 4567
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4567
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: 4567
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
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    25
#ifndef SHARE_VM_OOPS_SYMBOL_HPP
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    26
#define SHARE_VM_OOPS_SYMBOL_HPP
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "utilities/utf8.hpp"
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    29
#include "memory/allocation.hpp"
12263
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
    30
#include "runtime/atomic.hpp"
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    31
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    32
// A Symbol is a canonicalized string.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    33
// All Symbols reside in global SymbolTable and are reference counted.
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    35
// Reference counting
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    36
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    37
// All Symbols are allocated and added to the SymbolTable.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    38
// When a class is unloaded, the reference counts of the Symbol pointers in
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
    39
// the ConstantPool and in InstanceKlass (see release_C_heap_structures) are
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    40
// decremented.  When the reference count for a Symbol goes to 0, the garbage
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    41
// collector can free the Symbol and remove it from the SymbolTable.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    42
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    43
// 0) Symbols need to be reference counted when a pointer to the Symbol is
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    44
// saved in persistent storage.  This does not include the pointer
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    45
// in the SymbolTable bucket (the _literal field in HashtableEntry)
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    46
// that points to the Symbol.  All other stores of a Symbol*
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    47
// to a field of a persistent variable (e.g., the _name filed in
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    48
// FieldAccessInfo or _ptr in a CPSlot) is reference counted.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    49
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    50
// 1) The lookup of a "name" in the SymbolTable either creates a Symbol F for
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    51
// "name" and returns a pointer to F or finds a pre-existing Symbol F for
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    52
// "name" and returns a pointer to it. In both cases the reference count for F
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    53
// is incremented under the assumption that a pointer to F will be created from
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    54
// the return value. Thus the increment of the reference count is on the lookup
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    55
// and not on the assignment to the new Symbol*.  That is
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    56
//    Symbol* G = lookup()
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    57
//                ^ increment on lookup()
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    58
// and not
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    59
//    Symbol* G = lookup()
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    60
//              ^ increment on assignmnet
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    61
// The reference count must be decremented manually when the copy of the
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    62
// pointer G is destroyed.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    63
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    64
// 2) For a local Symbol* A that is a copy of an existing Symbol* B, the
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    65
// reference counting is elided when the scope of B is greater than the scope
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    66
// of A.  For example, in the code fragment
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    67
// below "klass" is passed as a parameter to the method.  Symbol* "kn"
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    68
// is a copy of the name in "klass".
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    69
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    70
//   Symbol*  kn = klass->name();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    71
//   unsigned int d_hash = dictionary()->compute_hash(kn, class_loader);
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    72
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    73
// The scope of "klass" is greater than the scope of "kn" so the reference
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    74
// counting for "kn" is elided.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    75
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    76
// Symbol* copied from ConstantPool entries are good candidates for reference
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    77
// counting elision.  The ConstantPool entries for a class C exist until C is
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    78
// unloaded.  If a Symbol* is copied out of the ConstantPool into Symbol* X,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    79
// the Symbol* in the ConstantPool will in general out live X so the reference
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    80
// counting on X can be elided.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    81
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    82
// For cases where the scope of A is not greater than the scope of B,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    83
// the reference counting is explicitly done.  See ciSymbol,
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    84
// ResolutionErrorEntry and ClassVerifier for examples.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    85
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    86
// 3) When a Symbol K is created for temporary use, generally for substrings of
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    87
// an existing symbol or to create a new symbol, assign it to a
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    88
// TempNewSymbol. The SymbolTable methods new_symbol(), lookup()
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    89
// and probe() all potentially return a pointer to a new Symbol.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    90
// The allocation (or lookup) of K increments the reference count for K
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    91
// and the destructor decrements the reference count.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    92
//
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    93
// Another example of TempNewSymbol usage is parsed_name used in
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    94
// ClassFileParser::parseClassFile() where parsed_name is used in the cleanup
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    95
// after a failed attempt to load a class.  Here parsed_name is a
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    96
// TempNewSymbol (passed in as a parameter) so the reference count on its symbol
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    97
// will be decremented when it goes out of scope.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
    99
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   100
// This cannot be inherited from ResourceObj because it cannot have a vtable.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   101
// Since sometimes this is allocated from Metadata, pick a base allocation
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   102
// type without virtual functions.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   103
class ClassLoaderData;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   104
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   105
class Symbol : public MetaspaceObj {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
  friend class VMStructs;
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   107
  friend class SymbolTable;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   108
  friend class MoveSymbols;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
 private:
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   110
  volatile int   _refcount;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   111
  int            _identity_hash;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
  unsigned short _length; // number of UTF8 characters in the symbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  jbyte _body[1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  enum {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    // max_symbol_length is constrained by type of _length
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    max_symbol_length = (1 << 16) -1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  };
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   119
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   120
  static int size(int length) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   121
    size_t sz = heap_word_size(sizeof(Symbol) + (length > 0 ? length - 1 : 0));
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   122
    return align_object_size(sz);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   123
  }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   124
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   125
  void byte_at_put(int index, int value) {
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   126
    assert(index >=0 && index < _length, "symbol index overflow");
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   127
    _body[index] = value;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   128
  }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   129
12263
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   130
  Symbol(const u1* name, int length, int refcount);
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   131
  void* operator new(size_t size, int len, TRAPS);
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   132
  void* operator new(size_t size, int len, Arena* arena, TRAPS);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   133
  void* operator new(size_t size, int len, ClassLoaderData* loader_data, TRAPS);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   134
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   135
  void  operator delete(void* p);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   136
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  // Low-level access (used with care, since not GC-safe)
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   139
  const jbyte* base() const { return &_body[0]; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   141
  int size()                { return size(utf8_length()); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
  // Returns the largest size symbol we can safely hold.
12263
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   144
  static int max_length()   { return max_symbol_length; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
12263
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   146
  int identity_hash()       { return _identity_hash; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   148
  // For symbol table alternate hashing
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   149
  unsigned int new_hash(jint seed);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 12263
diff changeset
   150
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   151
  // Reference counting.  See comments above this class for when to use.
12263
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   152
  int refcount() const      { return _refcount; }
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   153
  inline void increment_refcount();
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   154
  inline void decrement_refcount();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  int byte_at(int index) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    assert(index >=0 && index < _length, "symbol index overflow");
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   158
    return base()[index];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   161
  const jbyte* bytes() const { return base(); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  int utf8_length() const { return _length; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   165
  // Compares the symbol with a string.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  bool equals(const char* str, int len) const;
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   167
  bool equals(const char* str) const { return equals(str, (int) strlen(str)); }
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   168
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   169
  // Tests if the symbol starts with the given prefix.
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   170
  bool starts_with(const char* prefix, int len) const;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   171
  bool starts_with(const char* prefix) const {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   172
    return starts_with(prefix, (int) strlen(prefix));
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   173
  }
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   174
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   175
  // Tests if the symbol starts with the given prefix.
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   176
  int index_of_at(int i, const char* str, int len) const;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   177
  int index_of_at(int i, const char* str) const {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   178
    return index_of_at(i, str, (int) strlen(str));
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
   179
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // Three-way compare for sorting; returns -1/0/1 if receiver is </==/> than arg
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // note that the ordering is not alfabetical
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   183
  inline int fast_compare(Symbol* other) const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  // Returns receiver converted to null-terminated UTF-8 string; string is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // allocated in resource area, or in the char buffer provided by caller.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  char* as_C_string() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  char* as_C_string(char* buf, int size) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // Use buf if needed buffer length is <= size.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  char* as_C_string_flexible_buffer(Thread* t, char* buf, int size) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   192
  // Returns an escaped form of a Java string.
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   193
  char* as_quoted_ascii() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // Returns a null terminated utf8 string in a resource array
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  char* as_utf8() const { return as_C_string(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  char* as_utf8_flexible_buffer(Thread* t, char* buf, int size) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    return as_C_string_flexible_buffer(t, buf, size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  jchar* as_unicode(int& length) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  // Treating this symbol as a class name, returns the Java name for the class.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  // String is allocated in resource area if buffer is not provided.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  // See Klass::external_name()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  const char* as_klass_external_name() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  const char* as_klass_external_name(char* buf, int size) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   209
  // Printing
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   210
  void print_symbol_on(outputStream* st = NULL) const;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   211
  void print_on(outputStream* st) const;         // First level print
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   212
  void print_value_on(outputStream* st) const;   // Second level print.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   213
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   214
  // printing on default output stream
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   215
  void print()         { print_on(tty);       }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   216
  void print_value()   { print_value_on(tty); }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   218
#ifndef PRODUCT
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   219
  // Empty constructor to create a dummy symbol object on stack
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   220
  // only for getting its vtable pointer.
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   221
  Symbol() { }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   222
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   223
  static int _total_count;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   224
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
// Note: this comparison is used for vtable sorting only; it doesn't matter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
// what order it defines, as long as it is a total, time-invariant order
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   229
// Since Symbol*s are in C_HEAP, their relative order in memory never changes,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
// so use address comparison for speed
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   231
int Symbol::fast_compare(Symbol* other) const {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
 return (((uintptr_t)this < (uintptr_t)other) ? -1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
   : ((uintptr_t)this == (uintptr_t) other) ? 0 : 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
}
12263
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   235
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   236
inline void Symbol::increment_refcount() {
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   237
  // Only increment the refcount if positive.  If negative either
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   238
  // overflow has occurred or it is a permanent symbol in a read only
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   239
  // shared archive.
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   240
  if (_refcount >= 0) {
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   241
    Atomic::inc(&_refcount);
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   242
    NOT_PRODUCT(Atomic::inc(&_total_count);)
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   243
  }
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   244
}
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   245
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   246
inline void Symbol::decrement_refcount() {
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   247
  if (_refcount >= 0) {
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   248
    Atomic::dec(&_refcount);
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   249
#ifdef ASSERT
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   250
    if (_refcount < 0) {
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   251
      print();
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   252
      assert(false, "reference count underflow for symbol");
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   253
    }
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   254
#endif
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   255
  }
d20640f4f8fe 7150058: Allocate symbols from null boot loader to an arena for NMT
coleenp
parents: 8921
diff changeset
   256
}
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   257
#endif // SHARE_VM_OOPS_SYMBOL_HPP