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