Version History#

Vineflower 1.10.1#

Released on 2024-04-16 - GitHub

Vineflower 1.10.1 is a bugfix release for the 1.10 branch, fixing a handful of issues that had popped up over the past couple weeks. Thanks to all the contributors who submitted patches for this release!

Full Changelog:

  • Fixed switches on enums with a switch map along with null cases for java 21 (Thanks, coehlrich!)
  • Fixed NPE and IOOBE in generics remapping
  • Fixed an infinite loop bug with stack simplification
  • Fixed some cases of switch expressions not generating (Thanks, coehlrich!)
  • Fixed blank lines being emitted with empty argument lists (Thanks, jpenilla!)
  • Fixed inner class variable renaming bug with JAD var naming (Thanks, coehlrich!)
  • Fixed hanging newlines being emitted (Thanks, jpenilla!)
  • Fixed MethodParameter attribute being used even if names were empty (Thanks, shartte!)
  • Fixed output not being deterministic for inner classes (Thanks, jpenilla!)
  • Fixed J21 inner class fix not applying to nested inner classes

Please report any issues to https://github.com/Vineflower/vineflower/issues!

Vineflower 1.10.0#

Released on 2024-04-04 - GitHub

Vineflower 1.10.0 is the next major release of Vineflower, bringing a plugin interface to allow interfacing with the decompiler, a prototype Kotlin decompiler, major performance optimizations, and dozens of bugfixes and minor improvements. Thanks to everyone who contributed to this release!

Release highlights:

  • An extensible plugin system, allowing third parties to modify decompiled code without modifying the decompiler itself
  • The addition of a prototype Kotlin decompiler
  • Improvements around variable handling
  • Large amounts of fixes to generics handling
  • Siginifcant improvements to decompiler speed and memory usage

NOTE
This release contains two different jars. The "regular" jar, with no classifier, contains both the main decompiler and the three bundled plugins. The "slim" jar, with the "-slim" classifier, contains only the main decompiler itself. If confused, just get the regular jar as usual.

The full changelog is as follows:

Click here to expand the full changelog
  • Added plugin API
  • Added prototype Kotlin decompiler
  • Added support for using MethodParameters attribute when there is no LVT
  • Added text token API
  • Added clashing names analysis
  • Added support for 'Type[]::new' (Thanks, coehlrich!)
  • Added support for variable inlining with pattern matching instanceof (Thanks, coehlrich!)
  • Added more descriptive names for options
  • Added support to hide spurious fields in records if they are already record components
  • Added space between operators (e.g. 'while(...)' -> 'while (...)')
  • Improved help message
  • Improved identification of if-pattern matches
  • Improved standalone '++i' by changing to the more idomatic 'i++' (Thanks, TheKodeTode!)
  • Improved some cases of variables not getting inlined
  • Significantly improved generics handling
  • Moved variable renaming to a separate plugin
  • Fixed a crash with a for loop over a static iterator method
  • Fixed "Invalid constant type" issue
  • Fixed try-with-resources processor creating illegal code with custom exception catching
  • Fixed concurrent modification exception with certain jars
  • Fixed generation of casts to type ""
  • Fixed some cases of fields not getting inlined into usage sites
  • Fixed labels pointing to blocks that don't exist
  • Fixed object casts to boolean type
  • Fixed cases of "Could not properly define all variable types" errors
  • Fixed for unrepresentable types
  • Fixed casts on null types
  • Fixed rare crash with 'longType++'
  • Fixed some multithreading issues
  • Fixed improper nested annotation formatting
  • Fixed casting of arrays with different dimensions
  • Fixed lambdas losing generics information
  • Fixed bug with for loop generation not respecting final variables (Thanks, coehlrich!)
  • Fixed decompiler not considering lambdas when searching for local class placement (Thanks, MiniDigger!)
  • Fixed fields being inlined too eagerly
  • Fixed incorrect finally block parsing creating invalid code
  • Fixed string concat with chars becoming ints
  • Fixed imports to anonymous classes
  • Fixed for loop being created when incremented by an unknown value
  • Fixed bug where unused casts of invocations would get removed
  • Fixed boxing being removed for top-level expressions
  • Fixed Java 21 switch on enum
  • Fixed Java 21 inner classes
  • Optimized object allocation
  • Tons of smaller fixes not mentioned here

Please report any issues to https://github.com/Vineflower/vineflower/issues!

Vineflower 1.9.3#

Released on 2023-09-04 - GitHub

Vineflower 1.9.3 is a hotfix release, fixing two issues resulting in inconsistent decompiler output.
Full changelog:

  • Fixed inconsistent decompilation with floating point values
  • Fixed inconsistent decompilation with non-static inner classes

Please report any issues to https://github.com/Vineflower/vineflower/issues!

Vineflower 1.9.2#

Released on 2023-08-04 - GitHub

Vineflower 1.9.2 is a smaller release, focusing on fixing bugs and other inconveniences with the 1.9 branch.

Full changelog:

  • Added option to remap parameters with JAD names
  • Fixed inconsistent decompilation of pi constants
  • Fixed inconsistent decompilation of floating point constants
  • Fixed incorrect decompilation of exponent notation floating point numbers ending in 0
  • Fixed Try with resources being created incorrectly
  • Fixed spurious code deletion with specific switch expressions
  • Fixed JAD var naming not working or using conflicting names in some cases (thanks, coehlrich!)
  • Fixed clashing variable names with method parameters (thanks, MiniDigger!)
  • Fixed clashing variable names in foreach statements
  • Fixed clashing variable names in local classes
  • Fixed variables in finally blocks not getting remapped
  • Fixed crash during writing lambdas in rare cases

Please report any issues to https://github.com/Vineflower/vineflower/issues!

Vineflower 1.9.1#

Released on 2023-07-11 - GitHub

Vineflower 1.9.1 is a minor update, mainly focusing around the renaming from Quiltflower to Vineflower.

Full changelog:

  • Added deterministic jar artifacts (thanks kb1000!)
  • Renamed from Quiltflower to Vineflower (see The organization page for an explanation)

Please report any issues to https://github.com/Vineflower/vineflower/issues!

Quiltflower 1.9.0#

Released on 2022-10-28 - GitHub

Quiltflower 1.9.0 brings dozens of bug fixes, new features, improved decompilation, and an improved way to interact with the Quiltflower API.
NOTE: This version requires a minimum of Java 11 to run!

Some highlights include:

  • Improved switch pattern matching support
  • Changed default settings to improve code output by default
  • Fixed the "baby shark" bug (multiple nested infinite loops in a row)
  • Optimized memory, CPU, and disk usage

Please report any issues at https://github.com/QuiltMC/quiltflower/issues.
The full changelog for this version goes as follows:

Click here to expand the full changelog
  • Added support for transitive and static modifiers in module info (Thanks kb1000!)
  • Added improved support for switch pattern matching (Thanks Luna!)
  • Added implementation version to manifest (Thanks nbauma109!)
  • Added some support for constant dynamic resugaring
  • Added lazy loading for classpath jars (Thanks, zml!)
  • Added new option to verify variable merges
  • Added new option to decompile preview features
  • Added support for decompiling out of executables
  • Enabled try loop fix by default
  • Enabled ternary conditions by default
  • Improved API for developer usability (Thanks, zml!)
  • Improved marking of monitorenter and monitorexit opcodes when they aren't resugared properly
  • Improved resugaring of switch expressions over enums
  • Improved default values in switch expressions
  • Improved tracking of assignments in try blocks
  • Improved Pi value parentheses
  • Improved rename entities iteration order to be sequential based on classes seen
  • Improved bytecode to line mappings
  • Improved the experimental try loop fix to extend to try-finally blocks
  • Improved help message when running through the command line (thanks sschr!)
  • Renamed $FF: tags in decompiled code to $QF:
  • Rewrote ternary processing code and made it much more accurate
  • Optimized code for speed and memory usage
  • Optimized file reading and parsing
  • Updated help message
  • Fixed most cases of longstanding issue where multiple nested infinite loops would be created
  • Fixed "invalid constant type" issue with variable merging
  • Fixed many subtle issues with code generation due to improper internal state management
  • Fixed some invalid code generation with assignments in if statements
  • Fixed if pattern matching shadowing already defined variables
  • Fixed do-while loops not being created when they are the last statement inside of an outer loop
  • Fixed finally blocks inside of loops causing a crash
  • Fixed methods and fields not getting renamed by rename entities
  • Fixed bogus var10000 variables showing up in some cases
  • Fixed catch blocks being removed entirely
  • Fixed Object[] not being casted correctly
  • Fixed CME in loop creation
  • Fixed synchronized statements not decompiling correctly when the last statement is a throw
  • Fixed finally blocks in loops causing improper break statements
  • Fixed extra parenthesis around array accesses
  • Fixed extra casts being applied in method calls when not needed
  • Fixed foreach loops being created when the iteration variable is used earlier
  • Fixed improper loop generation when the loop is the first block
  • Fixed returns in loops when breaks make more sense, in loops where it's the first block
  • Fixed finally blocks in synchronized statements causing crashes
  • Fixed assignments becoming improper inside of try blocks
  • Fixed some cases where booleans and ints would merge together
  • Fixed more cases of int x = true;
  • Fixed an infinite loop OOM combo with finally processing
  • Fixed synchronized statements not decompiling correctly when in a loop
  • Fixed arrays being initialized with char values instead of number literals
  • Fixed some cases of switch expressions being created when they shouldn't be
  • Fixed empty newlines at the end of sequence statements
  • Fixed static fields showing up before enum fields
  • Fixed some rare label issues with breaks out of try statements
  • Fixed some extraneous generic casts on assignments
  • Fixed some generic union type casts being improper
  • Fixed rare concurrency issues causing crashes
  • Fixed toString not removed in string concat (thanks, thewindsofwinter!)
  • Fixed incorrect assignment exprent modification for assignments with a condition (Thanks Totty!)
  • Fixed class cast exception when creating a foreach over array with multiple dimensions
  • Fixed NullPointerException when writing some switch on string statements
  • Merged from upstream: Fixed an infinite loop while decompiling obfuscated code
  • Fixed NullPointerException when parsing enum method descriptors
  • Fixed casts not being applied on byte->int coercion
  • Fixed casts not being applied on Object parameters
  • Fixed a few casts with anonymous classes

Quiltflower 1.8.1#

Released on 2022-04-29 - GitHub

  • Fixed bug where decompiled output would sometimes not be saved
  • Added option to add linemapping metadata to jar entries (thanks jpenilla!)

Quiltflower 1.8.0#

Released on 2022-04-05 - GitHub

The changelog for this version is very long, so here are the highlights:

  • Improved the quality and cleanliness of the output
  • Many fixes to generics
  • Many fixes to loops
  • Dozens of bugs and crashes fixed
Click here to expand the full changelog
  • Added ++/-- inlining when possible
  • Added variable renaming when there's multiple variables with the same name
  • Added switch statement brace enclosing when the multiple variables are in different case branches
  • Added switch expression in assert support
  • Added Implementation-Name: Quiltflower to jar manifest (thanks jnp!)
  • Added formatting on complex if-else chains (thanks Earthcomputer!)
  • Added basic switch pattern matching support for preview versions
  • Changed some default options: generic signatures and synthetic members are now hidden by default, pattern matching is enabled, and ternary-in-if is disabled
  • Improved default branch hiding on switches when it's an empty fallthrough
  • Improved generic casts on ternaries
  • Improved generic casts on assigns
  • Improved ternary type inference when one branch is null
  • Improved detection of explicit generic invocations, such as Comparator.<...>comparing()
  • Improved variable merging in loops (improved variable liveness calculation)
  • Improved if-else statement structure to prevent highly nested if-else statements
  • Improved conversion of labeled continues to breaks to produce correct but cleaner code
  • Improved if statements with a single labeled sequence by lifting the label to the if statement, making it clearer what is being jumped to by the label
  • Improved the experimental try loop fix, now works better and doesn't break on random code
  • Improved the IResultSaver API (thanks zml!)
  • Improved pattern matching significantly
  • Improved string concat support, now supports makeConcat as well as makeConcatWithConstants
  • Improved infinite loop with return at the end condensing significantly better
  • Improved labeled break -> continue resugaring
  • Optimized excess memory usage
  • Fixed <unknown> variables in foreach loops
  • Fixed null being cast when it doesn't need to be
  • Fixed constructor invocations having extra parenthesis
  • Fixed switch expressions not having parenthesis around them when they should
  • Fixed instances where variables were cast twice
  • Fixed switch statements in finally blocks causing issues
  • Fixed synchronized statements having a null argument when object is being assigned to null
  • Fixed synchronized statements removing autoboxing
  • Fixed method()[i] += 0; not being properly inlined
  • Fixed copying files to directories not working properly
  • Fixed boxing issues with field initializers
  • Fixed rare crashes with inconsistent idom sequences
  • Fixed continues becoming implicit when they should be explicit
  • Fixed local classes not decompiling breaking entire file
  • Fixed double brace initializers in java 17 placing extra modifiers on the braces
  • Fixed some cases where stack variables created by the dup bytecode family were not simplified
  • Fixed swap based constructor invocations
  • Fixed cases where while loops were improperly created, moving a continue out of the loop
  • Fixed case when there are 2 pops after a jump (thanks Kroppeb!)
  • Fixed expression reordering in array initializes resulting in semantically different code (thanks Kroppeb!)
  • Fixed phantom continue or break at the end of a loop
  • Fixed statement graph ordering being incorrect in certain cases
  • Fixed IndexOutOfBounds in ternary processing
  • Fixed statement graph not discovering all nodes, leading to <unknown> variables
  • Fixed improper loop elimination when the loop was required to make the output correct
  • Fixed generics not casting on super keyword (contravariance)
  • Fixed open file systems not being closed (thanks CoolMineman!)
  • Fixed decompilation error with kotlin when enums (thanks Juuz!)

Quiltflower 1.7.0#

Released on 2021-12-07 - GitHub

  • Added switch expression support
  • Added decompiled code formatting (Thanks Earthcomputer!)
  • Added proper try-with-resource return support
  • Fixed try with resources statements inlining statements when it shouldn't
  • Added comments to decompiled code when there are oddities, such as finally blocks failing to inline
  • Added support for eclipse switch-on-enum
  • Added bytecode dumping on error (Thanks skyrising!)
  • Added exception dumping on error (Thanks skyrising!)
  • Added link to Quiltflower issue tracker on error
  • Added toggle for override annotation
  • Improved linemapping
  • Improved initializers not being inlined when they needed a static qualification in a lambda (Thanks skyrising!)
  • Fixed empty infinite loops composed of 2+ gotos failing to decompile
  • Fixed decompiling from the command line creating files instead of folders
  • Fixed created jars having extra folder entries saved as files
  • Fixed certain errors being able to cause classes to not be decompiled
  • Fixed classes in pre 1.0 java not being parsed
  • Fixed enums being marked as sealed (Thanks skyrising!)
  • Fixed recursive lambdas causing stackoverflow
  • Fixed references to inner classes in other classes breaking the entire method

Quiltflower 1.6.1#

Released on 2021-11-24 - GitHub

  • Fixes try with resources bugs
  • Adds override annotation preference
  • Improved linemapping
  • Optimized try with resources

Quiltflower 1.6.0#

Released on 2021-11-08 - GitHub

  • Added try with resources support
  • Added if pattern matching support
  • Added ternary in if statement and loop support
  • Added ternary constant simplification (Thanks MatrixX!)
  • Added bytecode and exception in errored methods
  • Added support for polymorphic methodhandles (Thanks skyrising!)
  • Added the "DOT_ERROR_EXPORT_DIR" option to dump graphs only in errored methods
  • Added local record and enum support (Thanks MatrixX!)
  • Added some warnings for when known invalid code was produced, such as synchronize over null
  • Added some explicit exceptions for some NPEs and IOOBEs
  • Added ability to use just the java runtime as a library instead of the entire classpath (Thanks skyrising!)
  • Added multiple new decompiler options
  • Improved some control flow around returns and exceptions
  • Fixed empty for loops being made when they were empty, now they're while loops
  • Fixed decompiling of default record methods
  • Fixed empty infinite loops not being decompiled
  • Fixed assignments in final fields being inlined when they shouldn't be
  • Fixed loops being while(true) when they were regular loops
  • Fixed rare crash where long was incorrectly typed
  • Fixed bug with casts and parenthesis
  • Fixed invalid zip file creation (Thanks Geolykt!)
  • Fixed IOOBE with sequence inlining
  • Fixed local classes with lvt capture crashing (Thanks MatrixX!)
  • Fixed some foreach loops with generics having a variable type of
  • Fixed rare NPE with default case in switch over string
  • Fixed private interface methods having default modifier
  • Fixed classes in default package having a leading dot
  • Fixed local classes being put in the wrong location (Thanks skyrising!)
  • Fixed fields with lambdas capturing the enclosing class being moved to static blocks (Thanks skyrising!)
  • Fixed some unboxing casts being removed with generic variables (Thanks skyrising!)
  • Fixed crash with array initializers in static blocks trying to be inlined
  • Optimized code (Thanks Kroppeb and skyrising!)

Quiltflower 1.5.0#

Released on 2021-06-15 - GitHub

  • Added override annotation support
  • Added more support for uninlining pi constants (Thanks Will BL!)
  • Improved handling of methods with same name and descriptor (Thanks skyrising!)
  • Improved performance of loading library code (Thanks skyrising!)
  • Fixed empty string concatenation
  • Fixed generic parameter crash
  • Fixed Objects.requireNonNull not being removed when they should be
  • Fixed chars being used for arithmetic operations and returns
  • Fixed compound assignments such as += and *= not being created
  • Fixed random crashes occurring during decompilation (#13)

Quiltflower 1.4.0#

Released on 2021-05-28 - GitHub

  • Merged ForgeFlower
  • Updated Upstream
  • Fixed multiple issues with decompilation