X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2Futil%2FJSObject.java;h=2866d602dc2a39cfb88be70120d2ae6737a434a3;hb=963fc3700fdbc4d64cb56f1b15be16d7b3acb643;hp=9f3f4bfe50ed909d6cc0bc82ada8b9383eae0d88;hpb=72ab82bd51fae1f58ca022b68b473b0ff1b6f3d9;p=org.ibex.core.git diff --git a/src/org/xwt/util/JSObject.java b/src/org/xwt/util/JSObject.java index 9f3f4bf..2866d60 100644 --- a/src/org/xwt/util/JSObject.java +++ b/src/org/xwt/util/JSObject.java @@ -77,6 +77,7 @@ public class JSObject implements Scriptable { 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; @@ -111,11 +112,25 @@ public class JSObject implements Scriptable { 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 */ @@ -156,6 +171,7 @@ public class JSObject implements Scriptable { 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); } @@ -170,13 +186,19 @@ public class JSObject implements Scriptable { 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 { + JSFunction() { setSeal(true); } + public Scriptable construct(Context cx, Scriptable scope, java.lang.Object[] args) { return null; } + } // Trivial Methods /////////////////////////////////////////////////////////// @@ -191,9 +213,9 @@ public class JSObject implements Scriptable { 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); } }