Includes changes to decompiled text Old syntax is used in builtins and project code for now
2.3 KiB
Support for JVM's ACC_NATIVE flag
Goal: enable JNI interop for Kotlin, so that anything that works through JNI in Java could be reproduced 1-to-1 in Kotlin
Syntax
The following definition is present in the library:
package kotlin.jvm
Retention(RetentionPolicy.SOURCE)
public annotation class native
This annotation is applicable to
- functions
- property accessors
A declaration marked with this annotation is referred to as a native declaration.
Checks to perform:
- a native declaration can not be abstract
- a native declaration can not have a body
- a native declaration can not be marked
inline - a native declaration can not have
reifiedtype parameters NOTE: this is achieved through prohibitinginline, asreifiedis only allowed on inline-functions now - members of traits can not be native
NOTE: native members can override open (or abstract) members of supertypes
Semantics on the JVM
Intuition: a JVM method whose source declaration is native is marked with the ACC_NATIVE flag, and has no CODE attribute.
Interaction with [platformStatic]
A native member of an object marked native and platformStatic is translated in a straightforward way:
there is only one JVM method corresponding to it, and it is marked as ACC_NATIVE.
A member of a default object of class C marked native and platformStatic yields two JVM methods:
- static member of
Cthat is markedACC_NATIVE; - instance member of
C$objectthat is not markedACC_NATIVEand its body delegates to the native static method.
Top-level declarations
A native member of package p yields one JVM method:
- member of a package-facade class
PPackagewhich is marked withACC_NATIVEflag.
Native Property Accessors
A property can not be marked native.
A property accessor can be marked native if it has no body (i.e. it is a default accessor).
In this case the generated code is the same as for a native function defined in the same context as the property.
Example:
val foo: Int
[native] get
Not implemented (yet)
- native property accessors
- frontend: when accessors are default and native, don't require an initializer, don't allow a backing field
- backend: when accessors are default and native, don't generate a backing field
- applicability checks: only functions and property accessors