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;
-
- public class NativeJavaMethod extends NativeFunction implements Function {
- private static final boolean debug = false;
- Method[] methods;
-
- static String signature(Class[] var0) {
- StringBuffer var1 = new StringBuffer();
-
- for(int var2 = 0; var2 < var0.length; ++var2) {
- if (var2 != 0) {
- var1.append(',');
- }
-
- var1.append(signature(var0[var2]));
- }
-
- return var1.toString();
- }
-
- static String signature(Member var0) {
- Class[] var1 = var0 instanceof Method ? ((Method)var0).getParameterTypes() : ((Constructor)var0).getParameterTypes();
- return var0.getName() + "(" + signature(var1) + ")";
- }
-
- public Object getDefaultValue(Class var1) {
- return this;
- }
-
- public NativeJavaMethod() {
- super.names = new String[1];
- }
-
- public NativeJavaMethod(Method[] var1) {
- this.methods = var1;
- super.names = new String[1];
- super.names[0] = var1[0].getName();
- }
-
- public void add(Method var1) {
- if (super.names[0] == null) {
- super.names[0] = var1.getName();
- } else if (!super.names[0].equals(var1.getName())) {
- throw new RuntimeException("internal method name mismatch");
- }
-
- int var2 = this.methods == null ? 0 : this.methods.length;
- Method[] var3 = new Method[var2 + 1];
-
- for(int var4 = 0; var4 < var2; ++var4) {
- var3[var4] = this.methods[var4];
- }
-
- var3[var2] = var1;
- this.methods = var3;
- }
-
- Method[] getMethods() {
- return this.methods;
- }
-
- private static void printDebug(String var0, Member var1, Object[] var2) {
- }
-
- public Object call(Context var1, Scriptable var2, Scriptable var3, Object[] var4) throws JavaScriptException {
- if (this.methods.length == 0) {
- throw new RuntimeException("No methods defined for call");
- } else {
- for(int var5 = 0; var5 < var4.length; ++var5) {
- if (var4[var5] instanceof Wrapper) {
- var4[var5] = ((Wrapper)var4[var5]).unwrap();
- }
- }
-
- Method var15 = (Method)findFunction(this.methods, var4);
- if (var15 == null) {
- Class var16 = this.methods[0].getDeclaringClass();
- String var18 = var16.getName() + "." + super.names[0] + "(" + signature(var4) + ")";
- Object[] var20 = new Object[]{var18};
- throw Context.reportRuntimeError(Context.getMessage("msg.java.no_such_method", var20));
- } else {
- Class[] var6 = var15.getParameterTypes();
-
- for(int var7 = 0; var7 < var4.length; ++var7) {
- var4[var7] = NativeJavaObject.coerceType(var6[var7], var4[var7]);
- }
-
- Object var17;
- try {
- var17 = ((NativeJavaObject)var3).unwrap();
- } catch (ClassCastException var14) {
- if (!Modifier.isStatic(var15.getModifiers())) {
- Object[] var8 = new Object[]{super.names[0]};
- throw Context.reportRuntimeError(Context.getMessage("msg.nonjava.method", var8));
- }
-
- var17 = null;
- }
-
- try {
- Object var19 = var15.invoke(var17, var4);
- Class var9 = var15.getReturnType();
- Object var10 = NativeJavaObject.wrap(var2, var19, var9);
- if (var10 == Undefined.instance) {
- return var10;
- } else if (var10 == null && var9 == Void.TYPE) {
- return Undefined.instance;
- } else {
- if (var19 != var10 && var10 instanceof Scriptable) {
- Scriptable var11 = (Scriptable)var10;
- if (var11.getPrototype() == null) {
- var11.setPrototype(super.parent.getPrototype());
- }
-
- if (var11.getParentScope() == null) {
- var11.setParentScope(super.parent.getParentScope());
- }
- }
-
- return var10;
- }
- } catch (IllegalAccessException var12) {
- throw Context.reportRuntimeError(((Throwable)var12).getMessage());
- } catch (InvocationTargetException var13) {
- throw JavaScriptException.wrapException(var2, var13);
- }
- }
- }
- }
-
- static Member findFunction(Member[] var0, Object[] var1) {
- if (var0.length == 0) {
- return null;
- } else {
- boolean var2 = var0[0] instanceof Method;
-
- label35:
- for(int var3 = 0; var3 < var0.length; ++var3) {
- Member var4 = var0[var3];
- Class[] var5 = var2 ? ((Method)var4).getParameterTypes() : ((Constructor)var4).getParameterTypes();
- if (var5.length == var1.length) {
- for(int var6 = 0; var6 < var5.length; ++var6) {
- if (!NativeJavaObject.canConvert(var1[var6], var5[var6])) {
- continue label35;
- }
- }
-
- return var4;
- }
- }
-
- return null;
- }
- }
-
- static String signature(Class var0) {
- if (var0 == null) {
- return "null";
- } else if (var0 == ScriptRuntime.BooleanClass) {
- return "boolean";
- } else if (var0 == ScriptRuntime.ByteClass) {
- return "byte";
- } else if (var0 == ScriptRuntime.ShortClass) {
- return "short";
- } else if (var0 == ScriptRuntime.IntegerClass) {
- return "int";
- } else if (var0 == ScriptRuntime.LongClass) {
- return "long";
- } else if (var0 == ScriptRuntime.FloatClass) {
- return "float";
- } else if (var0 == ScriptRuntime.DoubleClass) {
- return "double";
- } else if (var0 == ScriptRuntime.StringClass) {
- return "string";
- } else if (ScriptRuntime.ScriptableClass.isAssignableFrom(var0)) {
- if (ScriptRuntime.FunctionClass.isAssignableFrom(var0)) {
- return "function";
- } else {
- return var0 == ScriptRuntime.UndefinedClass ? "undefined" : "object";
- }
- } else {
- return var0.getName();
- }
- }
-
- static String signature(Object[] var0) {
- StringBuffer var1 = new StringBuffer();
-
- for(int var2 = 0; var2 < var0.length; ++var2) {
- if (var2 != 0) {
- var1.append(',');
- }
-
- var1.append(var0[var2] == null ? "null" : signature(var0[var2].getClass()));
- }
-
- return var1.toString();
- }
- }
-