home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / APCHSSL2.ZIP / OS2HTTPD / jserv / com / netscape / javascript / FunctionObject.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-04-09  |  7.4 KB  |  295 lines

  1. package com.netscape.javascript;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Member;
  6. import java.lang.reflect.Method;
  7. import java.lang.reflect.Modifier;
  8. import java.util.Vector;
  9.  
  10. public class FunctionObject extends NativeFunction {
  11.    private static final short VARARGS_METHOD = -1;
  12.    private static final short VARARGS_CTOR = -2;
  13.    Method method;
  14.    Constructor ctor;
  15.    private Class[] types;
  16.    private short parmsLength;
  17.    private short lengthPropertyValue;
  18.    private boolean hasVoidReturn;
  19.    private boolean isStatic;
  20.    // $FF: synthetic field
  21.    private static Class class$com$netscape$javascript$Context;
  22.    // $FF: synthetic field
  23.    private static Class class$com$netscape$javascript$Scriptable;
  24.  
  25.    public Scriptable construct(Context var1, Scriptable var2, Object[] var3) throws JavaScriptException {
  26.       if (this.method != null && this.parmsLength != -2) {
  27.          return super.construct(var1, var2, var3);
  28.       } else {
  29.          Scriptable var4 = this.method != null ? (Scriptable)this.callVarargs(var1, (Scriptable)null, var3, true) : (Scriptable)this.call(var1, var2, (Scriptable)null, var3);
  30.          if (var4.getPrototype() == null) {
  31.             var4.setPrototype(((NativeFunction)this).getClassPrototype());
  32.          }
  33.  
  34.          if (var4.getParentScope() == null) {
  35.             Scriptable var5 = ((ScriptableObject)this).getParentScope();
  36.             if (var4 != var5) {
  37.                var4.setParentScope(var5);
  38.             }
  39.          }
  40.  
  41.          return var4;
  42.       }
  43.    }
  44.  
  45.    public Object get(String var1, Scriptable var2) {
  46.       return var1.equals("length") ? new Integer(this.lengthPropertyValue) : super.get(var1, var2);
  47.    }
  48.  
  49.    public void put(String var1, Scriptable var2, Object var3) {
  50.       if (!var1.equals("length")) {
  51.          super.put(var1, var2, var3);
  52.       }
  53.  
  54.    }
  55.  
  56.    public FunctionObject(String var1, Member var2, Scriptable var3) {
  57.       String var4;
  58.       if (var2 instanceof Constructor) {
  59.          this.ctor = (Constructor)var2;
  60.          this.isStatic = true;
  61.          this.types = this.ctor.getParameterTypes();
  62.          var4 = this.ctor.getName();
  63.       } else {
  64.          this.method = (Method)var2;
  65.          this.isStatic = Modifier.isStatic(this.method.getModifiers());
  66.          this.types = this.method.getParameterTypes();
  67.          var4 = this.method.getName();
  68.       }
  69.  
  70.       String[] var5 = new String[]{var1};
  71.       super.names = var5;
  72.       short var6;
  73.       if (this.types.length == 4 && (this.types[1].isArray() || this.types[2].isArray())) {
  74.          if (this.types[1].isArray()) {
  75.             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) {
  76.                String var11 = Context.getMessage("msg.varargs.ctor", (Object[])null);
  77.                throw Context.reportRuntimeError(var11);
  78.             }
  79.          } 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) {
  80.             String var12 = Context.getMessage("msg.varargs.fun", (Object[])null);
  81.             throw Context.reportRuntimeError(var12);
  82.          }
  83.  
  84.          this.parmsLength = (short)(this.types[1].isArray() ? -2 : -1);
  85.          var6 = 1;
  86.       } else {
  87.          this.parmsLength = (short)this.types.length;
  88.          boolean var7 = false;
  89.  
  90.          for(int var8 = 0; var8 < this.parmsLength; ++var8) {
  91.             Class var9 = this.types[var8];
  92.             if (var9 != ScriptRuntime.ObjectClass) {
  93.                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)) {
  94.                   if (var9 == Boolean.TYPE) {
  95.                      var7 = true;
  96.                      this.types[var8] = ScriptRuntime.BooleanClass;
  97.                   } else if (var9 == Byte.TYPE) {
  98.                      var7 = true;
  99.                      this.types[var8] = ScriptRuntime.ByteClass;
  100.                   } else if (var9 == Short.TYPE) {
  101.                      var7 = true;
  102.                      this.types[var8] = ScriptRuntime.ShortClass;
  103.                   } else if (var9 == Integer.TYPE) {
  104.                      var7 = true;
  105.                      this.types[var8] = ScriptRuntime.IntegerClass;
  106.                   } else if (var9 == Float.TYPE) {
  107.                      var7 = true;
  108.                      this.types[var8] = ScriptRuntime.FloatClass;
  109.                   } else {
  110.                      if (var9 != Double.TYPE) {
  111.                         Object[] var10 = new Object[]{var4};
  112.                         throw Context.reportRuntimeError(Context.getMessage("msg.bad.parms", var10));
  113.                      }
  114.  
  115.                      var7 = true;
  116.                      this.types[var8] = ScriptRuntime.DoubleClass;
  117.                   }
  118.                } else {
  119.                   var7 = true;
  120.                }
  121.             }
  122.          }
  123.  
  124.          if (!var7) {
  125.             this.types = null;
  126.          }
  127.  
  128.          var6 = this.parmsLength;
  129.       }
  130.  
  131.       this.lengthPropertyValue = (short)var6;
  132.       this.hasVoidReturn = this.method != null && this.method.getReturnType() == Void.TYPE;
  133.       super.argCount = (short)var6;
  134.       ((ScriptableObject)this).setParentScope(var3);
  135.       ((ScriptableObject)this).setPrototype(ScriptableObject.getFunctionPrototype(var3));
  136.    }
  137.  
  138.    static Method[] findMethods(Class var0, String var1) {
  139.       Vector var2 = new Vector(5);
  140.       Method[] var3 = var0.getMethods();
  141.  
  142.       for(int var4 = 0; var4 < var3.length; ++var4) {
  143.          if (var3[var4].getDeclaringClass() == var0 && var3[var4].getName().equals(var1)) {
  144.             var2.addElement(var3[var4]);
  145.          }
  146.       }
  147.  
  148.       if (var2.size() == 0) {
  149.          return null;
  150.       } else {
  151.          Method[] var5 = new Method[var2.size()];
  152.          var2.copyInto(var5);
  153.          return var5;
  154.       }
  155.    }
  156.  
  157.    public void addAsConstructor(Scriptable var1, Scriptable var2) {
  158.       ((ScriptableObject)this).setParentScope(var1);
  159.       ((ScriptableObject)this).setPrototype(ScriptableObject.getFunctionPrototype(var1));
  160.       var2.setParentScope(this);
  161.       boolean var3 = true;
  162.       ((ScriptableObject)this).defineProperty("prototype", var2, 7);
  163.       String var4 = var2.getClassName();
  164.       if (!var4.equals("With")) {
  165.          if (var2 instanceof ScriptableObject) {
  166.             ((ScriptableObject)var2).defineProperty("constructor", this, 7);
  167.          } else {
  168.             var2.put("constructor", var2, this);
  169.          }
  170.       }
  171.  
  172.       if (var1 instanceof ScriptableObject) {
  173.          ((ScriptableObject)var1).defineProperty(var4, this, 2);
  174.       } else {
  175.          var1.put(var4, var1, this);
  176.       }
  177.  
  178.       ((ScriptableObject)this).setParentScope(var1);
  179.    }
  180.  
  181.    private Object callVarargs(Context var1, Scriptable var2, Object[] var3, boolean var4) throws JavaScriptException {
  182.       try {
  183.          if (this.parmsLength == -1) {
  184.             Object[] var11 = new Object[]{var1, var2, var3, this};
  185.             Object var13 = this.method.invoke((Object)null, var11);
  186.             return this.hasVoidReturn ? Undefined.instance : var13;
  187.          } else {
  188.             Boolean var5 = var4 ? Boolean.TRUE : Boolean.FALSE;
  189.             Object[] var12 = new Object[]{var1, var3, this, var5};
  190.             return this.method == null ? this.ctor.newInstance(var12) : this.method.invoke((Object)null, var12);
  191.          }
  192.       } catch (InvocationTargetException var8) {
  193.          Throwable var6 = var8.getTargetException();
  194.          if (var6 instanceof EvaluatorException) {
  195.             throw (EvaluatorException)var6;
  196.          } else {
  197.             Object var7 = var2 == null ? this : var2;
  198.             throw JavaScriptException.wrapException((Scriptable)var7, var6);
  199.          }
  200.       } catch (IllegalAccessException var9) {
  201.          throw WrappedException.wrapException(var9);
  202.       } catch (InstantiationException var10) {
  203.          throw WrappedException.wrapException(var10);
  204.       }
  205.    }
  206.  
  207.    // $FF: synthetic method
  208.    private static Class class$(String var0) {
  209.       try {
  210.          return Class.forName(var0);
  211.       } catch (ClassNotFoundException var2) {
  212.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  213.       }
  214.    }
  215.  
  216.    public Object call(Context var1, Scriptable var2, Scriptable var3, Object[] var4) throws JavaScriptException {
  217.       if (this.parmsLength < 0) {
  218.          return this.callVarargs(var1, var3, var4, false);
  219.       } else {
  220.          if (!this.isStatic) {
  221.             for(Class var5 = this.method != null ? this.method.getDeclaringClass() : this.ctor.getDeclaringClass(); var3 != null && !var5.isInstance(var3); var3 = var3.getPrototype()) {
  222.             }
  223.  
  224.             if (var3 == null) {
  225.                Object[] var14 = new Object[]{super.names[0]};
  226.                throw Context.reportRuntimeError(Context.getMessage("msg.incompat.call", var14));
  227.             }
  228.          }
  229.  
  230.          int var6;
  231.          Object[] var13;
  232.          if (this.parmsLength == var4.length) {
  233.             var13 = var4;
  234.             var6 = this.types == null ? this.parmsLength : 0;
  235.          } else {
  236.             var13 = new Object[this.parmsLength];
  237.             var6 = 0;
  238.          }
  239.  
  240.          while(var6 < this.parmsLength) {
  241.             Object var7 = var6 < var4.length ? var4[var6] : Undefined.instance;
  242.             if (this.types != null) {
  243.                Class var8 = this.types[var6];
  244.                if (var8 != ScriptRuntime.BooleanClass && var8 != Boolean.TYPE) {
  245.                   if (var8 == ScriptRuntime.StringClass) {
  246.                      var7 = ScriptRuntime.toString(var7);
  247.                   } else if (var8 != ScriptRuntime.IntegerClass && var8 != Integer.TYPE) {
  248.                      if (var8 != ScriptRuntime.DoubleClass && var8 != Double.TYPE) {
  249.                         if (var8 != ScriptRuntime.ScriptableClass) {
  250.                            Object[] var9 = new Object[]{var8.getName()};
  251.                            throw Context.reportRuntimeError(Context.getMessage("msg.cant.convert", var9));
  252.                         }
  253.  
  254.                         var7 = ScriptRuntime.toObject(this, var7);
  255.                      } else {
  256.                         var7 = new Double(ScriptRuntime.toNumber(var7));
  257.                      }
  258.                   } else {
  259.                      var7 = new Integer(ScriptRuntime.toInt32(var7));
  260.                   }
  261.                } else {
  262.                   var7 = ScriptRuntime.toBoolean(var7) ? Boolean.TRUE : Boolean.FALSE;
  263.                }
  264.             }
  265.  
  266.             var13[var6] = var7;
  267.             ++var6;
  268.          }
  269.  
  270.          try {
  271.             Object var15 = this.method != null ? this.method.invoke(var3, var13) : this.ctor.newInstance(var13);
  272.             if (this.hasVoidReturn) {
  273.                return Undefined.instance;
  274.             } else {
  275.                return var15;
  276.             }
  277.          } catch (InvocationTargetException var10) {
  278.             throw JavaScriptException.wrapException(var2, var10);
  279.          } catch (IllegalAccessException var11) {
  280.             throw WrappedException.wrapException(var11);
  281.          } catch (InstantiationException var12) {
  282.             throw WrappedException.wrapException(var12);
  283.          }
  284.       }
  285.    }
  286.  
  287.    public boolean has(String var1, Scriptable var2) {
  288.       return var1.equals("length") || super.has(var1, var2);
  289.    }
  290.  
  291.    public void setLength(short var1) {
  292.       this.lengthPropertyValue = var1;
  293.    }
  294. }
  295.