2003/05/12 05:31:50
[org.ibex.core.git] / src / org / xwt / util / JSObject.java
index 9f3f4bf..092646d 100644 (file)
@@ -41,7 +41,7 @@ public class JSObject implements Scriptable {
     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;
@@ -76,7 +76,9 @@ public class JSObject implements Scriptable {
 
     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;
 
@@ -111,11 +113,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 +172,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 +187,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 {
+        public JSFunction() { setSeal(true); }
+        public Scriptable construct(Context cx, Scriptable scope, java.lang.Object[] args) { return null; }
+    }
 
     // Trivial Methods ///////////////////////////////////////////////////////////
 
@@ -191,9 +214,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); }
 
 }