+ /** a Callable which was compiled from JavaScript code */
+ public static class CompiledFunction extends CompiledFunctionImpl {
+ CompiledFunction(String sourceName, int firstLine, Reader sourceCode, Scope scope) throws IOException {
+ super(sourceName, firstLine, sourceCode, scope);
+ }
+ }
+
+ /** a scope that is populated with js objects and functions normally found in the global scope */
+ public static class GlobalScope extends GlobalScopeImpl {
+ public GlobalScope() { this(null); }
+ public GlobalScope(JS.Scope parent) { super(parent); }
+ }
+
+ public static final JS Math = new org.xwt.js.Math();
+
+ /** encapsulates a single JavaScript thread; the JS.Thread->java.lang.Thread mapping is 1:1 */
+ public static class Thread {
+
+ CompiledFunction currentCompiledFunction = null;
+ Vec stack = new Vec();
+ int pc;
+
+ /** binds this thread to the current Java Thread */
+ public void bindToCurrentJavaThread() { javaThreadToJSThread.put(java.lang.Thread.currentThread(), this); }
+
+ /** returns the line of code that is currently executing */
+ public int getLine() { return currentCompiledFunction == null ? -1 : currentCompiledFunction.getLine(pc); }
+
+ /** returns the name of the source code file which declared the currently executing function */
+ public String getSourceName() { return currentCompiledFunction == null ? null : currentCompiledFunction.getSourceName(); }
+
+ /** fetches the currently-executing javascript function */
+ public JS.CompiledFunction getCurrentCompiledFunction() { return currentCompiledFunction; }
+
+
+ // Statics ///////////////////////////////////////////////////////////////////////
+
+ private static Hashtable javaThreadToJSThread = new Hashtable();
+
+ /** returns the JS thread for a given Java thread, creating one if necessary */
+ public static JS.Thread fromJavaThread(java.lang.Thread t) {
+ JS.Thread ret = (JS.Thread)javaThreadToJSThread.get(t);
+ if (ret == null) {
+ ret = new JS.Thread();
+ ret.bindToCurrentJavaThread();
+ }
+ return ret;
+ }
+
+ public static JS.Thread currentJSThread() {
+ return fromJavaThread(java.lang.Thread.currentThread());
+ }
+ }