⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decompiler.java

📁 java中比较著名的js引擎当属mozilla开源的rhino
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                if (!afterFirstEOL) {                    afterFirstEOL = true;                    if (justFunctionBody) {                        /* throw away just added 'function name(...) {'                         * and restore the original indent                         */                        result.setLength(0);                        indent -= indentGap;                        newLine = false;                    }                }                if (newLine) {                    result.append('\n');                }                /* add indent if any tokens remain,                 * less setback if next token is                 * a label, case or default.                 */                if (i + 1 < length) {                    int less = 0;                    int nextToken = source.charAt(i + 1);                    if (nextToken == Token.CASE                        || nextToken == Token.DEFAULT)                    {                        less = indentGap - caseGap;                    } else if (nextToken == Token.RC) {                        less = indentGap;                    }                    /* elaborate check against label... skip past a                     * following inlined NAME and look for a COLON.                     */                    else if (nextToken == Token.NAME) {                        int afterName = getSourceStringEnd(source, i + 2);                        if (source.charAt(afterName) == Token.COLON)                            less = indentGap;                    }                    for (; less < indent; less++)                        result.append(' ');                }                break;            }            case Token.DOT:                result.append('.');                break;            case Token.NEW:                result.append("new ");                break;            case Token.DELPROP:                result.append("delete ");                break;            case Token.IF:                result.append("if ");                break;            case Token.ELSE:                result.append("else ");                break;            case Token.FOR:                result.append("for ");                break;            case Token.IN:                result.append(" in ");                break;            case Token.WITH:                result.append("with ");                break;            case Token.WHILE:                result.append("while ");                break;            case Token.DO:                result.append("do ");                break;            case Token.TRY:                result.append("try ");                break;            case Token.CATCH:                result.append("catch ");                break;            case Token.FINALLY:                result.append("finally ");                break;            case Token.THROW:                result.append("throw ");                break;            case Token.SWITCH:                result.append("switch ");                break;            case Token.BREAK:                result.append("break");                if (Token.NAME == getNext(source, length, i))                    result.append(' ');                break;            case Token.CONTINUE:                result.append("continue");                if (Token.NAME == getNext(source, length, i))                    result.append(' ');                break;            case Token.CASE:                result.append("case ");                break;            case Token.DEFAULT:                result.append("default");                break;            case Token.RETURN:                result.append("return");                if (Token.SEMI != getNext(source, length, i))                    result.append(' ');                break;            case Token.VAR:                result.append("var ");                break;            case Token.SEMI:                result.append(';');                if (Token.EOL != getNext(source, length, i)) {                    // separators in FOR                    result.append(' ');                }                break;            case Token.ASSIGN:                result.append(" = ");                break;            case Token.ASSIGN_ADD:                result.append(" += ");                break;            case Token.ASSIGN_SUB:                result.append(" -= ");                break;            case Token.ASSIGN_MUL:                result.append(" *= ");                break;            case Token.ASSIGN_DIV:                result.append(" /= ");                break;            case Token.ASSIGN_MOD:                result.append(" %= ");                break;            case Token.ASSIGN_BITOR:                result.append(" |= ");                break;            case Token.ASSIGN_BITXOR:                result.append(" ^= ");                break;            case Token.ASSIGN_BITAND:                result.append(" &= ");                break;            case Token.ASSIGN_LSH:                result.append(" <<= ");                break;            case Token.ASSIGN_RSH:                result.append(" >>= ");                break;            case Token.ASSIGN_URSH:                result.append(" >>>= ");                break;            case Token.HOOK:                result.append(" ? ");                break;            case Token.OBJECTLIT:                // pun OBJECTLIT to mean colon in objlit property                // initialization.                // This needs to be distinct from COLON in the general case                // to distinguish from the colon in a ternary... which needs                // different spacing.                result.append(':');                break;            case Token.COLON:                if (Token.EOL == getNext(source, length, i))                    // it's the end of a label                    result.append(':');                else                    // it's the middle part of a ternary                    result.append(" : ");                break;            case Token.OR:                result.append(" || ");                break;            case Token.AND:                result.append(" && ");                break;            case Token.BITOR:                result.append(" | ");                break;            case Token.BITXOR:                result.append(" ^ ");                break;            case Token.BITAND:                result.append(" & ");                break;            case Token.SHEQ:                result.append(" === ");                break;            case Token.SHNE:                result.append(" !== ");                break;            case Token.EQ:                result.append(" == ");                break;            case Token.NE:                result.append(" != ");                break;            case Token.LE:                result.append(" <= ");                break;            case Token.LT:                result.append(" < ");                break;            case Token.GE:                result.append(" >= ");                break;            case Token.GT:                result.append(" > ");                break;            case Token.INSTANCEOF:                result.append(" instanceof ");                break;            case Token.LSH:                result.append(" << ");                break;            case Token.RSH:                result.append(" >> ");                break;            case Token.URSH:                result.append(" >>> ");                break;            case Token.TYPEOF:                result.append("typeof ");                break;            case Token.VOID:                result.append("void ");                break;            case Token.NOT:                result.append('!');                break;            case Token.BITNOT:                result.append('~');                break;            case Token.POS:                result.append('+');                break;            case Token.NEG:                result.append('-');                break;            case Token.INC:                result.append("++");                break;            case Token.DEC:                result.append("--");                break;            case Token.ADD:                result.append(" + ");                break;            case Token.SUB:                result.append(" - ");                break;            case Token.MUL:                result.append(" * ");                break;            case Token.DIV:                result.append(" / ");                break;            case Token.MOD:                result.append(" % ");                break;            case Token.COLONCOLON:                result.append("::");                break;            case Token.DOTDOT:                result.append("..");                break;            case Token.DOTQUERY:                result.append(".(");                break;            case Token.XMLATTR:                result.append('@');                break;            default:                // If we don't know how to decompile it, raise an exception.                throw new RuntimeException();            }            ++i;        }        if (!toSource) {            // add that trailing newline if it's an outermost function.            if (!justFunctionBody)                result.append('\n');        } else {            if (topFunctionType == FunctionNode.FUNCTION_EXPRESSION) {                result.append(')');            }        }        return result.toString();    }    private static int getNext(String source, int length, int i)    {        return (i + 1 < length) ? source.charAt(i + 1) : Token.EOF;    }    private static int getSourceStringEnd(String source, int offset)    {        return printSourceString(source, offset, false, null);    }    private static int printSourceString(String source, int offset,                                         boolean asQuotedString,                                         StringBuffer sb)    {        int length = source.charAt(offset);        ++offset;        if ((0x8000 & length) != 0) {            length = ((0x7FFF & length) << 16) | source.charAt(offset);            ++offset;        }        if (sb != null) {            String str = source.substring(offset, offset + length);            if (!asQuotedString) {                sb.append(str);            } else {                sb.append('"');                sb.append(ScriptRuntime.escapeString(str));                sb.append('"');            }        }        return offset + length;    }    private static int printSourceNumber(String source, int offset,                                         StringBuffer sb)    {        double number = 0.0;        char type = source.charAt(offset);        ++offset;        if (type == 'S') {            if (sb != null) {                int ival = source.charAt(offset);                number = ival;            }            ++offset;        } else if (type == 'J' || type == 'D') {            if (sb != null) {                long lbits;                lbits = (long)source.charAt(offset) << 48;                lbits |= (long)source.charAt(offset + 1) << 32;                lbits |= (long)source.charAt(offset + 2) << 16;                lbits |= (long)source.charAt(offset + 3);                if (type == 'J') {                    number = lbits;                } else {                    number = Double.longBitsToDouble(lbits);                }            }            offset += 4;        } else {            // Bad source            throw new RuntimeException();        }        if (sb != null) {            sb.append(ScriptRuntime.numberToString(number, 10));        }        return offset;    }    private char[] sourceBuffer = new char[128];// Per script/function source buffer top: parent source does not include a// nested functions source and uses function index as a reference instead.    private int sourceTop;// whether to do a debug print of the source information, when decompiling.    private static final boolean printSource = false;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -