001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.classloader;
014    
015    import org.jikesrvm.mm.mminterface.MemoryManager;
016    
017    import org.jikesrvm.VM;
018    
019    /**
020     * The manager of specialized methods.
021     */
022    public final class SpecializedMethodManager {
023      /** The number of specialized methods. Currently the MM is the only consumer. */
024      private static final int numSpecializedMethods = MemoryManager.numSpecializedMethods();
025    
026      /** All the specialized methods */
027      private static final SpecializedMethod[] methods = new SpecializedMethod[numSpecializedMethods];
028    
029      /** The number of specialized methods */
030      public static int numSpecializedMethods() { return numSpecializedMethods; }
031    
032      /** Set up the specialized methods for the given type */
033      public static void notifyTypeInstantiated(RVMType type) {
034        for(int i=0; i < numSpecializedMethods; i++) {
035          if (methods[i] == null) {
036            initializeSpecializedMethod(i);
037          }
038          type.setSpecializedMethod(i, methods[i].specializeMethod(type));
039        }
040      }
041    
042      /** Set up the specialized methods for the given type */
043      public static void refreshSpecializedMethods(RVMType type) {
044        for(int i=0; i < numSpecializedMethods; i++) {
045          if (VM.VerifyAssertions) VM._assert(methods[i] != null, "Specialized method missing!");
046          type.setSpecializedMethod(i, methods[i].specializeMethod(type));
047        }
048      }
049    
050      /** Ensure that a specific specialized method now exists. */
051      private static void initializeSpecializedMethod(int id) {
052        if (VM.VerifyAssertions) VM._assert(id >= 0);
053        if (VM.VerifyAssertions) VM._assert(id < numSpecializedMethods);
054        if (VM.VerifyAssertions) VM._assert(methods[id] == null);
055        methods[id] = MemoryManager.createSpecializedMethod(id);
056      }
057    
058      /** Can not create an instance of the manager */
059      private SpecializedMethodManager() {}
060    }