private static Hash nodeNameToPackageNameHash = new Hash(1000, 2);
/** converts a nodeName (source code filename) into the 'package name' (resource name of its directory) */
- private static String nodeNameToPackageName(String nodeName) {
+ public static String nodeNameToPackageName(String nodeName) {
if (nodeName == null) return null;
String ret = (String)nodeNameToPackageNameHash.get(nodeName);
if (ret != null) return ret;
public JSObject() { }
public JSObject(boolean privateVars) { this.privateVars = privateVars; }
+ public JSObject(boolean privateVars, boolean sealed) { this.privateVars = privateVars; setSeal(sealed); }
+ public Object get(String name) { return get(name, null); }
public Object get(String name, Scriptable start) {
if (name == null || name.equals("") || properties == null) return null;
properties.put(name, null, value);
}
- /** if a put is made directly to us (rather than cascading up to Top), it must be a var-declaration */
+ /**
+ * if a put is made directly to us (rather than cascading up to
+ * Top), by a script for whom we are in the ultimate parent
+ * scope, it must be a var-declaration
+ */
+ public void put(String name, Object value) { put(name, null, value); }
public void put(String name, Scriptable start, Object value) {
if (sealed) return;
if (name == null || name.equals("")) return;
- putPrivately(name, value, getCurrentFunctionSourceName());
+
+ if (getPrivately(name, getCurrentFunctionSourceName()) != null)
+ putPrivately(name, value, getCurrentFunctionSourceName());
+
+ for(Scriptable cur = Context.enter().currentFunction; cur != null; cur = cur.getParentScope())
+ if (cur == this) {
+ putPrivately(name, value, getCurrentFunctionSourceName());
+ return;
+ }
+ putGlobally(name, start, value);
}
/** if privateVars is enabled, we always return false, to see if the put propagates up to Top */
if (name.equals("Array")) return JSObject.defaultObjects.get("Array", null);
if (name.equals("Function")) return JSObject.defaultObjects.get("Function", null);
if (name.equals("TypeError")) return JSObject.defaultObjects.get("TypeError", null);
+ if (name.equals("ConversionError")) return JSObject.defaultObjects.get("ConversionError", null);
return ((JSObject)lastByThread.get(Thread.currentThread())).get(name, start);
}
public void setPrototype(Scriptable p) { }
public void delete(int i) { }
public Object getDefaultValue(Class hint) { return "Top"; }
- public void put(int i, Scriptable start, Object value) { }
- public Object get(int i, Scriptable start) { return null; }
- public boolean has(int i, Scriptable start) { return false; }
+ public void put(int i, Scriptable start, Object value) { put(String.valueOf(i), start, value); }
+ public Object get(int i, Scriptable start) { return get(String.valueOf(i), start); }
+ public boolean has(int i, Scriptable start) { return has(String.valueOf(i), start); }
public Object[] getIds() { return new Object[] { }; }
}
+ // Helper class for defining functions. //////////////////////////////////////
+
+ public static abstract class JSFunction extends JSObject implements Function {
+ public JSFunction() { setSeal(true); }
+ public Scriptable construct(Context cx, Scriptable scope, java.lang.Object[] args) { return null; }
+ }
// Trivial Methods ///////////////////////////////////////////////////////////
public void setPrototype(Scriptable p) { }
public String getClassName() { return this.getClass().getName(); }
public Object getDefaultValue(Class hint) { return toString(); }
- public void put(int i, Scriptable start, Object value) { }
- public Object get(int i, Scriptable start) { return null; }
- public boolean has(int i, Scriptable start) { return false; }
+ public void put(int i, Scriptable start, Object value) { put(String.valueOf(i), start, value); }
+ public Object get(int i, Scriptable start) { return get(String.valueOf(i), start); }
+ public boolean has(int i, Scriptable start) { return has(String.valueOf(i), start); }
}