X-Git-Url: http://git.megacz.com/?p=org.ibex.core.git;a=blobdiff_plain;f=src%2Forg%2Fxwt%2Fjs%2FJS.java;h=24f133adac144092924c0e5088267b7092e4d5e4;hp=c7c1c549e3db23da58c6e2a2ed763bf9165118bd;hb=77f51cd3e157cf6fd2ae85ce774444bb85ea7b81;hpb=1d78b2dbeba31c5814824035a8da36a01d928be6 diff --git a/src/org/xwt/js/JS.java b/src/org/xwt/js/JS.java index c7c1c54..24f133a 100644 --- a/src/org/xwt/js/JS.java +++ b/src/org/xwt/js/JS.java @@ -15,6 +15,7 @@ import java.util.*; */ public abstract class JS { + // Public Helper Methods ////////////////////////////////////////////////////////////////////// /** parse and compile a function */ @@ -66,6 +67,7 @@ public abstract class JS { private boolean sealed = false; public Obj() { this(false); } public Obj(boolean sealed) { this.sealed = sealed; } + /** a sealed object cannot have its properties modified */ public void setSeal(boolean sealed) { this.sealed = sealed; } public Object get(Object key) { return entries.get(key); } public void put(Object key, Object val) { if (!sealed) entries.put(key, val); } @@ -96,7 +98,7 @@ public abstract class JS { public static class Scope extends ScopeImpl { public Scope(Scope parentScope) { this(parentScope, false); } public Scope(Scope parentScope, boolean sealed) { super(parentScope, sealed); } - public Scope getParentScope() { return super.getParentScope(); } + /** transparent scopes are not returned by THIS */ public boolean isTransparent() { return super.isTransparent(); } public boolean has(Object key) { return super.has(key); } public void declare(String s) { super.declare(s); } @@ -114,7 +116,44 @@ public abstract class JS { super(sourceName, firstLine, sourceCode, scope); } } + + 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(); + private int line = -1; + + /** 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 line; } + + /** 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; + } + + } }