All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nativeMain.com.dokar.quickjs.util.JSValueUtil.kt Maven / Gradle / Ivy

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
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy