From 8bcd55a21b0835d098a62a66878ea88c17c6463b Mon Sep 17 00:00:00 2001 From: megacz Date: Fri, 30 Jan 2004 06:59:30 +0000 Subject: [PATCH] 2003/04/30 04:39:09 darcs-hash:20040130065930-2ba56-671a48d62ef4f25936abc06c3cf50bb223dd1234.gz --- src/org/xwt/js/JS.java | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/org/xwt/js/JS.java diff --git a/src/org/xwt/js/JS.java b/src/org/xwt/js/JS.java new file mode 100644 index 0000000..f086de6 --- /dev/null +++ b/src/org/xwt/js/JS.java @@ -0,0 +1,52 @@ +// Copyright 2002 Adam Megacz, see the COPYING file for licensing [GPL] + +package org.xwt.js; +import org.xwt.util.*; + +/** all objects other than Strings and Numbers which are exposed to JS code must implement this interface */ +public interface JS { + + public Object get(Object key) throws JS.Exn; + public Object put(Object key, Object val) throws JS.Exn; + public Object[] enumerateProperties(); + public String coerceToString() throws JS.Exn; + public Num coerceToNumber() throws JS.Exn; + public Object call(Object[] args) throws JS.Exn; + + /** 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. */ + public static class Exn extends RuntimeException { + private Object js = null; + public Exn(Object js) { this.js = js; } + public Object getObject() { return js; } + } + + /** Any object which becomes part of the scope chain must support this interface */ + public static interface Scope extends JS { + public boolean has(Object key); + public JS getParentScope(); + } + + /** A mutable, boxed numeric value. These are recycled -- never duplicate references -- use duplicate() instead. */ + public static class Num implements Cloneable, JS { + + private Num() { } + + public boolean isDouble = false; + public long longVal = -1; + public double doubleVal = -1; + + private static Vec pool = new Vec(); + public static synchronized void recycle(Num n) { pool.push(n); } + public static synchronized Num getOne() { return (pool.size() > 0) ? (Num)pool.pop() : new Num(); } + + public Num duplicate() { try { return (Num)clone(); } catch (CloneNotSupportedException c) { throw new Error(c); } } + + public Object get(Object key) throws JS.Exn { return null; } + public Object put(Object key, Object val) throws JS.Exn { throw new JS.Exn("attempt to set a property on a Number"); } + public Object[] enumerateProperties() { return new Object[] { }; } + public String coerceToString() throws JS.Exn { return isDouble ? String.valueOf(doubleVal) : String.valueOf(longVal); } + public Num coerceToNumber() throws JS.Exn { return duplicate(); } + public Object call(Object[] args) throws JS.Exn { throw new JS.Exn("attempt to apply the () operator to a Number"); } + + } +} -- 1.7.10.4