ciObjectFactory.cpp revision 3602:da91efe96a93
1/*
2 * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "ci/ciCallSite.hpp"
27#include "ci/ciInstance.hpp"
28#include "ci/ciInstanceKlass.hpp"
29#include "ci/ciMemberName.hpp"
30#include "ci/ciMethod.hpp"
31#include "ci/ciMethodData.hpp"
32#include "ci/ciMethodHandle.hpp"
33#include "ci/ciNullObject.hpp"
34#include "ci/ciObjArray.hpp"
35#include "ci/ciObjArrayKlass.hpp"
36#include "ci/ciObject.hpp"
37#include "ci/ciObjectFactory.hpp"
38#include "ci/ciSymbol.hpp"
39#include "ci/ciTypeArray.hpp"
40#include "ci/ciTypeArrayKlass.hpp"
41#include "ci/ciUtilities.hpp"
42#include "classfile/systemDictionary.hpp"
43#include "gc_interface/collectedHeap.inline.hpp"
44#include "memory/allocation.inline.hpp"
45#include "oops/oop.inline.hpp"
46#include "oops/oop.inline2.hpp"
47#include "runtime/fieldType.hpp"
48
49// ciObjectFactory
50//
51// This class handles requests for the creation of new instances
52// of ciObject and its subclasses.  It contains a caching mechanism
53// which ensures that for each oop, at most one ciObject is created.
54// This invariant allows more efficient implementation of ciObject.
55//
56// Implementation note: the oop->ciObject mapping is represented as
57// a table stored in an array.  Even though objects are moved
58// by the garbage collector, the compactor preserves their relative
59// order; address comparison of oops (in perm space) is safe so long
60// as we prohibit GC during our comparisons.  We currently use binary
61// search to find the oop in the table, and inserting a new oop
62// into the table may be costly.  If this cost ends up being
63// problematic the underlying data structure can be switched to some
64// sort of balanced binary tree.
65
66GrowableArray<ciMetadata*>* ciObjectFactory::_shared_ci_metadata = NULL;
67ciSymbol*                 ciObjectFactory::_shared_ci_symbols[vmSymbols::SID_LIMIT];
68int                       ciObjectFactory::_shared_ident_limit = 0;
69volatile bool             ciObjectFactory::_initialized = false;
70
71
72// ------------------------------------------------------------------
73// ciObjectFactory::ciObjectFactory
74ciObjectFactory::ciObjectFactory(Arena* arena,
75                                 int expected_size) {
76
77  for (int i = 0; i < NON_PERM_BUCKETS; i++) {
78    _non_perm_bucket[i] = NULL;
79  }
80  _non_perm_count = 0;
81
82  _next_ident = _shared_ident_limit;
83  _arena = arena;
84  _ci_metadata = new (arena) GrowableArray<ciMetadata*>(arena, expected_size, 0, NULL);
85
86  // If the shared ci objects exist append them to this factory's objects
87
88  if (_shared_ci_metadata != NULL) {
89    _ci_metadata->appendAll(_shared_ci_metadata);
90  }
91
92  _unloaded_methods = new (arena) GrowableArray<ciMethod*>(arena, 4, 0, NULL);
93  _unloaded_klasses = new (arena) GrowableArray<ciKlass*>(arena, 8, 0, NULL);
94  _unloaded_instances = new (arena) GrowableArray<ciInstance*>(arena, 4, 0, NULL);
95  _return_addresses =
96    new (arena) GrowableArray<ciReturnAddress*>(arena, 8, 0, NULL);
97
98  _symbols = new (arena) GrowableArray<ciSymbol*>(arena, 100, 0, NULL);
99}
100
101// ------------------------------------------------------------------
102// ciObjectFactory::ciObjectFactory
103void ciObjectFactory::initialize() {
104  ASSERT_IN_VM;
105  JavaThread* thread = JavaThread::current();
106  HandleMark  handle_mark(thread);
107
108  // This Arena is long lived and exists in the resource mark of the
109  // compiler thread that initializes the initial ciObjectFactory which
110  // creates the shared ciObjects that all later ciObjectFactories use.
111  Arena* arena = new (mtCompiler) Arena();
112  ciEnv initial(arena);
113  ciEnv* env = ciEnv::current();
114  env->_factory->init_shared_objects();
115
116  _initialized = true;
117
118}
119
120void ciObjectFactory::init_shared_objects() {
121
122  _next_ident = 1;  // start numbering CI objects at 1
123
124  {
125    // Create the shared symbols, but not in _shared_ci_metadata.
126    int i;
127    for (i = vmSymbols::FIRST_SID; i < vmSymbols::SID_LIMIT; i++) {
128      Symbol* vmsym = vmSymbols::symbol_at((vmSymbols::SID) i);
129      assert(vmSymbols::find_sid(vmsym) == i, "1-1 mapping");
130      ciSymbol* sym = new (_arena) ciSymbol(vmsym, (vmSymbols::SID) i);
131      init_ident_of(sym);
132      _shared_ci_symbols[i] = sym;
133    }
134#ifdef ASSERT
135    for (i = vmSymbols::FIRST_SID; i < vmSymbols::SID_LIMIT; i++) {
136      Symbol* vmsym = vmSymbols::symbol_at((vmSymbols::SID) i);
137      ciSymbol* sym = vm_symbol_at((vmSymbols::SID) i);
138      assert(sym->get_symbol() == vmsym, "oop must match");
139    }
140    assert(ciSymbol::void_class_signature()->get_symbol() == vmSymbols::void_class_signature(), "spot check");
141#endif
142  }
143
144  _ci_metadata = new (_arena) GrowableArray<ciMetadata*>(_arena, 64, 0, NULL);
145
146  for (int i = T_BOOLEAN; i <= T_CONFLICT; i++) {
147    BasicType t = (BasicType)i;
148    if (type2name(t) != NULL && t != T_OBJECT && t != T_ARRAY && t != T_NARROWOOP) {
149      ciType::_basic_types[t] = new (_arena) ciType(t);
150      init_ident_of(ciType::_basic_types[t]);
151    }
152  }
153
154  ciEnv::_null_object_instance = new (_arena) ciNullObject();
155  init_ident_of(ciEnv::_null_object_instance);
156
157#define WK_KLASS_DEFN(name, ignore_s, opt)                              \
158  if (SystemDictionary::name() != NULL) \
159    ciEnv::_##name = get_metadata(SystemDictionary::name())->as_instance_klass();
160
161  WK_KLASSES_DO(WK_KLASS_DEFN)
162#undef WK_KLASS_DEFN
163
164  for (int len = -1; len != _ci_metadata->length(); ) {
165    len = _ci_metadata->length();
166    for (int i2 = 0; i2 < len; i2++) {
167      ciMetadata* obj = _ci_metadata->at(i2);
168      assert (obj->is_metadata(), "what else would it be?");
169      if (obj->is_loaded() && obj->is_instance_klass()) {
170        obj->as_instance_klass()->compute_nonstatic_fields();
171      }
172    }
173  }
174
175  ciEnv::_unloaded_cisymbol = ciObjectFactory::get_symbol(vmSymbols::dummy_symbol());
176  // Create dummy InstanceKlass and objArrayKlass object and assign them idents
177  ciEnv::_unloaded_ciinstance_klass = new (_arena) ciInstanceKlass(ciEnv::_unloaded_cisymbol, NULL, NULL);
178  init_ident_of(ciEnv::_unloaded_ciinstance_klass);
179  ciEnv::_unloaded_ciobjarrayklass = new (_arena) ciObjArrayKlass(ciEnv::_unloaded_cisymbol, ciEnv::_unloaded_ciinstance_klass, 1);
180  init_ident_of(ciEnv::_unloaded_ciobjarrayklass);
181  assert(ciEnv::_unloaded_ciobjarrayklass->is_obj_array_klass(), "just checking");
182
183  get_metadata(Universe::boolArrayKlassObj());
184  get_metadata(Universe::charArrayKlassObj());
185  get_metadata(Universe::singleArrayKlassObj());
186  get_metadata(Universe::doubleArrayKlassObj());
187  get_metadata(Universe::byteArrayKlassObj());
188  get_metadata(Universe::shortArrayKlassObj());
189  get_metadata(Universe::intArrayKlassObj());
190  get_metadata(Universe::longArrayKlassObj());
191
192
193
194  assert(_non_perm_count == 0, "no shared non-perm objects");
195
196  // The shared_ident_limit is the first ident number that will
197  // be used for non-shared objects.  That is, numbers less than
198  // this limit are permanently assigned to shared CI objects,
199  // while the higher numbers are recycled afresh by each new ciEnv.
200
201  _shared_ident_limit = _next_ident;
202  _shared_ci_metadata = _ci_metadata;
203}
204
205
206ciSymbol* ciObjectFactory::get_symbol(Symbol* key) {
207  vmSymbols::SID sid = vmSymbols::find_sid(key);
208  if (sid != vmSymbols::NO_SID) {
209    // do not pollute the main cache with it
210    return vm_symbol_at(sid);
211  }
212
213  assert(vmSymbols::find_sid(key) == vmSymbols::NO_SID, "");
214  ciSymbol* s = new (arena()) ciSymbol(key, vmSymbols::NO_SID);
215  _symbols->push(s);
216  return s;
217}
218
219// Decrement the refcount when done on symbols referenced by this compilation.
220void ciObjectFactory::remove_symbols() {
221  for (int i = 0; i < _symbols->length(); i++) {
222    ciSymbol* s = _symbols->at(i);
223    s->get_symbol()->decrement_refcount();
224  }
225  // Since _symbols is resource allocated we're not allowed to delete it
226  // but it'll go away just the same.
227}
228
229// ------------------------------------------------------------------
230// ciObjectFactory::get
231//
232// Get the ciObject corresponding to some oop.  If the ciObject has
233// already been created, it is returned.  Otherwise, a new ciObject
234// is created.
235ciObject* ciObjectFactory::get(oop key) {
236  ASSERT_IN_VM;
237
238  assert(key == NULL || Universe::heap()->is_in_reserved(key), "must be");
239
240    NonPermObject* &bucket = find_non_perm(key);
241    if (bucket != NULL) {
242      return bucket->object();
243    }
244
245    // The ciObject does not yet exist.  Create it and insert it
246    // into the cache.
247    Handle keyHandle(key);
248    ciObject* new_object = create_new_object(keyHandle());
249    assert(keyHandle() == new_object->get_oop(), "must be properly recorded");
250    init_ident_of(new_object);
251  assert(Universe::heap()->is_in_reserved(new_object->get_oop()), "must be");
252
253      // Not a perm-space object.
254      insert_non_perm(bucket, keyHandle(), new_object);
255      return new_object;
256    }
257
258// ------------------------------------------------------------------
259// ciObjectFactory::get
260//
261// Get the ciObject corresponding to some oop.  If the ciObject has
262// already been created, it is returned.  Otherwise, a new ciObject
263// is created.
264ciMetadata* ciObjectFactory::get_metadata(Metadata* key) {
265  ASSERT_IN_VM;
266
267  assert(key == NULL || key->is_metadata(), "must be");
268
269#ifdef ASSERT
270  if (CIObjectFactoryVerify) {
271    Metadata* last = NULL;
272    for (int j = 0; j< _ci_metadata->length(); j++) {
273      Metadata* o = _ci_metadata->at(j)->constant_encoding();
274      assert(last < o, "out of order");
275      last = o;
276    }
277  }
278#endif // ASSERT
279  int len = _ci_metadata->length();
280  int index = find(key, _ci_metadata);
281#ifdef ASSERT
282  if (CIObjectFactoryVerify) {
283    for (int i=0; i<_ci_metadata->length(); i++) {
284      if (_ci_metadata->at(i)->constant_encoding() == key) {
285        assert(index == i, " bad lookup");
286      }
287    }
288  }
289#endif
290  if (!is_found_at(index, key, _ci_metadata)) {
291    // The ciObject does not yet exist.  Create it and insert it
292    // into the cache.
293    ciMetadata* new_object = create_new_object(key);
294    init_ident_of(new_object);
295    assert(new_object->is_metadata(), "must be");
296
297    if (len != _ci_metadata->length()) {
298      // creating the new object has recursively entered new objects
299      // into the table.  We need to recompute our index.
300      index = find(key, _ci_metadata);
301    }
302    assert(!is_found_at(index, key, _ci_metadata), "no double insert");
303    insert(index, new_object, _ci_metadata);
304    return new_object;
305  }
306  return _ci_metadata->at(index)->as_metadata();
307}
308
309// ------------------------------------------------------------------
310// ciObjectFactory::create_new_object
311//
312// Create a new ciObject from an oop.
313//
314// Implementation note: this functionality could be virtual behavior
315// of the oop itself.  For now, we explicitly marshal the object.
316ciObject* ciObjectFactory::create_new_object(oop o) {
317  EXCEPTION_CONTEXT;
318
319  if (o->is_instance()) {
320    instanceHandle h_i(THREAD, (instanceOop)o);
321    if (java_lang_invoke_CallSite::is_instance(o))
322      return new (arena()) ciCallSite(h_i);
323    else if (java_lang_invoke_MemberName::is_instance(o))
324      return new (arena()) ciMemberName(h_i);
325    else if (java_lang_invoke_MethodHandle::is_instance(o))
326      return new (arena()) ciMethodHandle(h_i);
327    else
328      return new (arena()) ciInstance(h_i);
329  } else if (o->is_objArray()) {
330    objArrayHandle h_oa(THREAD, (objArrayOop)o);
331    return new (arena()) ciObjArray(h_oa);
332  } else if (o->is_typeArray()) {
333    typeArrayHandle h_ta(THREAD, (typeArrayOop)o);
334    return new (arena()) ciTypeArray(h_ta);
335  }
336
337  // The oop is of some type not supported by the compiler interface.
338  ShouldNotReachHere();
339  return NULL;
340}
341
342// ------------------------------------------------------------------
343// ciObjectFactory::create_new_object
344//
345// Create a new ciObject from a Metadata*.
346//
347// Implementation note: this functionality could be virtual behavior
348// of the oop itself.  For now, we explicitly marshal the object.
349ciMetadata* ciObjectFactory::create_new_object(Metadata* o) {
350  EXCEPTION_CONTEXT;
351
352  if (o->is_klass()) {
353    KlassHandle h_k(THREAD, (Klass*)o);
354    Klass* k = (Klass*)o;
355    if (k->oop_is_instance()) {
356      return new (arena()) ciInstanceKlass(h_k);
357    } else if (k->oop_is_objArray()) {
358      return new (arena()) ciObjArrayKlass(h_k);
359    } else if (k->oop_is_typeArray()) {
360      return new (arena()) ciTypeArrayKlass(h_k);
361    }
362  } else if (o->is_method()) {
363    methodHandle h_m(THREAD, (Method*)o);
364    return new (arena()) ciMethod(h_m);
365  } else if (o->is_methodData()) {
366    // Hold methodHandle alive - might not be necessary ???
367    methodHandle h_m(THREAD, ((MethodData*)o)->method());
368    return new (arena()) ciMethodData((MethodData*)o);
369  }
370
371  // The oop is of some type not supported by the compiler interface.
372  ShouldNotReachHere();
373  return NULL;
374}
375
376//------------------------------------------------------------------
377// ciObjectFactory::get_unloaded_method
378//
379// Get the ciMethod representing an unloaded/unfound method.
380//
381// Implementation note: unloaded methods are currently stored in
382// an unordered array, requiring a linear-time lookup for each
383// unloaded method.  This may need to change.
384ciMethod* ciObjectFactory::get_unloaded_method(ciInstanceKlass* holder,
385                                               ciSymbol*        name,
386                                               ciSymbol*        signature,
387                                               ciInstanceKlass* accessor) {
388  ciSignature* that = NULL;
389  for (int i = 0; i < _unloaded_methods->length(); i++) {
390    ciMethod* entry = _unloaded_methods->at(i);
391    if (entry->holder()->equals(holder) &&
392        entry->name()->equals(name) &&
393        entry->signature()->as_symbol()->equals(signature)) {
394      // Short-circuit slow resolve.
395      if (entry->signature()->accessing_klass() == accessor) {
396        // We've found a match.
397        return entry;
398      } else {
399        // Lazily create ciSignature
400        if (that == NULL)  that = new (arena()) ciSignature(accessor, constantPoolHandle(), signature);
401        if (entry->signature()->equals(that)) {
402          // We've found a match.
403          return entry;
404        }
405      }
406    }
407  }
408
409  // This is a new unloaded method.  Create it and stick it in
410  // the cache.
411  ciMethod* new_method = new (arena()) ciMethod(holder, name, signature, accessor);
412
413  init_ident_of(new_method);
414  _unloaded_methods->append(new_method);
415
416  return new_method;
417}
418
419//------------------------------------------------------------------
420// ciObjectFactory::get_unloaded_klass
421//
422// Get a ciKlass representing an unloaded klass.
423//
424// Implementation note: unloaded klasses are currently stored in
425// an unordered array, requiring a linear-time lookup for each
426// unloaded klass.  This may need to change.
427ciKlass* ciObjectFactory::get_unloaded_klass(ciKlass* accessing_klass,
428                                             ciSymbol* name,
429                                             bool create_if_not_found) {
430  EXCEPTION_CONTEXT;
431  oop loader = NULL;
432  oop domain = NULL;
433  if (accessing_klass != NULL) {
434    loader = accessing_klass->loader();
435    domain = accessing_klass->protection_domain();
436  }
437  for (int i=0; i<_unloaded_klasses->length(); i++) {
438    ciKlass* entry = _unloaded_klasses->at(i);
439    if (entry->name()->equals(name) &&
440        entry->loader() == loader &&
441        entry->protection_domain() == domain) {
442      // We've found a match.
443      return entry;
444    }
445  }
446
447  if (!create_if_not_found)
448    return NULL;
449
450  // This is a new unloaded klass.  Create it and stick it in
451  // the cache.
452  ciKlass* new_klass = NULL;
453
454  // Two cases: this is an unloaded objArrayKlass or an
455  // unloaded InstanceKlass.  Deal with both.
456  if (name->byte_at(0) == '[') {
457    // Decompose the name.'
458    FieldArrayInfo fd;
459    BasicType element_type = FieldType::get_array_info(name->get_symbol(),
460                                                       fd, THREAD);
461    if (HAS_PENDING_EXCEPTION) {
462      CLEAR_PENDING_EXCEPTION;
463      CURRENT_THREAD_ENV->record_out_of_memory_failure();
464      return ciEnv::_unloaded_ciobjarrayklass;
465    }
466    int dimension = fd.dimension();
467    assert(element_type != T_ARRAY, "unsuccessful decomposition");
468    ciKlass* element_klass = NULL;
469    if (element_type == T_OBJECT) {
470      ciEnv *env = CURRENT_THREAD_ENV;
471      ciSymbol* ci_name = env->get_symbol(fd.object_key());
472      element_klass =
473        env->get_klass_by_name(accessing_klass, ci_name, false)->as_instance_klass();
474    } else {
475      assert(dimension > 1, "one dimensional type arrays are always loaded.");
476
477      // The type array itself takes care of one of the dimensions.
478      dimension--;
479
480      // The element klass is a typeArrayKlass.
481      element_klass = ciTypeArrayKlass::make(element_type);
482    }
483    new_klass = new (arena()) ciObjArrayKlass(name, element_klass, dimension);
484  } else {
485    jobject loader_handle = NULL;
486    jobject domain_handle = NULL;
487    if (accessing_klass != NULL) {
488      loader_handle = accessing_klass->loader_handle();
489      domain_handle = accessing_klass->protection_domain_handle();
490    }
491    new_klass = new (arena()) ciInstanceKlass(name, loader_handle, domain_handle);
492  }
493  init_ident_of(new_klass);
494  _unloaded_klasses->append(new_klass);
495
496  return new_klass;
497}
498
499
500//------------------------------------------------------------------
501// ciObjectFactory::get_unloaded_instance
502//
503// Get a ciInstance representing an as-yet undetermined instance of a given class.
504//
505ciInstance* ciObjectFactory::get_unloaded_instance(ciInstanceKlass* instance_klass) {
506  for (int i=0; i<_unloaded_instances->length(); i++) {
507    ciInstance* entry = _unloaded_instances->at(i);
508    if (entry->klass()->equals(instance_klass)) {
509      // We've found a match.
510      return entry;
511    }
512  }
513
514  // This is a new unloaded instance.  Create it and stick it in
515  // the cache.
516  ciInstance* new_instance = new (arena()) ciInstance(instance_klass);
517
518  init_ident_of(new_instance);
519  _unloaded_instances->append(new_instance);
520
521  // make sure it looks the way we want:
522  assert(!new_instance->is_loaded(), "");
523  assert(new_instance->klass() == instance_klass, "");
524
525  return new_instance;
526}
527
528
529//------------------------------------------------------------------
530// ciObjectFactory::get_unloaded_klass_mirror
531//
532// Get a ciInstance representing an unresolved klass mirror.
533//
534// Currently, this ignores the parameters and returns a unique unloaded instance.
535ciInstance* ciObjectFactory::get_unloaded_klass_mirror(ciKlass*  type) {
536  assert(ciEnv::_Class_klass != NULL, "");
537  return get_unloaded_instance(ciEnv::_Class_klass->as_instance_klass());
538}
539
540//------------------------------------------------------------------
541// ciObjectFactory::get_unloaded_method_handle_constant
542//
543// Get a ciInstance representing an unresolved method handle constant.
544//
545// Currently, this ignores the parameters and returns a unique unloaded instance.
546ciInstance* ciObjectFactory::get_unloaded_method_handle_constant(ciKlass*  holder,
547                                                                 ciSymbol* name,
548                                                                 ciSymbol* signature,
549                                                                 int       ref_kind) {
550  if (ciEnv::_MethodHandle_klass == NULL)  return NULL;
551  return get_unloaded_instance(ciEnv::_MethodHandle_klass->as_instance_klass());
552}
553
554//------------------------------------------------------------------
555// ciObjectFactory::get_unloaded_method_type_constant
556//
557// Get a ciInstance representing an unresolved method type constant.
558//
559// Currently, this ignores the parameters and returns a unique unloaded instance.
560ciInstance* ciObjectFactory::get_unloaded_method_type_constant(ciSymbol* signature) {
561  if (ciEnv::_MethodType_klass == NULL)  return NULL;
562  return get_unloaded_instance(ciEnv::_MethodType_klass->as_instance_klass());
563}
564
565
566
567//------------------------------------------------------------------
568// ciObjectFactory::get_empty_methodData
569//
570// Get the ciMethodData representing the methodData for a method with
571// none.
572ciMethodData* ciObjectFactory::get_empty_methodData() {
573  ciMethodData* new_methodData = new (arena()) ciMethodData();
574  init_ident_of(new_methodData);
575  return new_methodData;
576}
577
578//------------------------------------------------------------------
579// ciObjectFactory::get_return_address
580//
581// Get a ciReturnAddress for a specified bci.
582ciReturnAddress* ciObjectFactory::get_return_address(int bci) {
583  for (int i=0; i<_return_addresses->length(); i++) {
584    ciReturnAddress* entry = _return_addresses->at(i);
585    if (entry->bci() == bci) {
586      // We've found a match.
587      return entry;
588    }
589  }
590
591  ciReturnAddress* new_ret_addr = new (arena()) ciReturnAddress(bci);
592  init_ident_of(new_ret_addr);
593  _return_addresses->append(new_ret_addr);
594  return new_ret_addr;
595}
596
597// ------------------------------------------------------------------
598// ciObjectFactory::init_ident_of
599void ciObjectFactory::init_ident_of(ciBaseObject* obj) {
600  obj->set_ident(_next_ident++);
601}
602
603// ------------------------------------------------------------------
604// ciObjectFactory::find
605//
606// Use binary search to find the position of this oop in the cache.
607// If there is no entry in the cache corresponding to this oop, return
608// the position at which the oop should be inserted.
609int ciObjectFactory::find(Metadata* key, GrowableArray<ciMetadata*>* objects) {
610  int min = 0;
611  int max = objects->length()-1;
612
613  // print_contents();
614
615  while (max >= min) {
616    int mid = (max + min) / 2;
617    Metadata* value = objects->at(mid)->constant_encoding();
618    if (value < key) {
619      min = mid + 1;
620    } else if (value > key) {
621      max = mid - 1;
622    } else {
623      return mid;
624    }
625  }
626  return min;
627}
628
629// ------------------------------------------------------------------
630// ciObjectFactory::is_found_at
631//
632// Verify that the binary seach found the given key.
633bool ciObjectFactory::is_found_at(int index, Metadata* key, GrowableArray<ciMetadata*>* objects) {
634  return (index < objects->length() &&
635          objects->at(index)->constant_encoding() == key);
636}
637
638
639// ------------------------------------------------------------------
640// ciObjectFactory::insert
641//
642// Insert a ciObject into the table at some index.
643void ciObjectFactory::insert(int index, ciMetadata* obj, GrowableArray<ciMetadata*>* objects) {
644  int len = objects->length();
645  if (len == index) {
646    objects->append(obj);
647  } else {
648    objects->append(objects->at(len-1));
649    int pos;
650    for (pos = len-2; pos >= index; pos--) {
651      objects->at_put(pos+1,objects->at(pos));
652    }
653    objects->at_put(index, obj);
654  }
655}
656
657static ciObjectFactory::NonPermObject* emptyBucket = NULL;
658
659// ------------------------------------------------------------------
660// ciObjectFactory::find_non_perm
661//
662// Use a small hash table, hashed on the klass of the key.
663// If there is no entry in the cache corresponding to this oop, return
664// the null tail of the bucket into which the oop should be inserted.
665ciObjectFactory::NonPermObject* &ciObjectFactory::find_non_perm(oop key) {
666  assert(Universe::heap()->is_in_reserved_or_null(key), "must be");
667  ciMetadata* klass = get_metadata(key->klass());
668  NonPermObject* *bp = &_non_perm_bucket[(unsigned) klass->hash() % NON_PERM_BUCKETS];
669  for (NonPermObject* p; (p = (*bp)) != NULL; bp = &p->next()) {
670    if (is_equal(p, key))  break;
671  }
672  return (*bp);
673}
674
675
676
677// ------------------------------------------------------------------
678// Code for for NonPermObject
679//
680inline ciObjectFactory::NonPermObject::NonPermObject(ciObjectFactory::NonPermObject* &bucket, oop key, ciObject* object) {
681  assert(ciObjectFactory::is_initialized(), "");
682  _object = object;
683  _next = bucket;
684  bucket = this;
685}
686
687
688
689// ------------------------------------------------------------------
690// ciObjectFactory::insert_non_perm
691//
692// Insert a ciObject into the non-perm table.
693void ciObjectFactory::insert_non_perm(ciObjectFactory::NonPermObject* &where, oop key, ciObject* obj) {
694  assert(Universe::heap()->is_in_reserved_or_null(key), "must be");
695  assert(&where != &emptyBucket, "must not try to fill empty bucket");
696  NonPermObject* p = new (arena()) NonPermObject(where, key, obj);
697  assert(where == p && is_equal(p, key) && p->object() == obj, "entry must match");
698  assert(find_non_perm(key) == p, "must find the same spot");
699  ++_non_perm_count;
700}
701
702// ------------------------------------------------------------------
703// ciObjectFactory::vm_symbol_at
704// Get the ciSymbol corresponding to some index in vmSymbols.
705ciSymbol* ciObjectFactory::vm_symbol_at(int index) {
706  assert(index >= vmSymbols::FIRST_SID && index < vmSymbols::SID_LIMIT, "oob");
707  return _shared_ci_symbols[index];
708}
709
710// ------------------------------------------------------------------
711// ciObjectFactory::metadata_do
712void ciObjectFactory::metadata_do(void f(Metadata*)) {
713  if (_ci_metadata == NULL) return;
714  for (int j = 0; j< _ci_metadata->length(); j++) {
715    Metadata* o = _ci_metadata->at(j)->constant_encoding();
716    f(o);
717  }
718}
719
720// ------------------------------------------------------------------
721// ciObjectFactory::print_contents_impl
722void ciObjectFactory::print_contents_impl() {
723  int len = _ci_metadata->length();
724  tty->print_cr("ciObjectFactory (%d) meta data contents:", len);
725  for (int i=0; i<len; i++) {
726    _ci_metadata->at(i)->print();
727    tty->cr();
728  }
729}
730
731// ------------------------------------------------------------------
732// ciObjectFactory::print_contents
733void ciObjectFactory::print_contents() {
734  print();
735  tty->cr();
736  GUARDED_VM_ENTRY(print_contents_impl();)
737}
738
739// ------------------------------------------------------------------
740// ciObjectFactory::print
741//
742// Print debugging information about the object factory
743void ciObjectFactory::print() {
744  tty->print("<ciObjectFactory oops=%d metadata=%d unloaded_methods=%d unloaded_instances=%d unloaded_klasses=%d>",
745             _non_perm_count, _ci_metadata->length(), _unloaded_methods->length(),
746             _unloaded_instances->length(),
747             _unloaded_klasses->length());
748}
749