hotspot/src/share/vm/ci/ciSymbol.hpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14477 95e66ea71f71
child 20017 81eba62e9048
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
     2
 * Copyright (c) 1999, 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: 5420
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5420
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: 5420
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: 5547
diff changeset
    25
#ifndef SHARE_VM_CI_CISYMBOL_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    26
#define SHARE_VM_CI_CISYMBOL_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    28
#include "ci/ciBaseObject.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "ci/ciObject.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "ci/ciObjectFactory.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "classfile/vmSymbols.hpp"
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    32
#include "oops/symbol.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    34
// ciSymbol
489c9b5090e2 Initial load
duke
parents:
diff changeset
    35
//
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    36
// This class represents a Symbol* in the HotSpot virtual
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
// machine.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    38
class ciSymbol : public ciBaseObject {
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    39
  Symbol* _symbol;
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    40
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
  CI_PACKAGE_ACCESS
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    42
  // These friends all make direct use of get_symbol:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
  friend class ciEnv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
  friend class ciInstanceKlass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
  friend class ciSignature;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
  friend class ciMethod;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
  friend class ciObjArrayKlass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
private:
5420
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 4567
diff changeset
    50
  const vmSymbols::SID _sid;
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    51
  DEBUG_ONLY( bool sid_ok() { return vmSymbols::find_sid(get_symbol()) == _sid; } )
5420
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 4567
diff changeset
    52
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    53
  ciSymbol(Symbol* s);  // normal case, for symbols not mentioned in vmSymbols
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    54
  ciSymbol(Symbol* s, vmSymbols::SID sid);   // for use with vmSymbols
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    56
  Symbol* get_symbol() const { return _symbol; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  const char* type_string() { return "ciSymbol"; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  void print_impl(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    62
  // This is public in Symbol* but private here, because the base can move:
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
    63
  const jbyte* base();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  // Make a ciSymbol from a C string (implementation).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  static ciSymbol* make_impl(const char* s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
public:
5420
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 4567
diff changeset
    69
  // The enumeration ID from vmSymbols, or vmSymbols::NO_SID if none.
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 4567
diff changeset
    70
  vmSymbols::SID sid() const { return _sid; }
586d3988e72b 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 4567
diff changeset
    71
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  // The text of the symbol as a null-terminated utf8 string.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  const char* as_utf8();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  int         utf8_length();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
    76
  // The text of the symbol as ascii with all non-printable characters quoted as \u####
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
    77
  const char* as_quoted_ascii();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
    78
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
    79
  // Return the i-th utf8 byte, where i < utf8_length
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
    80
  int         byte_at(int i);
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
    81
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
    82
  // Tests if the symbol starts with the given prefix.
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
    83
  bool starts_with(const char* prefix, int len) const;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
    84
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
    85
  // Determines where the symbol contains the given substring.
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 1
diff changeset
    86
  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
    87
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  void print_symbol_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  void print_symbol() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
    print_symbol_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  // Make a ciSymbol from a C string.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  // Consider adding to vmSymbols.hpp instead of using this constructor.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  // (Your code will be less subject to typographical bugs.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  static ciSymbol* make(const char* s);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
#define CI_SYMBOL_DECLARE(name, ignore_def) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  static ciSymbol* name() { return ciObjectFactory::vm_symbol_at(vmSymbols::VM_SYMBOL_ENUM_NAME(name)); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  VM_SYMBOLS_DO(CI_SYMBOL_DECLARE, CI_SYMBOL_DECLARE)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
#undef CI_SYMBOL_DECLARE
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   102
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   103
  void print() {
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   104
    _symbol->print();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   105
  }
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   106
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   107
  virtual bool is_symbol() const       { return true; }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   108
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   109
  // Are two ciSymbols equal?
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7397
diff changeset
   110
  bool equals(ciSymbol* obj) { return this->_symbol == obj->get_symbol(); }
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 8921
diff changeset
   111
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 8921
diff changeset
   112
  bool is_signature_polymorphic_name() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   114
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
   115
#endif // SHARE_VM_CI_CISYMBOL_HPP