2003/06/26 00:21:01
authordavid <david@xwt.org>
Fri, 30 Jan 2004 07:02:22 +0000 (07:02 +0000)
committerdavid <david@xwt.org>
Fri, 30 Jan 2004 07:02:22 +0000 (07:02 +0000)
darcs-hash:20040130070222-0c9ea-0cd1cc23489af1e5af3632732fd7332bedd6d027.gz

src/org/xwt/js/JS.java
src/org/xwt/js/Math.java

index 3c8298f..77d95cc 100644 (file)
@@ -44,7 +44,7 @@ public abstract class JS {
         if (o instanceof String) try { return new Double((String)o); } catch (NumberFormatException e) { return new Double(0); }
         if (o instanceof Boolean) return ((Boolean)o).booleanValue() ? new Long(1) : new Long(0);
         if (o instanceof JS) return ((JS)o).coerceToNumber();
-        throw new Error("toNumber() got object of type " + o.getClass().getName() + " which we don't know how to handle");
+        throw new Error("a " + o.getClass().getName() + " has no numeric value");
     }
 
 
index eedfee5..2c7eb32 100644 (file)
@@ -8,44 +8,102 @@ import java.util.*;
 /** The JavaScript Math object */
 class Math extends JS.Obj {
     public static Math singleton = new Math();
-    Math() { setSeal(true); }
-
-    // FIXME: clean up, finish implementing
-    public Object get(Object name) {
-        if ("ceil".equals(name)) return new JS.Callable() { public Object call(JS.Array args)
-                { if (args.elementAt(0) == null) return null;
-                return new Long((long)java.lang.Math.ceil(Double.parseDouble(args.elementAt(0).toString()))); } };
-        else if ("floor".equals(name)) return new JS.Callable() { public Object call(JS.Array args)
-                { if (args.elementAt(0) == null) return null;
-                return new Long((long)java.lang.Math.floor(Double.parseDouble(args.elementAt(0).toString()))); } };
-        else if ("round".equals(name)) return new JS.Callable() { public Object call(JS.Array args)
-                { if (args.elementAt(0) == null) return null;
-                return new Long((long)java.lang.Math.round(Double.parseDouble(args.elementAt(0).toString()))); } };
-        else if ("abs".equals(name)) return new JS.Callable() { public Object call(JS.Array args)
-                { if (args.elementAt(0) == null) return null;
-                return new Long((long)java.lang.Math.abs(Double.parseDouble(args.elementAt(0).toString()))); } };
-        else if ("min".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            if (args.length() < 2 || args.elementAt(0) == null || args.elementAt(1) == null) return args.elementAt(0);
-            return new Double(java.lang.Math.min(((Number)args.elementAt(0)).doubleValue(),
-                                       ((Number)args.elementAt(1)).doubleValue())); } };
-        else if ("max".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            if (args.length() < 2) return args.elementAt(0);
-            return new Double(java.lang.Math.max(((Number)args.elementAt(0)).doubleValue(),
-                                       ((Number)args.elementAt(1)).doubleValue())); } };
-        else if ("cos".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            return new Double(java.lang.Math.cos(((Number)args.elementAt(0)).doubleValue())); } };
-        else if ("sin".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            return new Double(java.lang.Math.sin(((Number)args.elementAt(0)).doubleValue())); } };
-        else if ("tan".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            return new Double(java.lang.Math.tan(((Number)args.elementAt(0)).doubleValue())); } };
-        else if ("acos".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            return new Double(java.lang.Math.acos(((Number)args.elementAt(0)).doubleValue())); } };
-        else if ("asin".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            return new Double(java.lang.Math.asin(((Number)args.elementAt(0)).doubleValue())); } };
-        else if ("atan".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            return new Double(java.lang.Math.atan(((Number)args.elementAt(0)).doubleValue())); } };
-        else if ("sqrt".equals(name)) return new JS.Callable() { public Object call(JS.Array args) {
-            return new Double(java.lang.Math.sqrt(((Number)args.elementAt(0)).doubleValue())); } };
-        return null;
+
+    private static final JS.Callable ceil = new JS.Callable() { public Object call(JS.Array args) {
+        return new Long((long)java.lang.Math.ceil(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable floor = new JS.Callable() { public Object call(JS.Array args) {
+        return new Long((long)java.lang.Math.floor(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable round = new JS.Callable() { public Object call(JS.Array args) {
+        return new Long((long)java.lang.Math.round(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable min = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.min(JS.toNumber(args.elementAt(0)).doubleValue(),
+            JS.toNumber(args.elementAt(1)).doubleValue())); } };
+
+    private static final JS.Callable max = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.max(JS.toNumber(args.elementAt(0)).doubleValue(),
+            JS.toNumber(args.elementAt(1)).doubleValue())); } };
+
+    private static final JS.Callable pow = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.pow(JS.toNumber(args.elementAt(0)).doubleValue(),
+            JS.toNumber(args.elementAt(1)).doubleValue())); } };
+
+    private static final JS.Callable atan2 = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.atan2(JS.toNumber(args.elementAt(0)).doubleValue(),
+            JS.toNumber(args.elementAt(1)).doubleValue())); } };
+
+    private static final JS.Callable abs = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.abs(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable sin = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.sin(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable cos = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.cos(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable tan = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.tan(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable asin = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.asin(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable acos = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.acos(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable atan = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.atan(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable sqrt = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.sqrt(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable exp = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.exp(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable log = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.log(JS.toNumber(args.elementAt(0)).doubleValue())); } };
+
+    private static final JS.Callable random = new JS.Callable() { public Object call(JS.Array args) {
+        return new Double(java.lang.Math.random()); } };
+
+    private static final Double E       = new Double(java.lang.Math.E);
+    private static final Double PI      = new Double(java.lang.Math.PI);
+    private static final Double LN10    = new Double(java.lang.Math.log(10));
+    private static final Double LN2     = new Double(java.lang.Math.log(2));
+    private static final Double LOG10E  = new Double(1/java.lang.Math.log(10));
+    private static final Double LOG2E   = new Double(1/java.lang.Math.log(2));
+    private static final Double SQRT1_2 = new Double(1/java.lang.Math.sqrt(2));
+    private static final Double SQRT2   = new Double(java.lang.Math.sqrt(2));
+
+    Math() {
+        put("abs", abs);
+        put("acos", acos);
+        put("asin", asin);
+        put("atan", atan);
+        put("atan2", atan2);
+        put("ceil", ceil);
+        put("cos", cos);
+        put("exp", exp);
+        put("floor", floor);
+        put("log", log);
+        put("max", max);
+        put("min", min);
+        put("pow", pow);
+        put("random", random);
+        put("sin", sin);
+        put("sqrt", sqrt);
+        put("tan", tan);
+
+        put("E", E);
+        put("LN10", LN10);
+        put("LN2", LN2);
+        put("LOG10E", LOG10E);
+        put("LOG2E", LOG2E);
+        put("PI", PI);
+        put("SQRT1_2", SQRT1_2);
+        put("SQRT2", SQRT2);
+
+        setSeal(true);
     }
 }