/** helper; retrieves the 'source code filename' (usually the nodeName) of the currently-executing function in this thread */
public static String getCurrentFunctionSourceName() {
- Function cf = Context.getCurrentContext().currentFunction;
+ Context cx = Context.getCurrentContext();
+ if (cx == null) {
+ if (Log.on) Log.log(JSObject.class, "Context.getCurrentContext() is null in getCurrentFunctionSourceName()");
+ return "unknown";
+ }
+ Function cf = cx.currentFunction;
if (cf == null) return null;
return (cf instanceof InterpretedFunction) ?
((InterpretedFunction)cf).getSourceName() : ((InterpretedScript)cf).getSourceName();
public JSObject() { }
public JSObject(boolean privateVars) { this.privateVars = privateVars; }
+ 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[] { }; }
}
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); }
}