LiteLoaderBDS-1.16.40/Tools/ScriptX/backend/JavaScriptCore/JscHelper.hpp
2023-03-03 10:18:21 -08:00

121 lines
3.8 KiB
C++

/*
* Tencent is pleased to support the open source community by making ScriptX available.
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <utility>
#include "../../src/utils/Helper.hpp"
#include "JscEngine.h"
#include "JscHelper.h"
namespace script::jsc_backend {
template <typename R, typename Fn>
R toJscValues(JSGlobalContextRef context, size_t length, const Local<Value>* args, Fn fn) {
std::optional<R> ret{std::nullopt};
script::internal::withNArray<JSValueRef>(length,
[&ret, context, length, args, &fn](JSValueRef* arr) {
for (size_t i = 0; i < length; ++i) {
arr[i] = JscEngine::toJsc(context, args[i]);
}
ret.emplace(fn(arr));
});
return *ret;
}
} // namespace script::jsc_backend
namespace script {
namespace internal {
template <typename T, typename Args>
struct MakeLocalHelper {
static Local<T> makeLocal(Args args) {
return jsc_backend::JscEngine::make<Local<T>>(std::forward<Args>(args));
}
};
template <>
struct MakeLocalHelper<String, JSStringRef> {
static Local<String> makeLocal(JSStringRef ref) {
return jsc_backend::JscEngine::make<Local<String>>(jsc_backend::StringLocalRef(ref));
}
};
} // namespace internal
struct jsc_interop {
/**
* get JSGlobalContextRef from JscEngine
*/
static JSGlobalContextRef getEngineContext(jsc_backend::JscEngine* engine) {
return engine->context_;
}
/**
* get JSContextGroupRef from JscEngine
*/
static JSContextGroupRef getEngineContextGroup(jsc_backend::JscEngine* engine) {
return engine->virtualMachine_;
}
/**
* get JSGlobalContextRef from EngineScope
*/
static JSGlobalContextRef currentEngineContextChecked() {
return ::script::jsc_backend::currentEngineContextChecked();
}
/**
* get JSContextGroupRef from EngineScope
*/
static JSContextGroupRef currentEngineContextGroupChecked() {
return ::script::jsc_backend::currentEngineContextGroupChecked();
}
/**
* convert Local<T> to a jsc local reference
*/
template <typename T>
static typename jsc_backend::RefTypeMap<T>::jscType toJsc(JSGlobalContextRef context,
const Local<T>& ref) {
return jsc_backend::JscEngine::toJsc(context, ref);
}
/**
* create Local from jsc local reference
* NOTE: when create String from JSStringRef, it also transfer ownership to the created
* Local<String>
*/
template <typename T, typename Args>
static Local<T> makeLocal(Args args) {
return script::internal::MakeLocalHelper<T, Args>::makeLocal(args);
}
static Arguments newArguments(jsc_backend::JscEngine* engine, JSObjectRef thisObject,
const JSValueRef* arguments, size_t size) {
return jsc_backend::JscEngine::newArguments(engine, thisObject, arguments, size);
}
using ArgumentsData = jsc_backend::ArgumentsData;
static ArgumentsData extractArguments(const Arguments& args) { return args.callbackInfo_; }
};
} // namespace script