KT-65949: Bridge intrinsics
Merge-request: KT-MR-14767 Merged-by: Gleb Lukianets <Gleb.Lukianets@jetbrains.com>
This commit is contained in:
committed by
Space Team
parent
7c4c6d2cd9
commit
b46ffc35f1
@@ -0,0 +1,38 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
|
||||
uintptr_t get_null();
|
||||
uintptr_t get_singleton_object();
|
||||
uintptr_t get_static_object();
|
||||
uintptr_t get_array();
|
||||
uintptr_t get_local_object();
|
||||
uintptr_t dispose_object(uintptr_t);
|
||||
|
||||
_Bool compare_identities(uintptr_t, uintptr_t);
|
||||
_Bool compare_objects(uintptr_t, uintptr_t);
|
||||
_Bool compare_arrays(uintptr_t, uintptr_t);
|
||||
|
||||
void retain_object(uintptr_t);
|
||||
void release_object(uintptr_t);
|
||||
|
||||
void test(uintptr_t obj1, uintptr_t obj2, _Bool (*comparator)(uintptr_t, uintptr_t), int code) {
|
||||
if (!comparator(obj1, obj2)) {
|
||||
exit(code);
|
||||
}
|
||||
|
||||
release_object(obj1);
|
||||
dispose_object(obj2);
|
||||
|
||||
release_object(obj1);
|
||||
dispose_object(obj2);
|
||||
}
|
||||
|
||||
int main() {
|
||||
test(get_singleton_object(), get_singleton_object(), compare_identities, -1);
|
||||
test(get_static_object(), get_static_object(), compare_identities, -2);
|
||||
test(get_local_object(), get_local_object(), compare_objects, -3);
|
||||
test(get_null(), get_null(), compare_identities, -4);
|
||||
test(get_array(), get_array(), compare_arrays, -5);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
import kotlin.native.internal.ExportedBridge
|
||||
import kotlin.native.internal.*
|
||||
import kotlinx.cinterop.ExperimentalForeignApi
|
||||
import kotlinx.cinterop.COpaquePointer
|
||||
|
||||
data object MyObject
|
||||
const val string = "Hello, world!"
|
||||
data class Data(var data: Unit = Unit)
|
||||
|
||||
@ExportedBridge("get_null")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun getNull(): COpaquePointer? = createSpecialRef(null)
|
||||
|
||||
@ExportedBridge("get_singleton_object")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun getSingletonObject(): COpaquePointer? = createSpecialRef(MyObject)
|
||||
|
||||
@ExportedBridge("get_static_object")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun getStaticObject(): COpaquePointer? = createSpecialRef(string)
|
||||
|
||||
@ExportedBridge("get_local_object")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun getLocalObject(): COpaquePointer? = createSpecialRef(Data())
|
||||
|
||||
@ExportedBridge("get_array")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun getArray(): COpaquePointer? = createSpecialRef(arrayOf(Data(), Data()))
|
||||
|
||||
@ExportedBridge("compare_identities")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun compareIdentities(obj1: COpaquePointer?, obj2: COpaquePointer?): Boolean = dereferenceSpecialRef(obj1) === dereferenceSpecialRef(obj2)
|
||||
|
||||
@ExportedBridge("compare_objects")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun compareObjects(obj1: COpaquePointer?, obj2: COpaquePointer?): Boolean = dereferenceSpecialRef(obj1) == dereferenceSpecialRef(obj2)
|
||||
|
||||
@ExportedBridge("compare_arrays")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun compareArrays(obj1: COpaquePointer?, obj2: COpaquePointer?): Boolean = (dereferenceSpecialRef(obj1) as? Array<Any>) contentEquals (dereferenceSpecialRef(obj2) as? Array<Any>)
|
||||
|
||||
@ExportedBridge("dispose_object")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun disposeObject(obj: COpaquePointer?): Unit = disposeSpecialRef(obj)
|
||||
|
||||
@ExportedBridge("retain_object")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun retainObject(ref: COpaquePointer?) = retainSpecialRef(ref)
|
||||
|
||||
@ExportedBridge("release_object")
|
||||
@OptIn(ExperimentalForeignApi::class)
|
||||
fun releaseObject(ref: COpaquePointer?) = releaseSpecialRef(ref)
|
||||
Reference in New Issue
Block a user