home *** CD-ROM | disk | FTP | other *** search
- package com.netscape.javascript;
-
- import java.lang.reflect.Constructor;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Member;
- import java.lang.reflect.Method;
- import java.lang.reflect.Modifier;
- import java.util.Vector;
-
- public class FunctionObject extends NativeFunction {
- private static final short VARARGS_METHOD = -1;
- private static final short VARARGS_CTOR = -2;
- Method method;
- Constructor ctor;
- private Class[] types;
- private short parmsLength;
- private short lengthPropertyValue;
- private boolean hasVoidReturn;
- private boolean isStatic;
- // $FF: synthetic field
- private static Class class$com$netscape$javascript$Context;
- // $FF: synthetic field
- private static Class class$com$netscape$javascript$Scriptable;
-
- public Scriptable construct(Context var1, Scriptable var2, Object[] var3) throws JavaScriptException {
- if (this.method != null && this.parmsLength != -2) {
- return super.construct(var1, var2, var3);
- } else {
- Scriptable var4 = this.method != null ? (Scriptable)this.callVarargs(var1, (Scriptable)null, var3, true) : (Scriptable)this.call(var1, var2, (Scriptable)null, var3);
- if (var4.getPrototype() == null) {
- var4.setPrototype(((NativeFunction)this).getClassPrototype());
- }
-
- if (var4.getParentScope() == null) {
- Scriptable var5 = ((ScriptableObject)this).getParentScope();
- if (var4 != var5) {
- var4.setParentScope(var5);
- }
- }
-
- return var4;
- }
- }
-
- public Object get(String var1, Scriptable var2) {
- return var1.equals("length") ? new Integer(this.lengthPropertyValue) : super.get(var1, var2);
- }
-
- public void put(String var1, Scriptable var2, Object var3) {
- if (!var1.equals("length")) {
- super.put(var1, var2, var3);
- }
-
- }
-
- public FunctionObject(String var1, Member var2, Scriptable var3) {
- String var4;
- if (var2 instanceof Constructor) {
- this.ctor = (Constructor)var2;
- this.isStatic = true;
- this.types = this.ctor.getParameterTypes();
- var4 = this.ctor.getName();
- } else {
- this.method = (Method)var2;
- this.isStatic = Modifier.isStatic(this.method.getModifiers());
- this.types = this.method.getParameterTypes();
- var4 = this.method.getName();
- }
-
- String[] var5 = new String[]{var1};
- super.names = var5;
- short var6;
- if (this.types.length == 4 && (this.types[1].isArray() || this.types[2].isArray())) {
- if (this.types[1].isArray()) {
- if (!this.isStatic || this.types[0] != (class$com$netscape$javascript$Context != null ? class$com$netscape$javascript$Context : (class$com$netscape$javascript$Context = class$("com.netscape.javascript.Context"))) || this.types[1].getComponentType() != ScriptRuntime.ObjectClass || this.types[2] != ScriptRuntime.FunctionClass || this.types[3] != Boolean.TYPE) {
- String var11 = Context.getMessage("msg.varargs.ctor", (Object[])null);
- throw Context.reportRuntimeError(var11);
- }
- } else if (!this.isStatic || this.types[0] != (class$com$netscape$javascript$Context != null ? class$com$netscape$javascript$Context : (class$com$netscape$javascript$Context = class$("com.netscape.javascript.Context"))) || this.types[1] != ScriptRuntime.ScriptableClass || this.types[2].getComponentType() != ScriptRuntime.ObjectClass || this.types[3] != ScriptRuntime.FunctionClass) {
- String var12 = Context.getMessage("msg.varargs.fun", (Object[])null);
- throw Context.reportRuntimeError(var12);
- }
-
- this.parmsLength = (short)(this.types[1].isArray() ? -2 : -1);
- var6 = 1;
- } else {
- this.parmsLength = (short)this.types.length;
- boolean var7 = false;
-
- for(int var8 = 0; var8 < this.parmsLength; ++var8) {
- Class var9 = this.types[var8];
- if (var9 != ScriptRuntime.ObjectClass) {
- if (var9 != ScriptRuntime.StringClass && var9 != ScriptRuntime.BooleanClass && !ScriptRuntime.NumberClass.isAssignableFrom(var9) && !(class$com$netscape$javascript$Scriptable != null ? class$com$netscape$javascript$Scriptable : (class$com$netscape$javascript$Scriptable = class$("com.netscape.javascript.Scriptable"))).isAssignableFrom(var9)) {
- if (var9 == Boolean.TYPE) {
- var7 = true;
- this.types[var8] = ScriptRuntime.BooleanClass;
- } else if (var9 == Byte.TYPE) {
- var7 = true;
- this.types[var8] = ScriptRuntime.ByteClass;
- } else if (var9 == Short.TYPE) {
- var7 = true;
- this.types[var8] = ScriptRuntime.ShortClass;
- } else if (var9 == Integer.TYPE) {
- var7 = true;
- this.types[var8] = ScriptRuntime.IntegerClass;
- } else if (var9 == Float.TYPE) {
- var7 = true;
- this.types[var8] = ScriptRuntime.FloatClass;
- } else {
- if (var9 != Double.TYPE) {
- Object[] var10 = new Object[]{var4};
- throw Context.reportRuntimeError(Context.getMessage("msg.bad.parms", var10));
- }
-
- var7 = true;
- this.types[var8] = ScriptRuntime.DoubleClass;
- }
- } else {
- var7 = true;
- }
- }
- }
-
- if (!var7) {
- this.types = null;
- }
-
- var6 = this.parmsLength;
- }
-
- this.lengthPropertyValue = (short)var6;
- this.hasVoidReturn = this.method != null && this.method.getReturnType() == Void.TYPE;
- super.argCount = (short)var6;
- ((ScriptableObject)this).setParentScope(var3);
- ((ScriptableObject)this).setPrototype(ScriptableObject.getFunctionPrototype(var3));
- }
-
- static Method[] findMethods(Class var0, String var1) {
- Vector var2 = new Vector(5);
- Method[] var3 = var0.getMethods();
-
- for(int var4 = 0; var4 < var3.length; ++var4) {
- if (var3[var4].getDeclaringClass() == var0 && var3[var4].getName().equals(var1)) {
- var2.addElement(var3[var4]);
- }
- }
-
- if (var2.size() == 0) {
- return null;
- } else {
- Method[] var5 = new Method[var2.size()];
- var2.copyInto(var5);
- return var5;
- }
- }
-
- public void addAsConstructor(Scriptable var1, Scriptable var2) {
- ((ScriptableObject)this).setParentScope(var1);
- ((ScriptableObject)this).setPrototype(ScriptableObject.getFunctionPrototype(var1));
- var2.setParentScope(this);
- boolean var3 = true;
- ((ScriptableObject)this).defineProperty("prototype", var2, 7);
- String var4 = var2.getClassName();
- if (!var4.equals("With")) {
- if (var2 instanceof ScriptableObject) {
- ((ScriptableObject)var2).defineProperty("constructor", this, 7);
- } else {
- var2.put("constructor", var2, this);
- }
- }
-
- if (var1 instanceof ScriptableObject) {
- ((ScriptableObject)var1).defineProperty(var4, this, 2);
- } else {
- var1.put(var4, var1, this);
- }
-
- ((ScriptableObject)this).setParentScope(var1);
- }
-
- private Object callVarargs(Context var1, Scriptable var2, Object[] var3, boolean var4) throws JavaScriptException {
- try {
- if (this.parmsLength == -1) {
- Object[] var11 = new Object[]{var1, var2, var3, this};
- Object var13 = this.method.invoke((Object)null, var11);
- return this.hasVoidReturn ? Undefined.instance : var13;
- } else {
- Boolean var5 = var4 ? Boolean.TRUE : Boolean.FALSE;
- Object[] var12 = new Object[]{var1, var3, this, var5};
- return this.method == null ? this.ctor.newInstance(var12) : this.method.invoke((Object)null, var12);
- }
- } catch (InvocationTargetException var8) {
- Throwable var6 = var8.getTargetException();
- if (var6 instanceof EvaluatorException) {
- throw (EvaluatorException)var6;
- } else {
- Object var7 = var2 == null ? this : var2;
- throw JavaScriptException.wrapException((Scriptable)var7, var6);
- }
- } catch (IllegalAccessException var9) {
- throw WrappedException.wrapException(var9);
- } catch (InstantiationException var10) {
- throw WrappedException.wrapException(var10);
- }
- }
-
- // $FF: synthetic method
- private static Class class$(String var0) {
- try {
- return Class.forName(var0);
- } catch (ClassNotFoundException var2) {
- throw new NoClassDefFoundError(((Throwable)var2).getMessage());
- }
- }
-
- public Object call(Context var1, Scriptable var2, Scriptable var3, Object[] var4) throws JavaScriptException {
- if (this.parmsLength < 0) {
- return this.callVarargs(var1, var3, var4, false);
- } else {
- if (!this.isStatic) {
- for(Class var5 = this.method != null ? this.method.getDeclaringClass() : this.ctor.getDeclaringClass(); var3 != null && !var5.isInstance(var3); var3 = var3.getPrototype()) {
- }
-
- if (var3 == null) {
- Object[] var14 = new Object[]{super.names[0]};
- throw Context.reportRuntimeError(Context.getMessage("msg.incompat.call", var14));
- }
- }
-
- int var6;
- Object[] var13;
- if (this.parmsLength == var4.length) {
- var13 = var4;
- var6 = this.types == null ? this.parmsLength : 0;
- } else {
- var13 = new Object[this.parmsLength];
- var6 = 0;
- }
-
- while(var6 < this.parmsLength) {
- Object var7 = var6 < var4.length ? var4[var6] : Undefined.instance;
- if (this.types != null) {
- Class var8 = this.types[var6];
- if (var8 != ScriptRuntime.BooleanClass && var8 != Boolean.TYPE) {
- if (var8 == ScriptRuntime.StringClass) {
- var7 = ScriptRuntime.toString(var7);
- } else if (var8 != ScriptRuntime.IntegerClass && var8 != Integer.TYPE) {
- if (var8 != ScriptRuntime.DoubleClass && var8 != Double.TYPE) {
- if (var8 != ScriptRuntime.ScriptableClass) {
- Object[] var9 = new Object[]{var8.getName()};
- throw Context.reportRuntimeError(Context.getMessage("msg.cant.convert", var9));
- }
-
- var7 = ScriptRuntime.toObject(this, var7);
- } else {
- var7 = new Double(ScriptRuntime.toNumber(var7));
- }
- } else {
- var7 = new Integer(ScriptRuntime.toInt32(var7));
- }
- } else {
- var7 = ScriptRuntime.toBoolean(var7) ? Boolean.TRUE : Boolean.FALSE;
- }
- }
-
- var13[var6] = var7;
- ++var6;
- }
-
- try {
- Object var15 = this.method != null ? this.method.invoke(var3, var13) : this.ctor.newInstance(var13);
- if (this.hasVoidReturn) {
- return Undefined.instance;
- } else {
- return var15;
- }
- } catch (InvocationTargetException var10) {
- throw JavaScriptException.wrapException(var2, var10);
- } catch (IllegalAccessException var11) {
- throw WrappedException.wrapException(var11);
- } catch (InstantiationException var12) {
- throw WrappedException.wrapException(var12);
- }
- }
- }
-
- public boolean has(String var1, Scriptable var2) {
- return var1.equals("length") || super.has(var1, var2);
- }
-
- public void setLength(short var1) {
- this.lengthPropertyValue = var1;
- }
- }
-