2003/04/30 04:39:09
authormegacz <megacz@xwt.org>
Fri, 30 Jan 2004 06:59:30 +0000 (06:59 +0000)
committermegacz <megacz@xwt.org>
Fri, 30 Jan 2004 06:59:30 +0000 (06:59 +0000)
darcs-hash:20040130065930-2ba56-671a48d62ef4f25936abc06c3cf50bb223dd1234.gz

src/org/xwt/js/JS.java [new file with mode: 0644]

diff --git a/src/org/xwt/js/JS.java b/src/org/xwt/js/JS.java
new file mode 100644 (file)
index 0000000..f086de6
--- /dev/null
@@ -0,0 +1,52 @@
+// Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL]\r
+\r
+package org.xwt.js;\r
+import org.xwt.util.*;\r
+\r
+/** all objects other than Strings and Numbers which are exposed to JS code must implement this interface */\r
+public interface JS {\r
+\r
+    public Object get(Object key) throws JS.Exn;\r
+    public Object put(Object key, Object val) throws JS.Exn;\r
+    public Object[] enumerateProperties();\r
+    public String coerceToString() throws JS.Exn;\r
+    public Num coerceToNumber() throws JS.Exn;\r
+    public Object call(Object[] args) throws JS.Exn;\r
+\r
+    /** if JS calls a Java method, and the Java method throws an exception, it can only be caught by JS if it is a subclass of Exn. */\r
+    public static class Exn extends RuntimeException {\r
+       private Object js = null;\r
+       public Exn(Object js) { this.js = js; }\r
+       public Object getObject() { return js; }\r
+    }\r
+\r
+    /** Any object which becomes part of the scope chain must support this interface */\r
+    public static interface Scope extends JS {\r
+       public boolean has(Object key);\r
+       public JS getParentScope();\r
+    }\r
+\r
+    /** A mutable, boxed numeric value.  These are recycled -- never duplicate references -- use duplicate() instead. */\r
+    public static class Num implements Cloneable, JS {\r
+       \r
+       private Num() { }\r
+       \r
+       public boolean isDouble = false;\r
+       public long longVal = -1;\r
+       public double doubleVal = -1;\r
+       \r
+       private static Vec pool = new Vec();\r
+       public static synchronized void recycle(Num n) { pool.push(n); }\r
+       public static synchronized Num getOne() { return (pool.size() > 0) ? (Num)pool.pop() : new Num(); }\r
+       \r
+       public Num duplicate() { try { return (Num)clone(); } catch (CloneNotSupportedException c) { throw new Error(c); } }\r
+\r
+       public Object get(Object key) throws JS.Exn { return null; }\r
+       public Object put(Object key, Object val) throws JS.Exn { throw new JS.Exn("attempt to set a property on a Number"); }\r
+       public Object[] enumerateProperties() { return new Object[] { }; }\r
+       public String coerceToString() throws JS.Exn { return isDouble ? String.valueOf(doubleVal) : String.valueOf(longVal); }\r
+       public Num coerceToNumber() throws JS.Exn { return duplicate(); }\r
+       public Object call(Object[] args) throws JS.Exn { throw new JS.Exn("attempt to apply the () operator to a Number"); }\r
+       \r
+    }\r
+}\r