Search code examples
kotlininlinekotlin-interop

Why `Intrinsics.checkParameterIsNotNull` is not inlined?


In Kotlin, if we decompile some Kotlin bytecode to Java, we can often see this statement which does null checks:

Intrinsics.checkParameterIsNotNull(foo, "foo")

If we explore furthur, we can see the decompiled implementation of this method, it's implementation is exactly the same as it's name:

public static void checkParameterIsNotNull(Object value, String paramName) {
    if (value == null) {
        throwParameterIsNullException(paramName);
    }
}

Due to the existense of this class (Intrinsics), I can't use Kotlin without the stdlib, even if I tried my best to avoid using functions from stdlib, it automatically generates calls to Intrinsics.checkParameterIsNotNull.

Since the implementation of this method is very short (and appears very very often), why isn't this function inlined?

Is there some annotations that allow us to prevent Kotlin compiler from generating this null check? (maybe something like @TrustedNotNull)

For ProGuard: I'm worried because I'm working on shared libraries and ProGuard is not suitable for me in this case. I obviously know those code elimination tools (ProGuard, dce-js), and I know how and when to use them.
I'm just asking why is a function not inlined.


Solution

  • My guess is that a call to this final method is more efficient than inlining it.

    Although the code may appear simple, its byte code is rather long. Inlining it would hurt efficiency.