nativeMain.com.dokar.quickjs.util.JSValueUtil.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of quickjs-kt Show documentation
Show all versions of quickjs-kt Show documentation
A QuickJS binding for idiomatic Kotlin, with Async/DSL/ES Modules support.
The newest version!
package com.dokar.quickjs.util
import kotlinx.cinterop.CPointer
import kotlinx.cinterop.CValue
import kotlinx.cinterop.ExperimentalForeignApi
import quickjs.JSContext
import quickjs.JSValue
import quickjs.JS_FreeValue
import quickjs.JS_GetGlobalObject
import quickjs.JS_GetPropertyStr
import quickjs.JS_IsInstanceOf
import quickjs.JS_IsUndefined
@OptIn(ExperimentalForeignApi::class)
internal inline fun freeJsValues(context: CPointer, vararg values: CValue) {
if (values.size == 1) {
JS_FreeValue(context, values[0])
} else {
for (value in values) {
JS_FreeValue(context, value)
}
}
}
@OptIn(ExperimentalForeignApi::class)
internal fun CValue.isPromise(context: CPointer): Boolean {
val globalThis = JS_GetGlobalObject(context)
val result = isPromise(context, globalThis)
JS_FreeValue(context, globalThis)
return result
}
@OptIn(ExperimentalForeignApi::class)
internal inline fun CValue.isPromise(
context: CPointer,
globalThis: CValue,
): Boolean {
return isInstanceOf(context, globalThis, "Promise")
}
@OptIn(ExperimentalForeignApi::class)
internal inline fun CValue.isSet(
context: CPointer,
globalThis: CValue,
): Boolean {
return isInstanceOf(context, globalThis, "Set")
}
@OptIn(ExperimentalForeignApi::class)
internal inline fun CValue.isMap(
context: CPointer,
globalThis: CValue,
): Boolean {
return isInstanceOf(context, globalThis, "Map")
}
@OptIn(ExperimentalForeignApi::class)
internal inline fun CValue.isUint8Array(
context: CPointer,
globalThis: CValue,
): Boolean {
return isInstanceOf(context, globalThis, "Uint8Array")
}
@OptIn(ExperimentalForeignApi::class)
internal inline fun CValue.isInt8Array(
context: CPointer,
globalThis: CValue,
): Boolean {
return isInstanceOf(context, globalThis, "Int8Array")
}
@OptIn(ExperimentalForeignApi::class)
internal fun CValue.isInstanceOf(
context: CPointer,
globalThis: CValue,
constructorName: String,
): Boolean {
val constructor = JS_GetPropertyStr(context, globalThis, constructorName)
if (JS_IsUndefined(constructor) == 1) {
JS_FreeValue(context, constructor)
return false
}
val result = JS_IsInstanceOf(context, this, constructor) == 1
JS_FreeValue(context, constructor)
return result
}