FIXME triage and formatting cleanups
[org.ibex.js.git] / src / org / ibex / js / JSReflection.java
index d6ecd75..2f163e7 100644 (file)
@@ -12,12 +12,12 @@ public class JSReflection extends JS.Immutable {
 
     public static JS wrap(Object o) throws JSExn {
         if (o == null) return null;
-        if (o instanceof String) return Script.S((String)o);
-        if (o instanceof Boolean) return Script.B(((Boolean)o).booleanValue());
-        if (o instanceof Number) return Script.N((Number)o);
+        if (o instanceof String) return JSU.S((String)o);
+        if (o instanceof Boolean) return JSU.B(((Boolean)o).booleanValue());
+        if (o instanceof Number) return JSU.N((Number)o);
         if (o instanceof JS) return (JS)o;
         if (o instanceof Object[]) {
-            // FIXME: get element type here
+            throw new JSExn("Reflection onto Object[] not supported yet");
         }
         throw new JSExn("Reflection object tried to return a " + o.getClass().getName());
     }
@@ -30,23 +30,26 @@ public class JSReflection extends JS.Immutable {
             return new Enumeration(null) {
                 private int n = 0;
                 public boolean _hasNext() { return n < arr.length; }
-                public JS _next() { return Script.N(n++); }
+                public JS _next() { return JSU.N(n++); }
             };
         }
-        public JS get(JS key) throws JSExn { return wrap(arr[Script.toInt(key)]); }
+        public JS get(JS key) throws JSExn { return wrap(arr[JSU.toInt(key)]); }
     }
 
-    // FIXME public static class Hash { }
-    // FIXME public Enumeration keys() throws JSExn {  }
+    public Enumeration keys() throws JSExn { throw new JSExn("JSReflection.keys() not supported yet"); }
 
     public JS get(JS key) throws JSExn {
-        String k = Script.toString(key);
-        try {
-            Field f = this.getClass().getField(k);
-            return wrap(f.get(this));
-        } catch (NoSuchFieldException nfe) {
-        } catch (IllegalAccessException nfe) {
-        } catch (SecurityException nfe) { }
+        String k = JSU.toString(key);
+        Class c = this.getClass();
+        while(c != null) {
+            try {
+                Field f = c.getField(k);
+                if (f != null) return wrap(f.get(this));
+            } catch (NoSuchFieldException nfe) {
+            } catch (IllegalAccessException nfe) {
+            } catch (SecurityException nfe) { }
+            c = c.getSuperclass();
+        }
 
         try {
             java.lang.reflect.Method[] methods = this.getClass().getMethods();
@@ -60,7 +63,7 @@ public class JSReflection extends JS.Immutable {
     }
 
     public JS call(JS method, JS[] args) throws JSExn {
-        String k = Script.toString(method);
+        String k = JSU.toString(method);
         try {
             java.lang.reflect.Method[] methods = this.getClass().getMethods();
             for(int j=0; j<methods.length; j++) {
@@ -73,7 +76,7 @@ public class JSReflection extends JS.Immutable {
         } catch (InvocationTargetException it) {
             Throwable ite = it.getTargetException();
             if (ite instanceof JSExn) throw ((JSExn)ite);
-            Script.warn(ite);
+            JSU.warn(ite);
             throw new JSExn("unhandled reflected exception: " + ite.toString());
         } catch (SecurityException nfe) { }
         throw new JSExn("called a reflection method with the wrong number of arguments");