-
Notifications
You must be signed in to change notification settings - Fork 5.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
KT-16245 Redundant null-check generated for a cast of already non-nul…
…lable value KT-16194 Code with unnecessary safe call contains redundant boxing/unboxing for primitive values KT-12839 Two null checks are generated when manually null checking platform type Recognize some additional cases of trivial null checks and trivial instance-of checks. A variable is "checked for null", if it is: - a function parameter checked with 'INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull' - checked for nullability with 'IFNULL/IFNONNULL' - checked for nullability with 'INSTANCEOF' (if objectref is instance-of T, then objectref is non-null) Before analyzing nullability, introduce synthetic assumptions for execution branches where a variable is guaranteed to be null or not null. For example, the following bytecode: ALOAD 1 // Ljava/lang/String; IFNULL L <non-null branch> L: <null branch> is transformed to ALOAD 1 IFNULL L1 NEW java/lang/String ASTORE 1 // tells analyzer that variable #1 is non-null <non-null branch> L: <null branch> L1: ACONST_NULL ASTORE 1 // tells analyzer that variable #1 is null GOTO L After the analysis is performed on a preprocessed method, remember the results for "interesting" instructions and revert the preprocessing transformations. After that, perform bytecode transformations as usual. Do not transform INSTANCEOF to-be-reified, because reification at call site can introduce null checks. E.g., inline fun <reified T> isNullable() = null is T ... assert(isNullable<String?>())
- Loading branch information
Showing
22 changed files
with
522 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.