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.VM; 016 import org.jikesrvm.compilers.common.BootImageCompiler; 017 import org.jikesrvm.compilers.common.CompiledMethod; 018 import org.jikesrvm.ArchitectureSpecific.CodeArray; 019 020 /** 021 * A method that is specialized across all reference types. 022 * <p> 023 * In general as there may not be a 1-1 mapping between objects and the 024 * specialized methods this class is responsible for performing the 025 * mapping. 026 * <p> 027 * Specialized methods must have a static 'invoke' method that matches 028 * the given signature and return type. 029 */ 030 public abstract class SpecializedMethod { 031 032 /** This specialized method's id */ 033 protected final int id; 034 035 /** 036 * Constructor. 037 */ 038 protected SpecializedMethod(int id) { 039 this.id = id; 040 } 041 042 /** 043 * @return the specialized method for the given type. 044 */ 045 public abstract CodeArray specializeMethod(RVMType type); 046 047 /** 048 * @return the method signature of the specialized method's invoke. 049 */ 050 public abstract TypeReference[] getSignature(); 051 052 /** 053 * @return the return type of the specialized method's invoke 054 */ 055 public abstract TypeReference getReturnType(); 056 057 /** 058 * Compile a specialized version of a template method. The template must be a method 059 * that matches the signature of this specialized method class. 060 * 061 * The specialized types are the set of types to tell the compiler to use during specialized 062 * compilation. This array must match the length of the array returned from getSignature. 063 * 064 * @param template The method to use as a template 065 * @param specializedParams The known types of the parameters, possibly more refined than in the template 066 * @return The compiled code array. 067 */ 068 protected CompiledMethod compileSpecializedMethod(RVMMethod template, TypeReference[] specializedParams) { 069 NormalMethod normalMethod = (NormalMethod)template; 070 /* Currently only support eagerly compiled methods */ 071 if (VM.VerifyAssertions) VM._assert(VM.writingBootImage); 072 073 return BootImageCompiler.compile(normalMethod, specializedParams); 074 } 075 }