1 cananian 1.1.2.1 // JLSRuntimeInformation.java, created Mon Jan 17 03:19:30 2000 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Backend.Analysis; 5 cananian 1.1.2.1 6 cananian 1.1.2.1 import harpoon.Backend.Generic.RuntimeInformation; 7 cananian 1.1.2.1 import harpoon.ClassFile.HClass; 8 cananian 1.1.2.1 import harpoon.ClassFile.HMethod; 9 cananian 1.1.2.1 import harpoon.ClassFile.Linker; 10 cananian 1.1.2.1 import harpoon.Util.ArraySet; 11 cananian 1.1.2.1 import harpoon.Util.Util; 12 cananian 1.1.2.1 13 cananian 1.1.2.1 import java.lang.reflect.Modifier; 14 cananian 1.1.2.1 import java.util.Arrays; 15 cananian 1.1.2.1 import java.util.Collections; 16 cananian 1.1.2.1 import java.util.Set; 17 cananian 1.1.2.1 /** 18 cananian 1.1.2.1 * <code>JLSRuntimeInformation</code> contains the basic runtime information 19 cananian 1.1.2.1 * required by the 20 cananian 1.1.2.1 * <A HREF="http://java.sun.com/docs/books/jls/html/index.html">Java 21 cananian 1.1.2.1 * Language Specification</A>. All possible runtime systems/JVMs must 22 cananian 1.1.2.1 * display any behavior specified in this class. 23 cananian 1.1.2.1 * 24 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 25 cananian 1.2 * @version $Id: JLSRuntimeInformation.java,v 1.2 2002/02/25 21:00:47 cananian Exp $ 26 cananian 1.1.2.1 * @see RuntimeInformation 27 cananian 1.1.2.1 */ 28 cananian 1.1.2.1 public abstract class JLSRuntimeInformation extends RuntimeInformation { 29 cananian 1.1.2.1 protected Linker linker; 30 cananian 1.1.2.1 31 cananian 1.1.2.1 /** Creates a <code>JDKRuntimeInformation</code>. */ 32 cananian 1.1.2.1 public JLSRuntimeInformation(Linker linker) { 33 cananian 1.1.2.1 super(linker); 34 cananian 1.1.2.1 HCioE = linker.forName("java.io.IOException"); 35 cananian 1.1.2.1 HCstring = linker.forName("java.lang.String"); 36 cananian 1.1.2.1 HCsystem = linker.forName("java.lang.System"); 37 cananian 1.1.2.1 HCthread = linker.forName("java.lang.Thread"); 38 cananian 1.1.2.1 HMthreadStart = HCthread.getMethod("start", new HClass[0]); 39 cananian 1.1.2.1 HMthreadRun = HCthread.getMethod("run", new HClass[0]); 40 cananian 1.1.2.1 HMsysArrayCopy = HCsystem 41 cananian 1.1.2.1 .getMethod("arraycopy", 42 cananian 1.1.2.1 "(Ljava/lang/Object;ILjava/lang/Object;II)V"); 43 cananian 1.1.2.1 } 44 cananian 1.1.2.1 protected final HClass HCioE, HCstring, HCsystem, HCthread; 45 cananian 1.1.2.1 protected final HMethod HMsysArrayCopy, HMthreadStart, HMthreadRun; 46 cananian 1.1.2.1 47 cananian 1.1.2.1 public Set baseClasses() { 48 cananian 1.1.2.1 return new ArraySet(new HClass[] { 49 cananian 1.1.2.1 HClass.Boolean, HClass.Byte, HClass.Short, HClass.Int, 50 cananian 1.1.2.1 HClass.Long, HClass.Float, HClass.Double, HClass.Char, 51 cananian 1.1.2.1 HCstring, // for string constants 52 cananian 1.1.2.1 }); 53 cananian 1.1.2.1 } 54 cananian 1.1.2.1 public Set methodsCallableFrom(HMethod m) { 55 cananian 1.1.2.1 // Thread.start() implicitly causes a call to Thread.run() 56 cananian 1.1.2.1 if (m.equals(HMthreadStart)) return Collections.singleton(HMthreadRun); 57 cananian 1.1.2.1 // assume that any native method declared as throwing IOException 58 cananian 1.1.2.1 // may in fact do so. 59 cananian 1.1.2.1 if (Modifier.isNative(m.getModifiers()) && 60 cananian 1.1.2.1 Arrays.asList(m.getExceptionTypes()).contains(HCioE)) 61 cananian 1.1.2.1 return new ArraySet(new HMethod[] { 62 cananian 1.1.2.1 HCioE.getConstructor(new HClass[0]), 63 cananian 1.1.2.1 HCioE.getConstructor(new HClass[] { HCstring }), 64 cananian 1.1.2.1 }); 65 cananian 1.1.2.1 // System.arrayCopy can really throw the exceptions it says it can. 66 cananian 1.1.2.1 if (m.equals(HMsysArrayCopy)) 67 cananian 1.1.2.1 return new ArraySet(new HMethod[] { 68 cananian 1.1.2.1 linker.forName("java.lang.ArrayIndexOutOfBoundsException") 69 cananian 1.1.2.1 .getConstructor(new HClass[] { HCstring }), 70 cananian 1.1.2.1 linker.forName("java.lang.ArrayStoreException") 71 cananian 1.1.2.1 .getConstructor(new HClass[] { HCstring }), 72 cananian 1.1.2.1 }); 73 cananian 1.1.2.1 // okay, this method is boring. 74 cananian 1.1.2.1 return Collections.EMPTY_SET; 75 cananian 1.1.2.1 } 76 cananian 1.1.2.1 public Set initiallyCallableMethods() { 77 cananian 1.1.2.1 return Collections.EMPTY_SET; 78 cananian 1.1.2.1 } 79 cananian 1.1.2.1 } 80 cananian 1.2