Class Decompiler
Source is saved (mostly) as token numbers. The tokens saved pretty much correspond to the token stream of a 'canonical' representation of the input program, as directed by the parser. (There were a few cases where tokens could have been left out where decompiler could easily reconstruct them, but I left them in for clarity). (I also looked adding source collection to TokenStream instead, where I could have limited the changes to a few lines in getToken... but this wouldn't have saved any space in the resulting source representation, and would have meant that I'd have to duplicate parser logic in the decompiler to disambiguate situations where newlines are important.) The function decompile expands the tokens back into their string representations, using simple lookahead to correct spacing and indentation.
Assignments are saved as two-token pairs (Token.ASSIGN, op). Number tokens are stored inline, as a NUMBER token, a character representing the type, and either 1 or 4 characters representing the bit-encoding of the number. String types NAME, STRING and OBJECT are currently stored as a token type, followed by a character giving the length of the string (assumed to be less than 2^16), followed by the characters of the string inlined into the source string. Changing this to some reference to to the string in the compiled class' constant pool would probably save a lot of space... but would require some method of deriving the final constant pool entry from information available at parse time.
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intDecompilation property to specify identation offset for case labels.private static final intstatic final intDecompilation property to specify default identation offset.static final intDecompilation property to specify initial ident value.static final intFlag to indicate that the decompilation should omit the function header and trailing brace.private static final booleanprivate char[]private intstatic final intFlag to indicate that the decompilation generates toSource result. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription(package private) void(package private) voidaddEOL(int token) (package private) void(package private) voidaddNumber(double n) (package private) void(package private) void(package private) voidaddTemplateLiteral(String str) (package private) voidaddToken(int token) private voidappend(char c) private voidappendString(String str) static StringDecompile the source information associated with this js function/script back into a string.(package private) int(package private) Stringprivate static intprivate static intgetSourceStringEnd(String source, int offset) private voidincreaseSourceCapacity(int minimalCapacity) (package private) intmarkFunctionEnd(int functionStart) (package private) intmarkFunctionStart(int functionType) private static intprintSourceBigInt(String source, int offset, StringBuilder sb) private static intprintSourceNumber(String source, int offset, StringBuilder sb) private static intprintSourceString(String source, int offset, boolean asQuotedString, StringBuilder sb) private StringsourceToString(int offset)
-
Field Details
-
ONLY_BODY_FLAG
public static final int ONLY_BODY_FLAGFlag to indicate that the decompilation should omit the function header and trailing brace.- See Also:
-
TO_SOURCE_FLAG
public static final int TO_SOURCE_FLAGFlag to indicate that the decompilation generates toSource result.- See Also:
-
INITIAL_INDENT_PROP
public static final int INITIAL_INDENT_PROPDecompilation property to specify initial ident value.- See Also:
-
INDENT_GAP_PROP
public static final int INDENT_GAP_PROPDecompilation property to specify default identation offset.- See Also:
-
CASE_GAP_PROP
public static final int CASE_GAP_PROPDecompilation property to specify identation offset for case labels.- See Also:
-
FUNCTION_END
private static final int FUNCTION_END- See Also:
-
sourceBuffer
private char[] sourceBuffer -
sourceTop
private int sourceTop -
printSource
private static final boolean printSource- See Also:
-
-
Constructor Details
-
Decompiler
public Decompiler()
-
-
Method Details
-
getEncodedSource
String getEncodedSource() -
getCurrentOffset
int getCurrentOffset() -
markFunctionStart
int markFunctionStart(int functionType) -
markFunctionEnd
int markFunctionEnd(int functionStart) -
addToken
void addToken(int token) -
addEOL
void addEOL(int token) -
addName
-
addString
-
addTemplateLiteral
-
addRegexp
-
addNumber
void addNumber(double n) -
addBigInt
-
appendString
-
append
private void append(char c) -
increaseSourceCapacity
private void increaseSourceCapacity(int minimalCapacity) -
sourceToString
-
decompile
Decompile the source information associated with this js function/script back into a string. For the most part, this just means translating tokens back to their string representations; there's a little bit of lookahead logic to decide the proper spacing/indentation. Most of the work in mapping the original source to the prettyprinted decompiled version is done by the parser.- Parameters:
source- encoded source tree presentationflags- flags to select output formatproperties- indentation properties
-
getNext
-
getSourceStringEnd
-
printSourceString
private static int printSourceString(String source, int offset, boolean asQuotedString, StringBuilder sb) -
printSourceNumber
-
printSourceBigInt
- See Also:
-