package org.xwt.js;
/** anything that is callable with the () operator and wasn't compiled from JS code */
-public abstract class JSCallable extends JSObj {
- public Object call0(Object method) throws JS.Exn {
- JSArray args = new JSArray();
- return call(method, args);
- }
- public Object call1(Object method, Object arg1) throws JS.Exn {
- JSArray args = new JSArray();
- args.addElement(arg1);
- return call(method, args);
- }
- public Object call2(Object method, Object arg1, Object arg2) throws JS.Exn {
- JSArray args = new JSArray();
- args.addElement(arg1);
- args.addElement(arg2);
- return call(method, args);
+public abstract class JSCallable extends JS {
+
+ // return this from get() if the key was actually a method.
+ public static final Object METHOD = new Object();
+
+ public Object callMethod(Object method, Object a0, Object a1, Object a2, Object[] rest, int nargs) {
+ if (method == null) return call(a0, a1, a2, rest, nargs);
+ Class c = this.getClass();
+ String descrip = c.getName();
+ if (c == Internal.JSCallableStub.class) {
+ descrip = ((Internal.JSCallableStub)this).obj.getClass().getName();
+ }
+ throw new JS.Exn("attempted to call an undefined method ("+method+") on a " + descrip);
}
- public Object call(Object method, JSArray args) throws JS.Exn {
- if (method != null) {
- Object meth = get(method);
- if (meth == null) throw new JS.Exn("attempt to invoke the null method");
- if (!(meth instanceof JSCallable)) throw new JS.Exn("cannot call a " + meth.getClass().getName());
- switch (args.size()) {
- case 0: return ((JSCallable)meth).call0(null);
- case 1: return ((JSCallable)meth).call1(null, args.elementAt(0));
- case 2: return ((JSCallable)meth).call2(null, args.elementAt(0), args.elementAt(1));
- default: return ((JSCallable)meth).call(null, args);
- }
+
+ public Object call(Object a0, Object a1, Object a2, Object[] rest, int nargs) {
+ Class c = this.getClass();
+ String descrip = c.getName();
+ if (c == Internal.JSCallableStub.class) {
+ descrip = ((Internal.JSCallableStub)this).obj.getClass().getName();
}
- throw new JS.Exn("cannot invoke method " + method + " on object " + this.getClass().getName() + " with " + args.size() + " arguments");
+ throw new JS.Exn("you cannot call this object (of type " + descrip + ")");
}
+
}