1 cananian 1.1.2.1 // INRuntime.java, created Fri Jan  1 12:17:30 1999 by cananian
 2 cananian 1.1.2.3 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.3 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.Interpret.Quads;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.2 import harpoon.ClassFile.HClass;
 7 cananian 1.1.2.2 import harpoon.ClassFile.HField;
 8 cananian 1.1.2.2 import harpoon.ClassFile.HMethod;
 9 cananian 1.1.2.1 
10 cananian 1.1.2.1 /**
11 cananian 1.1.2.1  * <code>INRuntime</code> provides implementations of the native methods in
12 cananian 1.1.2.1  * <code>java.lang.Runtime</code>.
13 cananian 1.1.2.1  * 
14 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
15 cananian 1.2      * @version $Id: INRuntime.java,v 1.2 2002/02/25 21:05:46 cananian Exp $
16 cananian 1.1.2.1  */
17 cananian 1.1.2.4 public class INRuntime {
18 cananian 1.1.2.1     static final void register(StaticState ss) {
19 cananian 1.1.2.5         ss.registerOverride(privateConstructor(ss));
20 cananian 1.1.2.4         ss.register(gc(ss));
21 cananian 1.1.2.5         try { // JDK 1.2 only
22 cananian 1.1.2.5             ss.register(runFinalization0(ss));
23 cananian 1.1.2.5         } catch (NoSuchMethodError e) { // JDK 1.1 fallback.
24 cananian 1.1.2.5             ss.register(runFinalization(ss));
25 cananian 1.1.2.5         }
26 cananian 1.1.2.4         ss.register(freeMemory(ss));
27 cananian 1.1.2.4         ss.register(totalMemory(ss));
28 cananian 1.1.2.1     }
29 cananian 1.1.2.1     // the runtime for the interpreter is identical to the current runtime.
30 cananian 1.1.2.4     private static final NativeMethod privateConstructor(StaticState ss0) {
31 cananian 1.1.2.4         final HMethod hm = ss0.HCruntime.getConstructor(new HClass[0]);
32 cananian 1.1.2.1         return new NativeMethod() {
33 cananian 1.1.2.1             HMethod getMethod() { return hm; }
34 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
35 cananian 1.1.2.1                 ObjectRef obj = (ObjectRef) params[0];
36 cananian 1.1.2.1                 obj.putClosure(Runtime.getRuntime());
37 cananian 1.1.2.1                 return null;
38 cananian 1.1.2.1             }
39 cananian 1.1.2.1         };
40 cananian 1.1.2.1     }
41 cananian 1.1.2.4     private static final NativeMethod gc(StaticState ss0) {
42 cananian 1.1.2.4         final HMethod hm=ss0.HCruntime.getMethod("gc","()V");
43 cananian 1.1.2.1         return new NativeMethod() {
44 cananian 1.1.2.1             HMethod getMethod() { return hm; }
45 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
46 cananian 1.1.2.1                 ObjectRef obj = (ObjectRef) params[0];
47 cananian 1.1.2.1                 Runtime r = (Runtime) obj.getClosure();
48 cananian 1.1.2.1                 r.gc();
49 cananian 1.1.2.1                 return null;
50 cananian 1.1.2.1             }
51 cananian 1.1.2.1         };
52 cananian 1.1.2.1     }
53 cananian 1.1.2.4     private static final NativeMethod runFinalization(StaticState ss0) {
54 cananian 1.1.2.4         final HMethod hm=ss0.HCruntime.getMethod("runFinalization","()V");
55 cananian 1.1.2.1         return new NativeMethod() {
56 cananian 1.1.2.1             HMethod getMethod() { return hm; }
57 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
58 cananian 1.1.2.1                 ObjectRef obj = (ObjectRef) params[0];
59 cananian 1.1.2.1                 Runtime r = (Runtime) obj.getClosure();
60 cananian 1.1.2.1                 r.runFinalization();
61 cananian 1.1.2.1                 return null;
62 cananian 1.1.2.5             }
63 cananian 1.1.2.5         };
64 cananian 1.1.2.5     }
65 cananian 1.1.2.5     // JDK 1.2 stub
66 cananian 1.1.2.5     private static final NativeMethod runFinalization0(StaticState ss0) {
67 cananian 1.1.2.5         final HMethod hm=ss0.HCruntime.getMethod("runFinalization0","()V");
68 cananian 1.1.2.5         return new NativeMethod() {
69 cananian 1.1.2.5             HMethod getMethod() { return hm; }
70 cananian 1.1.2.5             Object invoke(StaticState ss, Object[] params) {
71 cananian 1.1.2.5                 return runFinalization(ss).invoke(ss, params);
72 cananian 1.1.2.1             }
73 cananian 1.1.2.1         };
74 cananian 1.1.2.1     }
75 cananian 1.1.2.4     private static final NativeMethod freeMemory(StaticState ss0) {
76 cananian 1.1.2.4         final HMethod hm=ss0.HCruntime.getMethod("freeMemory","()J");
77 cananian 1.1.2.1         return new NativeMethod() {
78 cananian 1.1.2.1             HMethod getMethod() { return hm; }
79 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
80 cananian 1.1.2.1                 ObjectRef obj = (ObjectRef) params[0];
81 cananian 1.1.2.1                 Runtime r = (Runtime) obj.getClosure();
82 cananian 1.1.2.1                 return new Long(r.freeMemory());
83 cananian 1.1.2.1             }
84 cananian 1.1.2.1         };
85 cananian 1.1.2.1     }
86 cananian 1.1.2.4     private static final NativeMethod totalMemory(StaticState ss0) {
87 cananian 1.1.2.4         final HMethod hm=ss0.HCruntime.getMethod("totalMemory","()J");
88 cananian 1.1.2.1         return new NativeMethod() {
89 cananian 1.1.2.1             HMethod getMethod() { return hm; }
90 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
91 cananian 1.1.2.1                 ObjectRef obj = (ObjectRef) params[0];
92 cananian 1.1.2.1                 Runtime r = (Runtime) obj.getClosure();
93 cananian 1.1.2.1                 return new Long(r.totalMemory());
94 cananian 1.1.2.1             }
95 cananian 1.1.2.1         };
96 cananian 1.1.2.1     }
97 cananian 1.2     }