constantPool.hpp revision 9111:a41fe5ffa839
1193323Sed/*
2193323Sed * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
3193323Sed * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4193323Sed *
5193323Sed * This code is free software; you can redistribute it and/or modify it
6193323Sed * under the terms of the GNU General Public License version 2 only, as
7193323Sed * published by the Free Software Foundation.
8193323Sed *
9193323Sed * This code is distributed in the hope that it will be useful, but WITHOUT
10193323Sed * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11193323Sed * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12193323Sed * version 2 for more details (a copy is included in the LICENSE file that
13193323Sed * accompanied this code).
14193323Sed *
15249423Sdim * You should have received a copy of the GNU General Public License version
16249423Sdim * 2 along with this work; if not, write to the Free Software Foundation,
17193323Sed * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18206083Srdivacky *
19249423Sdim * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20193323Sed * or visit www.oracle.com if you need additional information or have any
21218893Sdim * questions.
22218893Sdim *
23249423Sdim */
24193323Sed
25193323Sed#ifndef SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
26206083Srdivacky#define SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
27206083Srdivacky
28193323Sed#include "oops/arrayOop.hpp"
29193323Sed#include "oops/cpCache.hpp"
30193323Sed#include "oops/objArrayOop.hpp"
31193323Sed#include "oops/symbol.hpp"
32193323Sed#include "oops/typeArrayOop.hpp"
33193323Sed#include "runtime/handles.hpp"
34193323Sed#include "utilities/bytes.hpp"
35193323Sed#include "utilities/constantTag.hpp"
36193323Sed
37193323Sed// A ConstantPool is an array containing class constants as described in the
38193323Sed// class file.
39193323Sed//
40193323Sed// Most of the constant pool entries are written during class parsing, which
41193323Sed// is safe.  For klass types, the constant pool entry is
42195098Sed// modified when the entry is resolved.  If a klass constant pool
43195098Sed// entry is read without a lock, only the resolved state guarantees that
44193323Sed// the entry in the constant pool is a klass object and not a Symbol*.
45193323Sed
46193323Sedclass SymbolHashMap;
47193323Sed
48193323Sedclass CPSlot VALUE_OBJ_CLASS_SPEC {
49193323Sed  intptr_t _ptr;
50193323Sed public:
51193323Sed  enum TagBits  { _resolved_value = 0, _symbol_bit = 1, _pseudo_bit = 2, _symbol_mask = 3 };
52193323Sed
53193323Sed  CPSlot(intptr_t ptr): _ptr(ptr) {}
54193323Sed  CPSlot(Klass* ptr): _ptr((intptr_t)ptr) {}
55193323Sed  CPSlot(Symbol* ptr): _ptr((intptr_t)ptr | _symbol_bit) {}
56206083Srdivacky  CPSlot(Symbol* ptr, int tag_bits): _ptr((intptr_t)ptr | tag_bits) {}
57206083Srdivacky
58206083Srdivacky  intptr_t value()   { return _ptr; }
59206083Srdivacky  bool is_resolved()      { return (_ptr & _symbol_bit ) == _resolved_value; }
60206083Srdivacky  bool is_unresolved()    { return (_ptr & _symbol_bit ) != _resolved_value; }
61206083Srdivacky  bool is_pseudo_string() { return (_ptr & _symbol_mask) == _symbol_bit + _pseudo_bit; }
62206083Srdivacky
63206083Srdivacky  Symbol* get_symbol() {
64208599Srdivacky    assert(is_unresolved(), "bad call");
65208599Srdivacky    return (Symbol*)(_ptr & ~_symbol_mask);
66208599Srdivacky  }
67208599Srdivacky  Klass* get_klass() {
68206083Srdivacky    assert(is_resolved(), "bad call");
69263508Sdim    return (Klass*)_ptr;
70263508Sdim  }
71206083Srdivacky};
72206083Srdivacky
73206083Srdivackyclass KlassSizeStats;
74206083Srdivacky
75206083Srdivackyclass ConstantPool : public Metadata {
76206083Srdivacky  friend class VMStructs;
77206083Srdivacky  friend class BytecodeInterpreter;  // Directly extracts a klass in the pool for fast instanceof/checkcast
78206083Srdivacky  friend class Universe;             // For null constructor
79206083Srdivacky private:
80206083Srdivacky  Array<u1>*           _tags;        // the tag array describing the constant pool's contents
81194754Sed  ConstantPoolCache*   _cache;       // the cache holding interpreter runtime information
82193323Sed  InstanceKlass*       _pool_holder; // the corresponding class
83206083Srdivacky  Array<u2>*           _operands;    // for variable-sized (InvokeDynamic) nodes, usually empty
84194754Sed
85206083Srdivacky  // Array of resolved objects from the constant pool and map from resolved
86206083Srdivacky  // object index to original constant pool index
87206083Srdivacky  jobject              _resolved_references;
88206083Srdivacky  Array<u2>*           _reference_map;
89194754Sed
90206083Srdivacky  enum {
91206083Srdivacky    _has_preresolution = 1,           // Flags
92206083Srdivacky    _on_stack          = 2
93194754Sed  };
94206083Srdivacky
95199481Srdivacky  int                  _flags;  // old fashioned bit twiddling
96194754Sed  int                  _length; // number of elements in the array
97193323Sed
98193323Sed  union {
99206083Srdivacky    // set for CDS to restore resolved references
100206083Srdivacky    int                _resolved_reference_length;
101206083Srdivacky    // keeps version number for redefined classes (used in backtrace)
102193323Sed    int                _version;
103206083Srdivacky  } _saved;
104206083Srdivacky
105206083Srdivacky  void set_tags(Array<u1>* tags)               { _tags = tags; }
106206083Srdivacky  void tag_at_put(int which, jbyte t)          { tags()->at_put(which, t); }
107206083Srdivacky  void release_tag_at_put(int which, jbyte t)  { tags()->release_at_put(which, t); }
108206083Srdivacky
109193323Sed  u1* tag_addr_at(int which) const             { return tags()->adr_at(which); }
110193323Sed
111206083Srdivacky  void set_operands(Array<u2>* operands)       { _operands = operands; }
112206083Srdivacky
113206083Srdivacky  int flags() const                            { return _flags; }
114206083Srdivacky  void set_flags(int f)                        { _flags = f; }
115206083Srdivacky
116206083Srdivacky private:
117193323Sed  intptr_t* base() const { return (intptr_t*) (((char*) this) + sizeof(ConstantPool)); }
118193323Sed
119193323Sed  CPSlot slot_at(int which) {
120206083Srdivacky    assert(is_within_bounds(which), "index out of bounds");
121206083Srdivacky    // Uses volatile because the klass slot changes without a lock.
122193323Sed    volatile intptr_t adr = (intptr_t)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which));
123193323Sed    assert(adr != 0 || which == 0, "cp entry for klass should not be zero");
124193323Sed    return CPSlot(adr);
125206083Srdivacky  }
126206083Srdivacky
127193323Sed  void slot_at_put(int which, CPSlot s) const {
128193323Sed    assert(is_within_bounds(which), "index out of bounds");
129206083Srdivacky    assert(s.value() != 0, "Caught something");
130193323Sed    *(intptr_t*)&base()[which] = s.value();
131206083Srdivacky  }
132206083Srdivacky  intptr_t* obj_at_addr_raw(int which) const {
133193323Sed    assert(is_within_bounds(which), "index out of bounds");
134206083Srdivacky    return (intptr_t*) &base()[which];
135206083Srdivacky  }
136193323Sed
137206083Srdivacky  jint* int_at_addr(int which) const {
138206083Srdivacky    assert(is_within_bounds(which), "index out of bounds");
139193323Sed    return (jint*) &base()[which];
140193323Sed  }
141206083Srdivacky
142206083Srdivacky  jlong* long_at_addr(int which) const {
143206083Srdivacky    assert(is_within_bounds(which), "index out of bounds");
144193323Sed    return (jlong*) &base()[which];
145193323Sed  }
146193323Sed
147193323Sed  jfloat* float_at_addr(int which) const {
148193323Sed    assert(is_within_bounds(which), "index out of bounds");
149193323Sed    return (jfloat*) &base()[which];
150193323Sed  }
151193323Sed
152206083Srdivacky  jdouble* double_at_addr(int which) const {
153193323Sed    assert(is_within_bounds(which), "index out of bounds");
154193323Sed    return (jdouble*) &base()[which];
155193323Sed  }
156206083Srdivacky
157193323Sed  ConstantPool(Array<u1>* tags);
158193323Sed  ConstantPool() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
159193323Sed public:
160193323Sed  static ConstantPool* allocate(ClassLoaderData* loader_data, int length, TRAPS);
161193323Sed
162193323Sed  bool is_constantPool() const volatile     { return true; }
163193323Sed
164193323Sed  Array<u1>* tags() const                   { return _tags; }
165193323Sed  Array<u2>* operands() const               { return _operands; }
166193323Sed
167193323Sed  bool has_preresolution() const            { return (_flags & _has_preresolution) != 0; }
168206083Srdivacky  void set_has_preresolution()              { _flags |= _has_preresolution; }
169206083Srdivacky
170206083Srdivacky  // Redefine classes support.  If a method refering to this constant pool
171234353Sdim  // is on the executing stack, or as a handle in vm code, this constant pool
172234353Sdim  // can't be removed from the set of previous versions saved in the instance
173193323Sed  // class.
174193323Sed  bool on_stack() const                      { return (_flags &_on_stack) != 0; }
175206083Srdivacky  void set_on_stack(const bool value);
176206083Srdivacky
177206083Srdivacky  // Klass holding pool
178206083Srdivacky  InstanceKlass* pool_holder() const      { return _pool_holder; }
179206083Srdivacky  void set_pool_holder(InstanceKlass* k)  { _pool_holder = k; }
180206083Srdivacky  InstanceKlass** pool_holder_addr()      { return &_pool_holder; }
181206083Srdivacky
182206083Srdivacky  // Interpreter runtime support
183206083Srdivacky  ConstantPoolCache* cache() const        { return _cache; }
184206083Srdivacky  void set_cache(ConstantPoolCache* cache){ _cache = cache; }
185206083Srdivacky
186206083Srdivacky  // Create object cache in the constant pool
187234353Sdim  void initialize_resolved_references(ClassLoaderData* loader_data,
188193323Sed                                      intStack reference_map,
189193323Sed                                      int constant_pool_map_length,
190206083Srdivacky                                      TRAPS);
191193323Sed
192193323Sed  // resolved strings, methodHandles and callsite objects from the constant pool
193193323Sed  objArrayOop resolved_references()  const;
194193323Sed  // mapping resolved object array indexes to cp indexes and back.
195207618Srdivacky  int object_to_cp_index(int index)         { return _reference_map->at(index); }
196207618Srdivacky  int cp_to_object_index(int index);
197206083Srdivacky
198193323Sed  // Invokedynamic indexes.
199206083Srdivacky  // They must look completely different from normal indexes.
200206083Srdivacky  // The main reason is that byte swapping is sometimes done on normal indexes.
201206083Srdivacky  // Finally, it is helpful for debugging to tell the two apart.
202206083Srdivacky  static bool is_invokedynamic_index(int i) { return (i < 0); }
203206083Srdivacky  static int  decode_invokedynamic_index(int i) { assert(is_invokedynamic_index(i),  ""); return ~i; }
204206083Srdivacky  static int  encode_invokedynamic_index(int i) { assert(!is_invokedynamic_index(i), ""); return ~i; }
205206083Srdivacky
206206083Srdivacky
207206083Srdivacky  // The invokedynamic points at a CP cache entry.  This entry points back
208206083Srdivacky  // at the original CP entry (CONSTANT_InvokeDynamic) and also (via f2) at an entry
209206083Srdivacky  // in the resolved_references array (which provides the appendix argument).
210206083Srdivacky  int invokedynamic_cp_cache_index(int index) const {
211206083Srdivacky    assert (is_invokedynamic_index(index), "should be a invokedynamic index");
212206083Srdivacky    int cache_index = decode_invokedynamic_index(index);
213206083Srdivacky    return cache_index;
214206083Srdivacky  }
215206083Srdivacky  ConstantPoolCacheEntry* invokedynamic_cp_cache_entry_at(int index) const {
216206083Srdivacky    // decode index that invokedynamic points to.
217206083Srdivacky    int cp_cache_index = invokedynamic_cp_cache_index(index);
218206083Srdivacky    return cache()->entry_at(cp_cache_index);
219206083Srdivacky  }
220206083Srdivacky
221206083Srdivacky  // Assembly code support
222193323Sed  static int tags_offset_in_bytes()         { return offset_of(ConstantPool, _tags); }
223207618Srdivacky  static int cache_offset_in_bytes()        { return offset_of(ConstantPool, _cache); }
224207618Srdivacky  static int pool_holder_offset_in_bytes()  { return offset_of(ConstantPool, _pool_holder); }
225206083Srdivacky  static int resolved_references_offset_in_bytes() { return offset_of(ConstantPool, _resolved_references); }
226206083Srdivacky
227193323Sed  // Storing constants
228206083Srdivacky
229198090Srdivacky  void klass_at_put(int which, Klass* k) {
230206083Srdivacky    assert(k != NULL, "resolved class shouldn't be null");
231206083Srdivacky    assert(is_within_bounds(which), "index out of bounds");
232206083Srdivacky    OrderAccess::release_store_ptr((Klass* volatile *)obj_at_addr_raw(which), k);
233206083Srdivacky    // The interpreter assumes when the tag is stored, the klass is resolved
234206083Srdivacky    // and the Klass* is a klass rather than a Symbol*, so we need
235193323Sed    // hardware store ordering here.
236193323Sed    release_tag_at_put(which, JVM_CONSTANT_Class);
237210299Sed  }
238210299Sed
239210299Sed  // For temporary use while constructing constant pool
240193323Sed  void klass_index_at_put(int which, int name_index) {
241210299Sed    tag_at_put(which, JVM_CONSTANT_ClassIndex);
242210299Sed    *int_at_addr(which) = name_index;
243210299Sed  }
244193323Sed
245193323Sed  // Temporary until actual use
246193323Sed  void unresolved_klass_at_put(int which, Symbol* s) {
247193323Sed    release_tag_at_put(which, JVM_CONSTANT_UnresolvedClass);
248193323Sed    slot_at_put(which, s);
249206083Srdivacky  }
250206083Srdivacky
251206083Srdivacky  void method_handle_index_at_put(int which, int ref_kind, int ref_index) {
252193323Sed    tag_at_put(which, JVM_CONSTANT_MethodHandle);
253206083Srdivacky    *int_at_addr(which) = ((jint) ref_index<<16) | ref_kind;
254206083Srdivacky  }
255206083Srdivacky
256206083Srdivacky  void method_type_index_at_put(int which, int ref_index) {
257206083Srdivacky    tag_at_put(which, JVM_CONSTANT_MethodType);
258206083Srdivacky    *int_at_addr(which) = ref_index;
259206083Srdivacky  }
260206083Srdivacky
261206083Srdivacky  void invoke_dynamic_at_put(int which, int bootstrap_specifier_index, int name_and_type_index) {
262206083Srdivacky    tag_at_put(which, JVM_CONSTANT_InvokeDynamic);
263193323Sed    *int_at_addr(which) = ((jint) name_and_type_index<<16) | bootstrap_specifier_index;
264193323Sed  }
265206083Srdivacky
266206083Srdivacky  void unresolved_string_at_put(int which, Symbol* s) {
267206083Srdivacky    release_tag_at_put(which, JVM_CONSTANT_String);
268206083Srdivacky    slot_at_put(which, CPSlot(s, CPSlot::_symbol_bit));
269206083Srdivacky  }
270206083Srdivacky
271206083Srdivacky  void int_at_put(int which, jint i) {
272199481Srdivacky    tag_at_put(which, JVM_CONSTANT_Integer);
273206083Srdivacky    *int_at_addr(which) = i;
274206083Srdivacky  }
275206083Srdivacky
276206083Srdivacky  void long_at_put(int which, jlong l) {
277193323Sed    tag_at_put(which, JVM_CONSTANT_Long);
278193323Sed    // *long_at_addr(which) = l;
279206083Srdivacky    Bytes::put_native_u8((address)long_at_addr(which), *((u8*) &l));
280206083Srdivacky  }
281206083Srdivacky
282206083Srdivacky  void float_at_put(int which, jfloat f) {
283206083Srdivacky    tag_at_put(which, JVM_CONSTANT_Float);
284206083Srdivacky    *float_at_addr(which) = f;
285193323Sed  }
286206083Srdivacky
287206083Srdivacky  void double_at_put(int which, jdouble d) {
288206083Srdivacky    tag_at_put(which, JVM_CONSTANT_Double);
289206083Srdivacky    // *double_at_addr(which) = d;
290206083Srdivacky    // u8 temp = *(u8*) &d;
291206083Srdivacky    Bytes::put_native_u8((address) double_at_addr(which), *((u8*) &d));
292206083Srdivacky  }
293206083Srdivacky
294206083Srdivacky  Symbol** symbol_at_addr(int which) const {
295206083Srdivacky    assert(is_within_bounds(which), "index out of bounds");
296206083Srdivacky    return (Symbol**) &base()[which];
297206083Srdivacky  }
298206083Srdivacky
299206083Srdivacky  void symbol_at_put(int which, Symbol* s) {
300206083Srdivacky    assert(s->refcount() != 0, "should have nonzero refcount");
301193323Sed    tag_at_put(which, JVM_CONSTANT_Utf8);
302193323Sed    *symbol_at_addr(which) = s;
303206083Srdivacky  }
304206083Srdivacky
305206083Srdivacky  void string_at_put(int which, int obj_index, oop str) {
306206083Srdivacky    resolved_references()->obj_at_put(obj_index, str);
307206083Srdivacky  }
308206083Srdivacky
309206083Srdivacky  // For temporary use while constructing constant pool
310206083Srdivacky  void string_index_at_put(int which, int string_index) {
311206083Srdivacky    tag_at_put(which, JVM_CONSTANT_StringIndex);
312206083Srdivacky    *int_at_addr(which) = string_index;
313193323Sed  }
314206083Srdivacky
315206083Srdivacky  void field_at_put(int which, int class_index, int name_and_type_index) {
316206083Srdivacky    tag_at_put(which, JVM_CONSTANT_Fieldref);
317206083Srdivacky    *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
318206083Srdivacky  }
319206083Srdivacky
320206083Srdivacky  void method_at_put(int which, int class_index, int name_and_type_index) {
321206083Srdivacky    tag_at_put(which, JVM_CONSTANT_Methodref);
322206083Srdivacky    *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;
323206083Srdivacky  }
324206083Srdivacky
325206083Srdivacky  void interface_method_at_put(int which, int class_index, int name_and_type_index) {
326206083Srdivacky    tag_at_put(which, JVM_CONSTANT_InterfaceMethodref);
327206083Srdivacky    *int_at_addr(which) = ((jint) name_and_type_index<<16) | class_index;  // Not so nice
328206083Srdivacky  }
329206083Srdivacky
330206083Srdivacky  void name_and_type_at_put(int which, int name_index, int signature_index) {
331206083Srdivacky    tag_at_put(which, JVM_CONSTANT_NameAndType);
332206083Srdivacky    *int_at_addr(which) = ((jint) signature_index<<16) | name_index;  // Not so nice
333234353Sdim  }
334234353Sdim
335234353Sdim  // Tag query
336206083Srdivacky
337206083Srdivacky  constantTag tag_at(int which) const { return (constantTag)tags()->at_acquire(which); }
338206083Srdivacky
339206083Srdivacky  // Fetching constants
340206083Srdivacky
341206083Srdivacky  Klass* klass_at(int which, TRAPS) {
342206083Srdivacky    constantPoolHandle h_this(THREAD, this);
343206083Srdivacky    return klass_at_impl(h_this, which, true, THREAD);
344206083Srdivacky  }
345206083Srdivacky
346206083Srdivacky  // Version of klass_at that doesn't save the resolution error, called during deopt
347206083Srdivacky  Klass* klass_at_ignore_error(int which, TRAPS) {
348206083Srdivacky    constantPoolHandle h_this(THREAD, this);
349206083Srdivacky    return klass_at_impl(h_this, which, false, THREAD);
350206083Srdivacky  }
351206083Srdivacky
352206083Srdivacky  Symbol* klass_name_at(int which);  // Returns the name, w/o resolving.
353206083Srdivacky
354206083Srdivacky  Klass* resolved_klass_at(int which) const {  // Used by Compiler
355206083Srdivacky    guarantee(tag_at(which).is_klass(), "Corrupted constant pool");
356206083Srdivacky    // Must do an acquire here in case another thread resolved the klass
357206083Srdivacky    // behind our back, lest we later load stale values thru the oop.
358206083Srdivacky    return CPSlot((Klass*)OrderAccess::load_ptr_acquire(obj_at_addr_raw(which))).get_klass();
359206083Srdivacky  }
360206083Srdivacky
361193323Sed  // RedefineClasses() API support:
362193323Sed  Symbol* klass_at_noresolve(int which) { return klass_name_at(which); }
363206083Srdivacky
364206083Srdivacky  jint int_at(int which) {
365198090Srdivacky    assert(tag_at(which).is_int(), "Corrupted constant pool");
366193323Sed    return *int_at_addr(which);
367206083Srdivacky  }
368206083Srdivacky
369206083Srdivacky  jlong long_at(int which) {
370206083Srdivacky    assert(tag_at(which).is_long(), "Corrupted constant pool");
371206083Srdivacky    // return *long_at_addr(which);
372206083Srdivacky    u8 tmp = Bytes::get_native_u8((address)&base()[which]);
373206083Srdivacky    return *((jlong*)&tmp);
374206083Srdivacky  }
375206083Srdivacky
376206083Srdivacky  jfloat float_at(int which) {
377193323Sed    assert(tag_at(which).is_float(), "Corrupted constant pool");
378206083Srdivacky    return *float_at_addr(which);
379206083Srdivacky  }
380206083Srdivacky
381193323Sed  jdouble double_at(int which) {
382193323Sed    assert(tag_at(which).is_double(), "Corrupted constant pool");
383206083Srdivacky    u8 tmp = Bytes::get_native_u8((address)&base()[which]);
384206083Srdivacky    return *((jdouble*)&tmp);
385198090Srdivacky  }
386195098Sed
387206083Srdivacky  Symbol* symbol_at(int which) {
388206083Srdivacky    assert(tag_at(which).is_utf8(), "Corrupted constant pool");
389195098Sed    return *symbol_at_addr(which);
390  }
391
392  oop string_at(int which, int obj_index, TRAPS) {
393    constantPoolHandle h_this(THREAD, this);
394    return string_at_impl(h_this, which, obj_index, THREAD);
395  }
396  oop string_at(int which, TRAPS) {
397    int obj_index = cp_to_object_index(which);
398    return string_at(which, obj_index, THREAD);
399  }
400
401  // Version that can be used before string oop array is created.
402  oop uncached_string_at(int which, TRAPS);
403
404  // A "pseudo-string" is an non-string oop that has found its way into
405  // a String entry.
406  // This can happen if the user patches a live
407  // object into a CONSTANT_String entry of an anonymous class.
408  // Method oops internally created for method handles may also
409  // use pseudo-strings to link themselves to related metaobjects.
410
411  bool is_pseudo_string_at(int which) {
412    assert(tag_at(which).is_string(), "Corrupted constant pool");
413    return slot_at(which).is_pseudo_string();
414  }
415
416  oop pseudo_string_at(int which, int obj_index) {
417    assert(is_pseudo_string_at(which), "must be a pseudo-string");
418    oop s = resolved_references()->obj_at(obj_index);
419    return s;
420  }
421
422  oop pseudo_string_at(int which) {
423    assert(is_pseudo_string_at(which), "must be a pseudo-string");
424    int obj_index = cp_to_object_index(which);
425    oop s = resolved_references()->obj_at(obj_index);
426    return s;
427  }
428
429  void pseudo_string_at_put(int which, int obj_index, oop x) {
430    assert(tag_at(which).is_string(), "Corrupted constant pool");
431    Symbol* sym = unresolved_string_at(which);
432    slot_at_put(which, CPSlot(sym, (CPSlot::_symbol_bit | CPSlot::_pseudo_bit)));
433    string_at_put(which, obj_index, x);    // this works just fine
434  }
435
436  // only called when we are sure a string entry is already resolved (via an
437  // earlier string_at call.
438  oop resolved_string_at(int which) {
439    assert(tag_at(which).is_string(), "Corrupted constant pool");
440    // Must do an acquire here in case another thread resolved the klass
441    // behind our back, lest we later load stale values thru the oop.
442    // we might want a volatile_obj_at in ObjArrayKlass.
443    int obj_index = cp_to_object_index(which);
444    return resolved_references()->obj_at(obj_index);
445  }
446
447  Symbol* unresolved_string_at(int which) {
448    assert(tag_at(which).is_string(), "Corrupted constant pool");
449    Symbol* sym = slot_at(which).get_symbol();
450    return sym;
451  }
452
453  // Returns an UTF8 for a CONSTANT_String entry at a given index.
454  // UTF8 char* representation was chosen to avoid conversion of
455  // java_lang_Strings at resolved entries into Symbol*s
456  // or vice versa.
457  char* string_at_noresolve(int which);
458
459  jint name_and_type_at(int which) {
460    assert(tag_at(which).is_name_and_type(), "Corrupted constant pool");
461    return *int_at_addr(which);
462  }
463
464 private:
465  int method_handle_ref_kind_at(int which, bool error_ok) {
466    assert(tag_at(which).is_method_handle() ||
467           (error_ok && tag_at(which).is_method_handle_in_error()), "Corrupted constant pool");
468    return extract_low_short_from_int(*int_at_addr(which));  // mask out unwanted ref_index bits
469  }
470  int method_handle_index_at(int which, bool error_ok) {
471    assert(tag_at(which).is_method_handle() ||
472           (error_ok && tag_at(which).is_method_handle_in_error()), "Corrupted constant pool");
473    return extract_high_short_from_int(*int_at_addr(which));  // shift out unwanted ref_kind bits
474  }
475  int method_type_index_at(int which, bool error_ok) {
476    assert(tag_at(which).is_method_type() ||
477           (error_ok && tag_at(which).is_method_type_in_error()), "Corrupted constant pool");
478    return *int_at_addr(which);
479  }
480 public:
481  int method_handle_ref_kind_at(int which) {
482    return method_handle_ref_kind_at(which, false);
483  }
484  int method_handle_ref_kind_at_error_ok(int which) {
485    return method_handle_ref_kind_at(which, true);
486  }
487  int method_handle_index_at(int which) {
488    return method_handle_index_at(which, false);
489  }
490  int method_handle_index_at_error_ok(int which) {
491    return method_handle_index_at(which, true);
492  }
493  int method_type_index_at(int which) {
494    return method_type_index_at(which, false);
495  }
496  int method_type_index_at_error_ok(int which) {
497    return method_type_index_at(which, true);
498  }
499
500  // Derived queries:
501  Symbol* method_handle_name_ref_at(int which) {
502    int member = method_handle_index_at(which);
503    return impl_name_ref_at(member, true);
504  }
505  Symbol* method_handle_signature_ref_at(int which) {
506    int member = method_handle_index_at(which);
507    return impl_signature_ref_at(member, true);
508  }
509  int method_handle_klass_index_at(int which) {
510    int member = method_handle_index_at(which);
511    return impl_klass_ref_index_at(member, true);
512  }
513  Symbol* method_type_signature_at(int which) {
514    int sym = method_type_index_at(which);
515    return symbol_at(sym);
516  }
517
518  int invoke_dynamic_name_and_type_ref_index_at(int which) {
519    assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
520    return extract_high_short_from_int(*int_at_addr(which));
521  }
522  int invoke_dynamic_bootstrap_specifier_index(int which) {
523    assert(tag_at(which).value() == JVM_CONSTANT_InvokeDynamic, "Corrupted constant pool");
524    return extract_low_short_from_int(*int_at_addr(which));
525  }
526  int invoke_dynamic_operand_base(int which) {
527    int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
528    return operand_offset_at(operands(), bootstrap_specifier_index);
529  }
530  // The first part of the operands array consists of an index into the second part.
531  // Extract a 32-bit index value from the first part.
532  static int operand_offset_at(Array<u2>* operands, int bootstrap_specifier_index) {
533    int n = (bootstrap_specifier_index * 2);
534    assert(n >= 0 && n+2 <= operands->length(), "oob");
535    // The first 32-bit index points to the beginning of the second part
536    // of the operands array.  Make sure this index is in the first part.
537    DEBUG_ONLY(int second_part = build_int_from_shorts(operands->at(0),
538                                                       operands->at(1)));
539    assert(second_part == 0 || n+2 <= second_part, "oob (2)");
540    int offset = build_int_from_shorts(operands->at(n+0),
541                                       operands->at(n+1));
542    // The offset itself must point into the second part of the array.
543    assert(offset == 0 || offset >= second_part && offset <= operands->length(), "oob (3)");
544    return offset;
545  }
546  static void operand_offset_at_put(Array<u2>* operands, int bootstrap_specifier_index, int offset) {
547    int n = bootstrap_specifier_index * 2;
548    assert(n >= 0 && n+2 <= operands->length(), "oob");
549    operands->at_put(n+0, extract_low_short_from_int(offset));
550    operands->at_put(n+1, extract_high_short_from_int(offset));
551  }
552  static int operand_array_length(Array<u2>* operands) {
553    if (operands == NULL || operands->length() == 0)  return 0;
554    int second_part = operand_offset_at(operands, 0);
555    return (second_part / 2);
556  }
557
558#ifdef ASSERT
559  // operand tuples fit together exactly, end to end
560  static int operand_limit_at(Array<u2>* operands, int bootstrap_specifier_index) {
561    int nextidx = bootstrap_specifier_index + 1;
562    if (nextidx == operand_array_length(operands))
563      return operands->length();
564    else
565      return operand_offset_at(operands, nextidx);
566  }
567  int invoke_dynamic_operand_limit(int which) {
568    int bootstrap_specifier_index = invoke_dynamic_bootstrap_specifier_index(which);
569    return operand_limit_at(operands(), bootstrap_specifier_index);
570  }
571#endif //ASSERT
572
573  // layout of InvokeDynamic bootstrap method specifier (in second part of operands array):
574  enum {
575         _indy_bsm_offset  = 0,  // CONSTANT_MethodHandle bsm
576         _indy_argc_offset = 1,  // u2 argc
577         _indy_argv_offset = 2   // u2 argv[argc]
578  };
579
580  // These functions are used in RedefineClasses for CP merge
581
582  int operand_offset_at(int bootstrap_specifier_index) {
583    assert(0 <= bootstrap_specifier_index &&
584           bootstrap_specifier_index < operand_array_length(operands()),
585           "Corrupted CP operands");
586    return operand_offset_at(operands(), bootstrap_specifier_index);
587  }
588  int operand_bootstrap_method_ref_index_at(int bootstrap_specifier_index) {
589    int offset = operand_offset_at(bootstrap_specifier_index);
590    return operands()->at(offset + _indy_bsm_offset);
591  }
592  int operand_argument_count_at(int bootstrap_specifier_index) {
593    int offset = operand_offset_at(bootstrap_specifier_index);
594    int argc = operands()->at(offset + _indy_argc_offset);
595    return argc;
596  }
597  int operand_argument_index_at(int bootstrap_specifier_index, int j) {
598    int offset = operand_offset_at(bootstrap_specifier_index);
599    return operands()->at(offset + _indy_argv_offset + j);
600  }
601  int operand_next_offset_at(int bootstrap_specifier_index) {
602    int offset = operand_offset_at(bootstrap_specifier_index) + _indy_argv_offset
603                   + operand_argument_count_at(bootstrap_specifier_index);
604    return offset;
605  }
606  // Compare a bootsrap specifier in the operands arrays
607  bool compare_operand_to(int bootstrap_specifier_index1, constantPoolHandle cp2,
608                          int bootstrap_specifier_index2, TRAPS);
609  // Find a bootsrap specifier in the operands array
610  int find_matching_operand(int bootstrap_specifier_index, constantPoolHandle search_cp,
611                            int operands_cur_len, TRAPS);
612  // Resize the operands array with delta_len and delta_size
613  void resize_operands(int delta_len, int delta_size, TRAPS);
614  // Extend the operands array with the length and size of the ext_cp operands
615  void extend_operands(constantPoolHandle ext_cp, TRAPS);
616  // Shrink the operands array to a smaller array with new_len length
617  void shrink_operands(int new_len, TRAPS);
618
619
620  int invoke_dynamic_bootstrap_method_ref_index_at(int which) {
621    assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
622    int op_base = invoke_dynamic_operand_base(which);
623    return operands()->at(op_base + _indy_bsm_offset);
624  }
625  int invoke_dynamic_argument_count_at(int which) {
626    assert(tag_at(which).is_invoke_dynamic(), "Corrupted constant pool");
627    int op_base = invoke_dynamic_operand_base(which);
628    int argc = operands()->at(op_base + _indy_argc_offset);
629    DEBUG_ONLY(int end_offset = op_base + _indy_argv_offset + argc;
630               int next_offset = invoke_dynamic_operand_limit(which));
631    assert(end_offset == next_offset, "matched ending");
632    return argc;
633  }
634  int invoke_dynamic_argument_index_at(int which, int j) {
635    int op_base = invoke_dynamic_operand_base(which);
636    DEBUG_ONLY(int argc = operands()->at(op_base + _indy_argc_offset));
637    assert((uint)j < (uint)argc, "oob");
638    return operands()->at(op_base + _indy_argv_offset + j);
639  }
640
641  // The following methods (name/signature/klass_ref_at, klass_ref_at_noresolve,
642  // name_and_type_ref_index_at) all expect to be passed indices obtained
643  // directly from the bytecode.
644  // If the indices are meant to refer to fields or methods, they are
645  // actually rewritten constant pool cache indices.
646  // The routine remap_instruction_operand_from_cache manages the adjustment
647  // of these values back to constant pool indices.
648
649  // There are also "uncached" versions which do not adjust the operand index; see below.
650
651  // FIXME: Consider renaming these with a prefix "cached_" to make the distinction clear.
652  // In a few cases (the verifier) there are uses before a cpcache has been built,
653  // which are handled by a dynamic check in remap_instruction_operand_from_cache.
654  // FIXME: Remove the dynamic check, and adjust all callers to specify the correct mode.
655
656  // Lookup for entries consisting of (klass_index, name_and_type index)
657  Klass* klass_ref_at(int which, TRAPS);
658  Symbol* klass_ref_at_noresolve(int which);
659  Symbol* name_ref_at(int which)                { return impl_name_ref_at(which, false); }
660  Symbol* signature_ref_at(int which)           { return impl_signature_ref_at(which, false); }
661
662  int klass_ref_index_at(int which)               { return impl_klass_ref_index_at(which, false); }
663  int name_and_type_ref_index_at(int which)       { return impl_name_and_type_ref_index_at(which, false); }
664
665  int remap_instruction_operand_from_cache(int operand);  // operand must be biased by CPCACHE_INDEX_TAG
666
667  // Lookup for entries consisting of (name_index, signature_index)
668  int name_ref_index_at(int which_nt);            // ==  low-order jshort of name_and_type_at(which_nt)
669  int signature_ref_index_at(int which_nt);       // == high-order jshort of name_and_type_at(which_nt)
670
671  BasicType basic_type_for_signature_at(int which);
672
673  // Resolve string constants (to prevent allocation during compilation)
674  void resolve_string_constants(TRAPS) {
675    constantPoolHandle h_this(THREAD, this);
676    resolve_string_constants_impl(h_this, CHECK);
677  }
678
679  // CDS support
680  void remove_unshareable_info();
681  void restore_unshareable_info(TRAPS);
682  bool resolve_class_constants(TRAPS);
683  // The ConstantPool vtable is restored by this call when the ConstantPool is
684  // in the shared archive.  See patch_klass_vtables() in metaspaceShared.cpp for
685  // all the gory details.  SA, dtrace and pstack helpers distinguish metadata
686  // by their vtable.
687  void restore_vtable() { guarantee(is_constantPool(), "vtable restored by this call"); }
688
689 private:
690  enum { _no_index_sentinel = -1, _possible_index_sentinel = -2 };
691 public:
692
693  // Resolve late bound constants.
694  oop resolve_constant_at(int index, TRAPS) {
695    constantPoolHandle h_this(THREAD, this);
696    return resolve_constant_at_impl(h_this, index, _no_index_sentinel, THREAD);
697  }
698
699  oop resolve_cached_constant_at(int cache_index, TRAPS) {
700    constantPoolHandle h_this(THREAD, this);
701    return resolve_constant_at_impl(h_this, _no_index_sentinel, cache_index, THREAD);
702  }
703
704  oop resolve_possibly_cached_constant_at(int pool_index, TRAPS) {
705    constantPoolHandle h_this(THREAD, this);
706    return resolve_constant_at_impl(h_this, pool_index, _possible_index_sentinel, THREAD);
707  }
708
709  oop resolve_bootstrap_specifier_at(int index, TRAPS) {
710    constantPoolHandle h_this(THREAD, this);
711    return resolve_bootstrap_specifier_at_impl(h_this, index, THREAD);
712  }
713
714  // Klass name matches name at offset
715  bool klass_name_at_matches(instanceKlassHandle k, int which);
716
717  // Sizing
718  int length() const                   { return _length; }
719  void set_length(int length)          { _length = length; }
720
721  // Tells whether index is within bounds.
722  bool is_within_bounds(int index) const {
723    return 0 <= index && index < length();
724  }
725
726  // Sizing (in words)
727  static int header_size()             { return sizeof(ConstantPool)/HeapWordSize; }
728  static int size(int length)          { return align_object_size(header_size() + length); }
729  int size() const                     { return size(length()); }
730#if INCLUDE_SERVICES
731  void collect_statistics(KlassSizeStats *sz) const;
732#endif
733
734  friend class ClassFileParser;
735  friend class SystemDictionary;
736
737  // Used by compiler to prevent classloading.
738  static Method*          method_at_if_loaded      (constantPoolHandle this_cp, int which);
739  static bool       has_appendix_at_if_loaded      (constantPoolHandle this_cp, int which);
740  static oop            appendix_at_if_loaded      (constantPoolHandle this_cp, int which);
741  static bool    has_method_type_at_if_loaded      (constantPoolHandle this_cp, int which);
742  static oop         method_type_at_if_loaded      (constantPoolHandle this_cp, int which);
743  static Klass*            klass_at_if_loaded      (constantPoolHandle this_cp, int which);
744  static Klass*        klass_ref_at_if_loaded      (constantPoolHandle this_cp, int which);
745
746  // Routines currently used for annotations (only called by jvm.cpp) but which might be used in the
747  // future by other Java code. These take constant pool indices rather than
748  // constant pool cache indices as do the peer methods above.
749  Symbol* uncached_klass_ref_at_noresolve(int which);
750  Symbol* uncached_name_ref_at(int which)                 { return impl_name_ref_at(which, true); }
751  Symbol* uncached_signature_ref_at(int which)            { return impl_signature_ref_at(which, true); }
752  int       uncached_klass_ref_index_at(int which)          { return impl_klass_ref_index_at(which, true); }
753  int       uncached_name_and_type_ref_index_at(int which)  { return impl_name_and_type_ref_index_at(which, true); }
754
755  // Sharing
756  int pre_resolve_shared_klasses(TRAPS);
757
758  // Debugging
759  const char* printable_name_at(int which) PRODUCT_RETURN0;
760
761#ifdef ASSERT
762  enum { CPCACHE_INDEX_TAG = 0x10000 };  // helps keep CP cache indices distinct from CP indices
763#else
764  enum { CPCACHE_INDEX_TAG = 0 };        // in product mode, this zero value is a no-op
765#endif //ASSERT
766
767  static int decode_cpcache_index(int raw_index, bool invokedynamic_ok = false) {
768    if (invokedynamic_ok && is_invokedynamic_index(raw_index))
769      return decode_invokedynamic_index(raw_index);
770    else
771      return raw_index - CPCACHE_INDEX_TAG;
772  }
773
774 private:
775
776  void set_resolved_references(jobject s) { _resolved_references = s; }
777  Array<u2>* reference_map() const        { return _reference_map; }
778  void set_reference_map(Array<u2>* o)    { _reference_map = o; }
779
780  // patch JSR 292 resolved references after the class is linked.
781  void patch_resolved_references(GrowableArray<Handle>* cp_patches);
782
783  Symbol* impl_name_ref_at(int which, bool uncached);
784  Symbol* impl_signature_ref_at(int which, bool uncached);
785  int       impl_klass_ref_index_at(int which, bool uncached);
786  int       impl_name_and_type_ref_index_at(int which, bool uncached);
787
788  // Used while constructing constant pool (only by ClassFileParser)
789  jint klass_index_at(int which) {
790    assert(tag_at(which).is_klass_index(), "Corrupted constant pool");
791    return *int_at_addr(which);
792  }
793
794  jint string_index_at(int which) {
795    assert(tag_at(which).is_string_index(), "Corrupted constant pool");
796    return *int_at_addr(which);
797  }
798
799  // Performs the LinkResolver checks
800  static void verify_constant_pool_resolve(constantPoolHandle this_cp, KlassHandle klass, TRAPS);
801
802  // Implementation of methods that needs an exposed 'this' pointer, in order to
803  // handle GC while executing the method
804  static Klass* klass_at_impl(constantPoolHandle this_cp, int which,
805                              bool save_resolution_error, TRAPS);
806  static oop string_at_impl(constantPoolHandle this_cp, int which, int obj_index, TRAPS);
807
808  static void trace_class_resolution(constantPoolHandle this_cp, KlassHandle k);
809
810  // Resolve string constants (to prevent allocation during compilation)
811  static void resolve_string_constants_impl(constantPoolHandle this_cp, TRAPS);
812
813  static oop resolve_constant_at_impl(constantPoolHandle this_cp, int index, int cache_index, TRAPS);
814  static oop resolve_bootstrap_specifier_at_impl(constantPoolHandle this_cp, int index, TRAPS);
815
816  // Exception handling
817  static void throw_resolution_error(constantPoolHandle this_cp, int which, TRAPS);
818  static Symbol* exception_message(constantPoolHandle this_cp, int which, constantTag tag, oop pending_exception);
819  static void save_and_throw_exception(constantPoolHandle this_cp, int which, constantTag tag, TRAPS);
820
821 public:
822  // Merging ConstantPool* support:
823  bool compare_entry_to(int index1, constantPoolHandle cp2, int index2, TRAPS);
824  void copy_cp_to(int start_i, int end_i, constantPoolHandle to_cp, int to_i, TRAPS) {
825    constantPoolHandle h_this(THREAD, this);
826    copy_cp_to_impl(h_this, start_i, end_i, to_cp, to_i, THREAD);
827  }
828  static void copy_cp_to_impl(constantPoolHandle from_cp, int start_i, int end_i, constantPoolHandle to_cp, int to_i, TRAPS);
829  static void copy_entry_to(constantPoolHandle from_cp, int from_i, constantPoolHandle to_cp, int to_i, TRAPS);
830  static void copy_operands(constantPoolHandle from_cp, constantPoolHandle to_cp, TRAPS);
831  int  find_matching_entry(int pattern_i, constantPoolHandle search_cp, TRAPS);
832  int  version() const                    { return _saved._version; }
833  void set_version(int version)           { _saved._version = version; }
834  void increment_and_save_version(int version) {
835    _saved._version = version >= 0 ? (version + 1) : version;  // keep overflow
836  }
837
838  void set_resolved_reference_length(int length) { _saved._resolved_reference_length = length; }
839  int  resolved_reference_length() const  { return _saved._resolved_reference_length; }
840
841  // Decrease ref counts of symbols that are in the constant pool
842  // when the holder class is unloaded
843  void unreference_symbols();
844
845  // Deallocate constant pool for RedefineClasses
846  void deallocate_contents(ClassLoaderData* loader_data);
847  void release_C_heap_structures();
848
849  // JVMTI accesss - GetConstantPool, RetransformClasses, ...
850  friend class JvmtiConstantPoolReconstituter;
851
852 private:
853  jint cpool_entry_size(jint idx);
854  jint hash_entries_to(SymbolHashMap *symmap, SymbolHashMap *classmap);
855
856  // Copy cpool bytes into byte array.
857  // Returns:
858  //  int > 0, count of the raw cpool bytes that have been copied
859  //        0, OutOfMemory error
860  //       -1, Internal error
861  int  copy_cpool_bytes(int cpool_size,
862                        SymbolHashMap* tbl,
863                        unsigned char *bytes);
864
865 public:
866  // Verify
867  void verify_on(outputStream* st);
868
869  // Printing
870  void print_on(outputStream* st) const;
871  void print_value_on(outputStream* st) const;
872  void print_entry_on(int index, outputStream* st);
873
874  const char* internal_name() const { return "{constant pool}"; }
875
876#ifndef PRODUCT
877  // Compile the world support
878  static void preload_and_initialize_all_classes(ConstantPool* constant_pool, TRAPS);
879#endif
880};
881
882class SymbolHashMapEntry : public CHeapObj<mtSymbol> {
883 private:
884  unsigned int        _hash;   // 32-bit hash for item
885  SymbolHashMapEntry* _next;   // Next element in the linked list for this bucket
886  Symbol*             _symbol; // 1-st part of the mapping: symbol => value
887  u2                  _value;  // 2-nd part of the mapping: symbol => value
888
889 public:
890  unsigned   int hash() const             { return _hash;   }
891  void       set_hash(unsigned int hash)  { _hash = hash;   }
892
893  SymbolHashMapEntry* next() const        { return _next;   }
894  void set_next(SymbolHashMapEntry* next) { _next = next;   }
895
896  Symbol*    symbol() const               { return _symbol; }
897  void       set_symbol(Symbol* sym)      { _symbol = sym;  }
898
899  u2         value() const                {  return _value; }
900  void       set_value(u2 value)          { _value = value; }
901
902  SymbolHashMapEntry(unsigned int hash, Symbol* symbol, u2 value)
903    : _hash(hash), _symbol(symbol), _value(value), _next(NULL) {}
904
905}; // End SymbolHashMapEntry class
906
907
908class SymbolHashMapBucket : public CHeapObj<mtSymbol> {
909
910private:
911  SymbolHashMapEntry*    _entry;
912
913public:
914  SymbolHashMapEntry* entry() const         {  return _entry; }
915  void set_entry(SymbolHashMapEntry* entry) { _entry = entry; }
916  void clear()                              { _entry = NULL;  }
917
918}; // End SymbolHashMapBucket class
919
920
921class SymbolHashMap: public CHeapObj<mtSymbol> {
922
923 private:
924  // Default number of entries in the table
925  enum SymbolHashMap_Constants {
926    _Def_HashMap_Size = 256
927  };
928
929  int                   _table_size;
930  SymbolHashMapBucket*  _buckets;
931
932  void initialize_table(int table_size) {
933    _table_size = table_size;
934    _buckets = NEW_C_HEAP_ARRAY(SymbolHashMapBucket, table_size, mtSymbol);
935    for (int index = 0; index < table_size; index++) {
936      _buckets[index].clear();
937    }
938  }
939
940 public:
941
942  int table_size() const        { return _table_size; }
943
944  SymbolHashMap()               { initialize_table(_Def_HashMap_Size); }
945  SymbolHashMap(int table_size) { initialize_table(table_size); }
946
947  // hash P(31) from Kernighan & Ritchie
948  static unsigned int compute_hash(const char* str, int len) {
949    unsigned int hash = 0;
950    while (len-- > 0) {
951      hash = 31*hash + (unsigned) *str;
952      str++;
953    }
954    return hash;
955  }
956
957  SymbolHashMapEntry* bucket(int i) {
958    return _buckets[i].entry();
959  }
960
961  void add_entry(Symbol* sym, u2 value);
962  SymbolHashMapEntry* find_entry(Symbol* sym);
963
964  u2 symbol_to_value(Symbol* sym) {
965    SymbolHashMapEntry *entry = find_entry(sym);
966    return (entry == NULL) ? 0 : entry->value();
967  }
968
969  ~SymbolHashMap() {
970    SymbolHashMapEntry* next;
971    for (int i = 0; i < _table_size; i++) {
972      for (SymbolHashMapEntry* cur = bucket(i); cur != NULL; cur = next) {
973        next = cur->next();
974        delete(cur);
975      }
976    }
977    delete _buckets;
978  }
979}; // End SymbolHashMap class
980
981#endif // SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP
982