Quiltflower 1.9.0
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