1 cananian 1.1.2.1 // INFloatDouble.java, created Fri Jan  1 11:29:34 1999 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.2 
 9 cananian 1.1.2.1 /**
10 cananian 1.1.2.1  * <code>INFloatDouble</code> provides implementations of the native methods
11 cananian 1.1.2.1  * in <code>java.lang.Float</code> and <code>java.lang.Double</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: INFloatDouble.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 INFloatDouble {
17 cananian 1.1.2.1     static final void register(StaticState ss) {
18 cananian 1.1.2.6         ss.register(intBitsToFloat(ss));
19 cananian 1.1.2.6         ss.register(longBitsToDouble(ss));
20 cananian 1.1.2.6         ss.register(floatToIntBits(ss));
21 cananian 1.1.2.6         ss.register(doubleToLongBits(ss));
22 cananian 1.1.2.5         try {
23 cananian 1.1.2.6         ss.register(valueOf0(ss));
24 cananian 1.1.2.5         } catch (NoSuchMethodError e) { /* JDK 1.2 */ }
25 cananian 1.1.2.1     }
26 cananian 1.1.2.1     // convert int to float
27 cananian 1.1.2.6     private static final NativeMethod intBitsToFloat(StaticState ss0) {
28 cananian 1.1.2.1         final HMethod hm =
29 cananian 1.1.2.6             ss0.HCfloat.getMethod("intBitsToFloat",new HClass[]{ HClass.Int });
30 cananian 1.1.2.1         return new NativeMethod() {
31 cananian 1.1.2.1             HMethod getMethod() { return hm; }
32 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
33 cananian 1.1.2.1                 Integer i = (Integer) params[0];
34 cananian 1.1.2.1                 return new Float(Float.intBitsToFloat(i.intValue()));
35 cananian 1.1.2.1             }
36 cananian 1.1.2.1         };
37 cananian 1.1.2.1     }
38 cananian 1.1.2.1     // convert float to int
39 cananian 1.1.2.6     private static final NativeMethod floatToIntBits(StaticState ss0) {
40 cananian 1.1.2.1         final HMethod hm =
41 cananian 1.1.2.6             ss0.HCfloat.getMethod("floatToIntBits",
42 cananian 1.1.2.6                                   new HClass[] { HClass.Float });
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                 Float f = (Float) params[0];
47 cananian 1.1.2.1                 return new Integer(Float.floatToIntBits(f.floatValue()));
48 cananian 1.1.2.1             }
49 cananian 1.1.2.1         };
50 cananian 1.1.2.1     }
51 cananian 1.1.2.1     // convert int to double
52 cananian 1.1.2.6     private static final NativeMethod longBitsToDouble(StaticState ss0) {
53 cananian 1.1.2.1         final HMethod hm =
54 cananian 1.1.2.6             ss0.HCdouble.getMethod("longBitsToDouble",
55 cananian 1.1.2.6                                    new HClass[] { HClass.Long });
56 cananian 1.1.2.1         return new NativeMethod() {
57 cananian 1.1.2.1             HMethod getMethod() { return hm; }
58 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
59 cananian 1.1.2.1                 Long l = (Long) params[0];
60 cananian 1.1.2.1                 return new Double(Double.longBitsToDouble(l.longValue()));
61 cananian 1.1.2.1             }
62 cananian 1.1.2.1         };
63 cananian 1.1.2.1     }
64 cananian 1.1.2.1     // convert double to int
65 cananian 1.1.2.6     private static final NativeMethod doubleToLongBits(StaticState ss0) {
66 cananian 1.1.2.1         final HMethod hm =
67 cananian 1.1.2.6             ss0.HCdouble.getMethod("doubleToLongBits",
68 cananian 1.1.2.6                                    new HClass[] { HClass.Double });
69 cananian 1.1.2.1         return new NativeMethod() {
70 cananian 1.1.2.1             HMethod getMethod() { return hm; }
71 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
72 cananian 1.1.2.1                 Double d = (Double) params[0];
73 cananian 1.1.2.1                 return new Long(Double.doubleToLongBits(d.doubleValue()));
74 cananian 1.1.2.1             }
75 cananian 1.1.2.1         };
76 cananian 1.1.2.1     }
77 cananian 1.1.2.3     // convert string to a double
78 cananian 1.1.2.6     private static final NativeMethod valueOf0(StaticState ss0) {
79 cananian 1.1.2.1         final HMethod hm =
80 cananian 1.1.2.6             ss0.HCdouble.getMethod("valueOf0",new HClass[]{ ss0.HCstring });
81 cananian 1.1.2.1         return new NativeMethod() {
82 cananian 1.1.2.1             HMethod getMethod() { return hm; }
83 cananian 1.1.2.1             Object invoke(StaticState ss, Object[] params) {
84 cananian 1.1.2.1                 ObjectRef obj = (ObjectRef) params[0];
85 cananian 1.1.2.1                 return Double.valueOf(ss.ref2str(obj));
86 cananian 1.1.2.1             }
87 cananian 1.1.2.1         };
88 cananian 1.1.2.1     }
89 cananian 1.2     }