1 /*
   2  * Copyright (c) 2003, 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 package sun.jvm.hotspot.memory;
  26 
  27 import sun.jvm.hotspot.debugger.*;
  28 import sun.jvm.hotspot.oops.*;
  29 import sun.jvm.hotspot.runtime.*;
  30 import sun.jvm.hotspot.utilities.*;
  31 
  32 public class PlaceholderTable extends TwoOopHashtable {
  33   public PlaceholderTable(Address addr) {
  34     super(addr);
  35   }
  36 
  37   // this is overriden here so that Hashtable.bucket will return
  38   // object of PlacholderEntry.class
  39   protected Class getHashtableEntryClass() {
  40     return PlaceholderEntry.class;
  41   }
  42 
  43   /** All array classes of primitive type, and their class loaders */
  44   public void primArrayClassesDo(SystemDictionary.ClassAndLoaderVisitor v) {
  45     ObjectHeap heap = VM.getVM().getObjectHeap();
  46     int tblSize = tableSize();
  47     for (int index = 0; index < tblSize; index++) {
  48       for (PlaceholderEntry probe = (PlaceholderEntry) bucket(index); probe != null;
  49                                           probe = (PlaceholderEntry) probe.next()) {
  50         Symbol sym = probe.klass();
  51         // array of primitive arrays are stored in system dictionary as placeholders
  52         FieldType ft = new FieldType(sym);
  53         if (ft.isArray()) {
  54           FieldType.ArrayInfo info = ft.getArrayInfo();
  55           if (info.elementBasicType() != BasicType.getTObject()) {
  56             Klass arrayKlass = heap.typeArrayKlassObj(info.elementBasicType());
  57             arrayKlass = arrayKlass.arrayKlassOrNull(info.dimension());
  58             v.visit(arrayKlass, probe.loader());
  59           }
  60         }
  61       }
  62     }
  63   }
  64 }