2002/06/14 22:58:39
[org.ibex.core.git] / src / org / xwt / util / JSObject.java
index 4692aff..ab747e2 100644 (file)
@@ -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 */
@@ -171,9 +186,9 @@ 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[] { }; }
 
     }
@@ -192,9 +207,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); }
 
 }