mirror of
https://github.com/oven-sh/bun
synced 2026-02-13 20:39:05 +00:00
89 lines
3.2 KiB
C++
89 lines
3.2 KiB
C++
#include "root.h"
|
|
#include "ZigGlobalObject.h"
|
|
|
|
#include "JSWrappingFunction.h"
|
|
#include <JavaScriptCore/JSObjectInlines.h>
|
|
#include <wtf/text/ExternalStringImpl.h>
|
|
|
|
#include <JavaScriptCore/FunctionPrototype.h>
|
|
#include <JavaScriptCore/HeapAnalyzer.h>
|
|
|
|
#include <JavaScriptCore/SlotVisitorMacros.h>
|
|
#include <JavaScriptCore/ObjectConstructor.h>
|
|
#include <JavaScriptCore/SubspaceInlines.h>
|
|
|
|
namespace Zig {
|
|
using namespace JSC;
|
|
|
|
const ClassInfo JSWrappingFunction::s_info = { "Function"_s, &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSWrappingFunction) };
|
|
|
|
JS_EXPORT_PRIVATE JSWrappingFunction* JSWrappingFunction::create(
|
|
VM& vm,
|
|
Zig::GlobalObject* globalObject,
|
|
const BunString* symbolName,
|
|
Zig::NativeFunctionPtr functionPointer,
|
|
JSC::JSValue wrappedFnValue)
|
|
{
|
|
JSC::JSFunction* wrappedFn = jsCast<JSC::JSFunction*>(wrappedFnValue.asCell());
|
|
ASSERT(wrappedFn != nullptr);
|
|
|
|
auto nameStr = symbolName->tag == BunStringTag::Empty ? WTF::emptyString() : symbolName->toWTFString();
|
|
auto name = Identifier::fromString(vm, nameStr);
|
|
NativeExecutable* executable = vm.getHostFunction(functionPointer, ImplementationVisibility::Public, nullptr, nameStr);
|
|
|
|
// Structure* structure = globalObject->FFIFunctionStructure();
|
|
Structure* structure = JSWrappingFunction::createStructure(vm, globalObject, globalObject->objectPrototype());
|
|
JSWrappingFunction* function = new (NotNull, allocateCell<JSWrappingFunction>(vm)) JSWrappingFunction(vm, executable, globalObject, structure);
|
|
ASSERT(function->structure()->globalObject());
|
|
function->finishCreation(vm, executable, 0, nameStr);
|
|
|
|
function->m_wrappedFn.set(vm, globalObject, wrappedFn);
|
|
|
|
return function;
|
|
}
|
|
|
|
void JSWrappingFunction::finishCreation(VM& vm, NativeExecutable* executable, unsigned length, const String& name)
|
|
{
|
|
Base::finishCreation(vm, executable, length, name);
|
|
ASSERT(inherits(info()));
|
|
}
|
|
|
|
template<typename Visitor>
|
|
void JSWrappingFunction::visitChildrenImpl(JSCell* cell, Visitor& visitor)
|
|
{
|
|
JSWrappingFunction* thisObject = jsCast<JSWrappingFunction*>(cell);
|
|
ASSERT_GC_OBJECT_INHERITS(thisObject, info());
|
|
Base::visitChildren(thisObject, visitor);
|
|
|
|
visitor.append(thisObject->m_wrappedFn);
|
|
}
|
|
|
|
DEFINE_VISIT_CHILDREN(JSWrappingFunction);
|
|
|
|
extern "C" JSC::EncodedJSValue Bun__JSWrappingFunction__create(
|
|
Zig::GlobalObject* globalObject,
|
|
const BunString* symbolName,
|
|
Bun::NativeFunctionPtr functionPointer,
|
|
JSC::EncodedJSValue wrappedFnEncoded)
|
|
{
|
|
auto& vm = JSC::getVM(globalObject);
|
|
JSC::JSValue wrappedFn = JSC::JSValue::decode(wrappedFnEncoded);
|
|
auto function = JSWrappingFunction::create(vm, globalObject, symbolName, functionPointer, wrappedFn);
|
|
return JSC::JSValue::encode(function);
|
|
}
|
|
|
|
extern "C" JSC::EncodedJSValue Bun__JSWrappingFunction__getWrappedFunction(
|
|
JSC::EncodedJSValue thisValueEncoded,
|
|
Zig::GlobalObject* globalObject)
|
|
{
|
|
JSC::JSValue thisValue = JSC::JSValue::decode(thisValueEncoded);
|
|
JSWrappingFunction* thisObject = jsCast<JSWrappingFunction*>(thisValue.asCell());
|
|
if (thisObject != nullptr) {
|
|
JSC::JSFunction* wrappedFn = thisObject->m_wrappedFn.get();
|
|
return JSC::JSValue::encode(wrappedFn);
|
|
}
|
|
return {};
|
|
}
|
|
|
|
}
|