From bbb487fd11dbe2f295f4b729ca55b6cdc22cea16 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 30 Jan 2004 07:02:22 +0000 Subject: [PATCH] 2003/06/26 00:21:01 darcs-hash:20040130070222-0c9ea-0cd1cc23489af1e5af3632732fd7332bedd6d027.gz --- src/org/xwt/js/JS.java | 2 +- src/org/xwt/js/Math.java | 136 +++++++++++++++++++++++++++++++++------------- 2 files changed, 98 insertions(+), 40 deletions(-) diff --git a/src/org/xwt/js/JS.java b/src/org/xwt/js/JS.java index 3c8298f..77d95cc 100644 --- a/src/org/xwt/js/JS.java +++ b/src/org/xwt/js/JS.java @@ -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"); } diff --git a/src/org/xwt/js/Math.java b/src/org/xwt/js/Math.java index eedfee5..2c7eb32 100644 --- a/src/org/xwt/js/Math.java +++ b/src/org/xwt/js/Math.java @@ -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); } } -- 1.7.10.4