home *** CD-ROM | disk | FTP | other *** search
- package com.netscape.javascript;
-
- import java.util.Hashtable;
-
- public class NativeFunction extends RescopeableObject implements Function {
- private static final int OFFSET = 4;
- private static final int SETBACK = 2;
- private static final boolean printSource = false;
- protected String[] names;
- protected short argCount;
- protected short version;
- protected String source;
- public NativeFunction[] nestedFunctions;
- public int debug_level = -1;
- public String debug_srcName;
-
- public String decompile(int var1, boolean var2, boolean var3) {
- if (this.source == null) {
- return "function " + this.js_getName() + "() {\n\t[native code]\n}\n";
- } else {
- StringBuffer var4 = new StringBuffer();
- int var5 = 0;
- if (this.source.length() > 0) {
- if (var2) {
- if (!var3) {
- var4.append('\n');
- }
-
- for(int var6 = 0; var6 < var1; ++var6) {
- var4.append(' ');
- }
- }
-
- if (this.source.charAt(0) == 'm' && this.source.length() > 1 && (this.source.charAt(1) == ',' || this.source.charAt(1) == ']')) {
- if (!var3) {
- var4.append("function ");
- if (this.nextIs(var5, 93) && this.version != 120 && this.names != null && this.names[0].length() == 0) {
- var4.append("anonymous");
- }
-
- ++var5;
- } else {
- while(var5 < this.source.length() && (this.source.charAt(var5) != 1 || var5 > 0 && this.source.charAt(var5 - 1) == ',')) {
- ++var5;
- }
-
- ++var5;
- }
- }
- }
-
- for(; var5 < this.source.length(); ++var5) {
- switch (this.source.charAt(var5)) {
- case '\u0001':
- var4.append('\n');
- if (var5 + 1 < this.source.length()) {
- int var31 = 0;
- if (!this.nextIs(var5, 115) && !this.nextIs(var5, 116)) {
- if (this.nextIs(var5, 92)) {
- var31 = 4;
- } else if (this.nextIs(var5, 44)) {
- char var32 = this.source.charAt(var5 + 2);
- if (this.source.charAt(var5 + var32 + 3) == 'b') {
- var31 = 4;
- }
- }
- } else {
- var31 = 2;
- }
-
- while(var31 < var1) {
- var4.append(' ');
- ++var31;
- }
- }
- break;
- case '\u0005':
- if (this.nextIs(var5, 88)) {
- var4.append("return");
- } else {
- var4.append("return ");
- }
- break;
- case '\u000b':
- var4.append(" | ");
- break;
- case '\f':
- var4.append(" ^ ");
- break;
- case '\r':
- var4.append(" & ");
- break;
- case '\u0017':
- var4.append(" + ");
- break;
- case '\u0018':
- var4.append(" - ");
- break;
- case '\u0019':
- var4.append(" * ");
- break;
- case '\u001a':
- var4.append(" / ");
- break;
- case '\u001b':
- var4.append(" % ");
- break;
- case '\u001e':
- var4.append("new ");
- break;
- case '\u001f':
- var4.append("delete ");
- break;
- case ',':
- case '8':
- ++var5;
- int var21 = var5 + this.source.charAt(var5);
- var4.append(this.source.substring(var5 + 1, var21 + 1));
- var5 = var21;
- break;
- case '-':
- ++var5;
- long var7 = 0L;
- switch (this.source.charAt(var5)) {
- case 'D':
- ++var5;
- var7 |= (long)this.source.charAt(var5++) << 48;
- var7 |= (long)this.source.charAt(var5++) << 32;
- var7 |= (long)this.source.charAt(var5++) << 16;
- var7 |= (long)this.source.charAt(var5);
- double var30 = Double.longBitsToDouble(var7);
- var4.append(ScriptRuntime.numberToString(var30));
- continue;
- case 'J':
- ++var5;
- var7 |= (long)this.source.charAt(var5++) << 48;
- var7 |= (long)this.source.charAt(var5++) << 32;
- var7 |= (long)this.source.charAt(var5++) << 16;
- var7 |= (long)this.source.charAt(var5);
- var4.append(var7);
- continue;
- case 'S':
- ++var5;
- var4.append(this.source.charAt(var5));
- default:
- continue;
- }
- case '.':
- ++var5;
- int var20 = var5 + this.source.charAt(var5);
- var4.append('"');
- var4.append(ScriptRuntime.escapeString(this.source.substring(var5 + 1, var20 + 1)));
- var4.append('"');
- var5 = var20;
- break;
- case '>':
- var4.append("throw ");
- break;
- case '?':
- var4.append(" in ");
- break;
- case 'K':
- var4.append("try ");
- break;
- case 'X':
- if (this.nextIs(var5, 1)) {
- var4.append(";");
- } else {
- var4.append("; ");
- }
- break;
- case 'Y':
- var4.append('[');
- break;
- case 'Z':
- var4.append(']');
- break;
- case '[':
- if (this.nextIs(var5, 1)) {
- var1 += 4;
- }
-
- var4.append("{");
- break;
- case '\\':
- if (!var3 || !var2 || var5 + 1 != this.source.length()) {
- if (this.nextIs(var5, 1)) {
- var1 -= 4;
- }
-
- if (!this.nextIs(var5, 117) && !this.nextIs(var5, 113)) {
- var4.append('}');
- } else {
- var1 -= 4;
- var4.append("} ");
- }
- }
- break;
- case ']':
- var4.append('(');
- break;
- case '^':
- if (this.nextIs(var5, 91)) {
- var4.append(") ");
- } else {
- var4.append(')');
- }
- break;
- case '_':
- var4.append(", ");
- break;
- case '`':
- ++var5;
- switch (this.source.charAt(var5)) {
- case '\u000b':
- var4.append(" |= ");
- continue;
- case '\f':
- var4.append(" ^= ");
- continue;
- case '\r':
- var4.append(" &= ");
- continue;
- case '\u0014':
- var4.append(" <<= ");
- continue;
- case '\u0015':
- var4.append(" >>= ");
- continue;
- case '\u0016':
- var4.append(" >>>= ");
- continue;
- case '\u0017':
- var4.append(" += ");
- continue;
- case '\u0018':
- var4.append(" -= ");
- continue;
- case '\u0019':
- var4.append(" *= ");
- continue;
- case '\u001a':
- var4.append(" /= ");
- continue;
- case '\u001b':
- var4.append(" %= ");
- continue;
- case '\u007f':
- var4.append(" = ");
- default:
- continue;
- }
- case 'a':
- var4.append(" ? ");
- break;
- case 'b':
- if (this.nextIs(var5, 1)) {
- var4.append(":");
- } else {
- var4.append(" : ");
- }
- break;
- case 'c':
- var4.append(" || ");
- break;
- case 'd':
- var4.append(" && ");
- break;
- case 'e':
- ++var5;
- switch (this.source.charAt(var5)) {
- case '\u000e':
- var4.append(" == ");
- continue;
- case '\u000f':
- var4.append(" != ");
- continue;
- case '5':
- var4.append(this.version == 120 ? " == " : " === ");
- continue;
- case '6':
- var4.append(this.version == 120 ? " != " : " !== ");
- default:
- continue;
- }
- case 'f':
- ++var5;
- switch (this.source.charAt(var5)) {
- case '\u0010':
- var4.append(" < ");
- continue;
- case '\u0011':
- var4.append(" <= ");
- continue;
- case '\u0012':
- var4.append(" > ");
- continue;
- case '\u0013':
- var4.append(" >= ");
- continue;
- case '@':
- var4.append(" instanceof ");
- default:
- continue;
- }
- case 'g':
- ++var5;
- switch (this.source.charAt(var5)) {
- case '\u0014':
- var4.append(" << ");
- continue;
- case '\u0015':
- var4.append(" >> ");
- continue;
- case '\u0016':
- var4.append(" >>> ");
- default:
- continue;
- }
- case 'h':
- ++var5;
- switch (this.source.charAt(var5)) {
- case '\u0017':
- var4.append('+');
- continue;
- case '\u0018':
- var4.append('-');
- continue;
- case '\u001c':
- var4.append('~');
- continue;
- case ' ':
- var4.append("typeof ");
- continue;
- case '\u0080':
- var4.append('!');
- continue;
- case '\u0083':
- var4.append("void ");
- default:
- continue;
- }
- case 'i':
- var4.append("++");
- break;
- case 'j':
- var4.append("--");
- break;
- case 'k':
- var4.append('.');
- break;
- case 'l':
- ++var5;
- switch (this.source.charAt(var5)) {
- case ' ':
- var4.append("typeof");
- continue;
- case '1':
- var4.append("null");
- continue;
- case '2':
- var4.append("this");
- continue;
- case '3':
- var4.append("false");
- continue;
- case '4':
- var4.append("true");
- continue;
- case 'J':
- var4.append("undefined");
- continue;
- case '\u0083':
- var4.append("void");
- default:
- continue;
- }
- case 'm':
- ++var5;
- char var9 = this.source.charAt(var5);
- if (this.nestedFunctions != null && var9 <= this.nestedFunctions.length) {
- var4.append(this.nestedFunctions[var9].decompile(var1, false, false));
- break;
- }
-
- String var10;
- if (this.names != null && this.names.length > 0 && this.names[0].length() > 0) {
- Object[] var33 = new Object[]{new Integer(this.source.charAt(var5)), this.names[0]};
- var10 = Context.getMessage("msg.no.function.ref.found.in", var33);
- } else {
- Object[] var11 = new Object[]{new Integer(this.source.charAt(var5))};
- var10 = Context.getMessage("msg.no.function.ref.found", var11);
- }
-
- throw Context.reportRuntimeError(var10);
- case 'p':
- var4.append("if ");
- break;
- case 'q':
- var4.append("else ");
- break;
- case 'r':
- var4.append("switch ");
- break;
- case 's':
- var4.append("case ");
- break;
- case 't':
- var4.append("default");
- break;
- case 'u':
- var4.append("while ");
- break;
- case 'v':
- var4.append("do ");
- break;
- case 'w':
- var4.append("for ");
- break;
- case 'x':
- if (this.nextIs(var5, 44)) {
- var4.append("break ");
- } else {
- var4.append("break");
- }
- break;
- case 'y':
- if (this.nextIs(var5, 44)) {
- var4.append("continue ");
- } else {
- var4.append("continue");
- }
- break;
- case 'z':
- var4.append("var ");
- break;
- case '{':
- var4.append("with ");
- break;
- case '|':
- var4.append("catch ");
- break;
- case '}':
- var4.append("finally ");
- break;
- case '\u0086':
- var4.append(':');
- break;
- default:
- throw new RuntimeException("Unknown token " + this.source.charAt(var5));
- }
- }
-
- if (var2 && !var3) {
- var4.append('\n');
- }
-
- return var4.toString();
- }
- }
-
- public static Object js_call(Context var0, Scriptable var1, Object[] var2, Function var3) throws JavaScriptException {
- Object var4 = var1.getDefaultValue(ScriptRuntime.FunctionClass);
- if (var2.length == 0) {
- Scriptable var7 = ScriptRuntime.toObject(var3, var4);
- return ScriptRuntime.call(var0, var4, var7.getParentScope(), ScriptRuntime.emptyArgs);
- } else {
- Scriptable var5 = var2[0] == null ? null : ScriptRuntime.toObject(var3, var2[0]);
- Object[] var6 = new Object[var2.length - 1];
- System.arraycopy(var2, 1, var6, 0, var6.length);
- return ScriptRuntime.call(var0, var4, var5, var6);
- }
- }
-
- public String js_getName() {
- if (this.names != null && this.names[0].length() > 0) {
- return this.names[0];
- } else {
- Context var1 = Context.getCurrentContext();
- return var1 != null && var1.getLanguageVersion() == 120 ? "" : "anonymous";
- }
- }
-
- public Scriptable construct(Context var1, Scriptable var2, Object[] var3) throws JavaScriptException {
- NativeObject var4 = new NativeObject();
- var4.setPrototype(this.getClassPrototype());
- var4.setParentScope(((ScriptableObject)this).getParentScope());
- Object var5 = this.call(var1, var2, var4, var3);
- return (Scriptable)(var5 != null && var5 != Undefined.instance && var5 instanceof Scriptable ? (Scriptable)var5 : var4);
- }
-
- public boolean hasInstance(Scriptable var1) {
- FlattenedObject var2 = new FlattenedObject(this);
- Object var3 = var2.getProperty("prototype");
-
- try {
- var6 = ((FlattenedObject)var3).getObject();
- } catch (ClassCastException var5) {
- Object[] var4 = new Object[]{this.names[0]};
- throw Context.reportRuntimeError(Context.getMessage("msg.instanceof.bad.prototype", var4));
- }
-
- return ScriptRuntime.jsDelegatesTo(var1, var6);
- }
-
- public int js_getArity() {
- return this.argCount;
- }
-
- private NativeCall getActivation(Context var1) {
- for(NativeCall var2 = var1.currentActivation; var2 != null; var2 = var2.caller) {
- if (var2.getFunctionObject() == this) {
- return var2;
- }
- }
-
- return null;
- }
-
- public Object get(String var1, Scriptable var2) {
- Object var3 = super.get(var1, var2);
- if (var3 != Scriptable.NOT_FOUND) {
- return var3;
- } else if (var1.equals("prototype")) {
- NativeObject var6 = new NativeObject();
- ((ScriptableObject)var6).setPrototype(ScriptableObject.getObjectPrototype(this));
- boolean var5 = true;
- ((ScriptableObject)var6).defineProperty("constructor", this, 7);
- ((ScriptableObject)this).put(var1, this, var6);
- return var6;
- } else if (var1.equals("arguments")) {
- NativeCall var4 = this.getActivation(Context.getContext());
- return var4 == null ? null : ((ScriptableObject)var4).get("arguments", var4);
- } else {
- return Scriptable.NOT_FOUND;
- }
- }
-
- public int js_getLength() {
- Context var1 = Context.getContext();
- if (var1.getLanguageVersion() != 120) {
- return this.argCount;
- } else {
- NativeCall var2 = this.getActivation(var1);
- return var2 == null ? this.argCount : var2.getOriginalArguments().length;
- }
- }
-
- public static Object js_toString(Context var0, Scriptable var1, Object[] var2, Function var3) {
- Object var4 = var1.getDefaultValue(ScriptRuntime.FunctionClass);
- if (!(var4 instanceof NativeFunction)) {
- Object[] var7 = new Object[]{"toString"};
- String var6 = Context.getMessage("msg.incompat.call", var7);
- throw Context.reportRuntimeError(var6);
- } else {
- int var5 = 0;
- if (var2.length > 0) {
- var5 = (int)ScriptRuntime.toNumber(var2[0]);
- }
-
- return ((NativeFunction)var4).decompile(var5, true, false);
- }
- }
-
- protected Scriptable getClassPrototype() {
- this.has("prototype", this);
- Object var1 = this.get("prototype", this);
- if (var1 == null || !(var1 instanceof Scriptable)) {
- var1 = ScriptableObject.getClassPrototype(this, "Object");
- }
-
- return (Scriptable)var1;
- }
-
- public static void finishInit(Scriptable var0, FunctionObject var1, Scriptable var2) {
- ((ScriptableObject)var1).setPrototype(var2);
- String[] var3 = new String[]{""};
- ((NativeFunction)var2).names = var3;
- }
-
- private boolean nextIs(int var1, int var2) {
- if (var1 + 1 < this.source.length()) {
- return this.source.charAt(var1 + 1) == var2;
- } else {
- return false;
- }
- }
-
- public static Object js_apply(Context var0, Scriptable var1, Object[] var2, Function var3) throws JavaScriptException {
- if (var2.length != 2) {
- return js_call(var0, var1, var2, var3);
- } else {
- Object var4 = var1.getDefaultValue(ScriptRuntime.FunctionClass);
- Scriptable var5 = var2[0] == null ? null : ScriptRuntime.toObject(var3, var2[0]);
- Object[] var6 = var0.getElements((Scriptable)var2[1]);
- return ScriptRuntime.call(var0, var4, var5, var6);
- }
- }
-
- public Object call(Context var1, Scriptable var2, Scriptable var3, Object[] var4) throws JavaScriptException {
- return Undefined.instance;
- }
-
- public synchronized Scriptable rescope(Hashtable var1) {
- Scriptable var2 = (Scriptable)var1.get(this);
- if (var2 != null) {
- return var2;
- } else {
- NativeFunction var3 = (NativeFunction)super.rescope(var1);
- if (this.nestedFunctions != null) {
- var3.nestedFunctions = new NativeFunction[this.nestedFunctions.length];
- RescopeableObject.rescopeArray(this.nestedFunctions, var3.nestedFunctions, var1);
- }
-
- return var3;
- }
- }
-
- public static Scriptable js_Function(Context var0, Object[] var1, Function var2, boolean var3) {
- int var4 = var1.length;
- StringBuffer var5 = new StringBuffer();
-
- int var6;
- for(var6 = 0; var6 < var4 - 1; ++var6) {
- if (var6 > 0) {
- var5.append(",");
- }
-
- var5.append(ScriptRuntime.toString(var1[var6]));
- }
-
- String var7 = var4 == 0 ? "" : ScriptRuntime.toString(var1[var6]);
- String var8 = "function (" + var5.toString() + ") {" + var7 + "}";
- int[] var9 = new int[1];
- String var10 = Context.getSourcePositionFromStack(var9);
- if (var10 == null) {
- var10 = "<eval'ed string>";
- var9[0] = 1;
- }
-
- Object var11 = var0.getSecurityDomainForStackDepth(4);
- Scriptable var12 = ScriptableObject.getTopLevelScope(var2);
- int var13 = var0.getOptimizationLevel();
- var0.setOptimizationLevel(-1);
- NativeFunction var14 = (NativeFunction)var0.compileFunction(var12, var8, var10, var9[0], var11);
- var0.setOptimizationLevel(var13);
- if (var14.names == null) {
- var14.names = new String[1];
- }
-
- var14.names[0] = "";
- ((ScriptableObject)var14).setPrototype(ScriptableObject.getFunctionPrototype(var12));
- ((ScriptableObject)var14).setParentScope(var12);
- return var14;
- }
-
- public boolean has(String var1, Scriptable var2) {
- return var1.equals("prototype") || var1.equals("arguments") || super.has(var1, var2);
- }
-
- public String getClassName() {
- return "Function";
- }
- }
-