1 cananian 1.1.2.1 // INObject.java, created Thu Dec 31 17:25:09 1998 by cananian
 2 cananian 1.1.2.4 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.4 // 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.HMethod;
 8 cananian 1.1.2.1 
 9 cananian 1.1.2.1 /**
10 cananian 1.1.2.1  * <code>INObject</code> provides implementations of the native methods in
11 cananian 1.1.2.1  * <code>java.lang.Object</code>.
12 cananian 1.1.2.1  * 
13 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
14 cananian 1.2      * @version $Id: INObject.java,v 1.2 2002/02/25 21:05:46 cananian Exp $
15 cananian 1.1.2.1  */
16 cananian 1.1.2.6 public class INObject {
17 cananian 1.1.2.1     static final void register(StaticState ss) {
18 cananian 1.1.2.6         ss.register(_getClass_(ss));
19 cananian 1.1.2.6         ss.register(_hashCode_(ss));
20 cananian 1.1.2.6         ss.register(_clone_(ss));
21 cananian 1.1.2.5         // JDK 1.2 only
22 cananian 1.1.2.6         try { ss.register(registerNatives(ss)); } catch (NoSuchMethodError e){}
23 cananian 1.1.2.1     }
24 cananian 1.1.2.1     // Object.getClass()
25 cananian 1.1.2.6     private static final NativeMethod _getClass_(StaticState ss0) {
26 cananian 1.1.2.6         final HMethod hm = ss0.HCobject.getMethod("getClass", new HClass[0]);
27 cananian 1.1.2.1         return new NativeMethod() {
28 cananian 1.1.2.1             HMethod getMethod() { return hm; }
29 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
30 cananian 1.1.2.3                 Ref obj = (Ref) params[0];
31 cananian 1.1.2.1                 return INClass.forClass(ss, obj.type);
32 cananian 1.1.2.1             }
33 cananian 1.1.2.1         };
34 cananian 1.1.2.1     }
35 cananian 1.1.2.1     // Object.hashCode()
36 cananian 1.1.2.6     private static final NativeMethod _hashCode_(StaticState ss0) {
37 cananian 1.1.2.6         final HMethod hm = ss0.HCobject.getMethod("hashCode", new HClass[0]);
38 cananian 1.1.2.1         return new NativeMethod() {
39 cananian 1.1.2.1             HMethod getMethod() { return hm; }
40 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
41 cananian 1.1.2.3                 Ref obj = (Ref) params[0];
42 cananian 1.1.2.1                 return new Integer(obj.hashCode());
43 cananian 1.1.2.1             }
44 cananian 1.1.2.1         };
45 cananian 1.1.2.1     }
46 cananian 1.1.2.1     // Object.clone()
47 cananian 1.1.2.6     private static final NativeMethod _clone_(StaticState ss0) {
48 cananian 1.1.2.6         final HMethod hm = ss0.HCobject.getMethod("clone", new HClass[0]);
49 cananian 1.1.2.1         return new NativeMethod() {
50 cananian 1.1.2.1             HMethod getMethod() { return hm; }
51 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
52 cananian 1.1.2.3                 Ref obj = (Ref) params[0];
53 cananian 1.1.2.1                 // throw exception if doesn't implement Cloneable
54 cananian 1.1.2.6                 if (!obj.type.isInstanceOf(ss.HCcloneable)) {
55 cananian 1.1.2.6                     obj = ss.makeThrowable(ss.HCclonenotsupportedE,
56 cananian 1.1.2.1                                          obj.type.toString());
57 cananian 1.1.2.3                     throw new InterpretedThrowable((ObjectRef)obj, ss);
58 cananian 1.1.2.1                 }
59 cananian 1.1.2.1                 return obj.clone();
60 cananian 1.1.2.1             }
61 cananian 1.1.2.1         };
62 cananian 1.1.2.5     }
63 cananian 1.1.2.5     // JDK 1.2 only: Object.registerNatives()
64 cananian 1.1.2.6     private static final NativeMethod registerNatives(StaticState ss0) {
65 cananian 1.1.2.5         final HMethod hm =
66 cananian 1.1.2.6             ss0.HCobject.getMethod("registerNatives",new HClass[0]);
67 cananian 1.1.2.5         return new NullNativeMethod(hm);
68 cananian 1.1.2.1     }
69 cananian 1.2     }