aboutsummaryrefslogtreecommitdiff
path: root/src/javascript
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-05-06 00:05:31 -0700
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2022-05-06 00:05:31 -0700
commitbce60a5a86c01a3f96d41b0034ce2bc6d7593941 (patch)
tree4479a592697481eac36af4adffe57fe5cea9db07 /src/javascript
parenta7b0bc8790a98fa18961e4a2f6462ba7c15ca9f8 (diff)
downloadbun-bce60a5a86c01a3f96d41b0034ce2bc6d7593941.tar.gz
bun-bce60a5a86c01a3f96d41b0034ce2bc6d7593941.tar.zst
bun-bce60a5a86c01a3f96d41b0034ce2bc6d7593941.zip
more napi
Diffstat (limited to 'src/javascript')
-rw-r--r--src/javascript/jsc/bindings/napi.cpp192
1 files changed, 191 insertions, 1 deletions
diff --git a/src/javascript/jsc/bindings/napi.cpp b/src/javascript/jsc/bindings/napi.cpp
index 0c47d1a63..13ec61a53 100644
--- a/src/javascript/jsc/bindings/napi.cpp
+++ b/src/javascript/jsc/bindings/napi.cpp
@@ -37,6 +37,8 @@
#include "JavaScriptCore/JSArray.h"
#include "JavaScriptCore/JSInternalPromise.h"
#include "JavaScriptCore/ObjectConstructor.h"
+#include "JavaScriptCore/ArrayBuffer.h"
+#include "JavaScriptCore/JSArrayBuffer.h"
#include "JSFFIFunction.h"
#include <iostream>
@@ -118,7 +120,7 @@ extern "C" napi_status napi_get_cb_info(
JSC::CallFrame* callFrame = reinterpret_cast<JSC::CallFrame*>(cbinfo);
JSC::JSValue thisValue = callFrame->thisValue();
*argc = callFrame->argumentCount();
- *reinterpret_cast<JSC::EncodedJSValue**>(argv) = reinterpret_cast<JSC::EncodedJSValue*>(callFrame->addressOfArgumentsStart());
+ **reinterpret_cast<JSC::EncodedJSValue***>(argv) = reinterpret_cast<JSC::EncodedJSValue*>(callFrame->addressOfArgumentsStart());
if (thisValue && this_arg != nullptr) {
*this_arg = reinterpret_cast<napi_value>(JSC::JSValue::encode(thisValue));
}
@@ -153,4 +155,192 @@ extern "C" napi_status napi_create_reference(napi_env env, napi_value value,
JSC::Strong<JSC::Unknown> data = { globalObject->vm(), JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(value)) };
*reinterpret_cast<JSC::Strong<JSC::Unknown>*>(result) = data;
return napi_ok;
+}
+
+extern "C" napi_status napi_is_detached_arraybuffer(napi_env env,
+ napi_value arraybuffer,
+ bool* result)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+
+ JSC::EncodedJSValue encodedValue = reinterpret_cast<JSC::EncodedJSValue>(arraybuffer);
+ JSC::JSValue value = JSC::JSValue::decode(encodedValue);
+ if (!value.isObject()) {
+ return napi_arraybuffer_expected;
+ }
+
+ JSC::JSArrayBuffer* jsArrayBuffer = JSC::jsDynamicCast<JSC::JSArrayBuffer*>(vm, value);
+ if (!jsArrayBuffer) {
+ return napi_arraybuffer_expected;
+ }
+
+ auto arrayBuffer = jsArrayBuffer->impl();
+
+ *result = arrayBuffer->isDetached();
+ return napi_ok;
+}
+
+extern "C" napi_status napi_detach_arraybuffer(napi_env env,
+ napi_value arraybuffer)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+
+ JSC::EncodedJSValue encodedValue = reinterpret_cast<JSC::EncodedJSValue>(arraybuffer);
+ JSC::JSValue value = JSC::JSValue::decode(encodedValue);
+ if (!value.isObject()) {
+ return napi_arraybuffer_expected;
+ }
+
+ JSC::JSArrayBuffer* jsArrayBuffer = JSC::jsDynamicCast<JSC::JSArrayBuffer*>(vm, value);
+ if (!jsArrayBuffer) {
+ return napi_arraybuffer_expected;
+ }
+
+ auto arrayBuffer = jsArrayBuffer->impl();
+
+ if (arrayBuffer->isDetached()) {
+ return napi_ok;
+ }
+
+ arrayBuffer->detach(vm);
+
+ return napi_ok;
+}
+
+extern "C" napi_status napi_throw(napi_env env, napi_value error)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+ auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+ JSC::JSValue value = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(error));
+ JSC::throwException(globalObject, throwScope, value);
+ return napi_ok;
+}
+
+extern "C" napi_status napi_throw_type_error(napi_env env, const char* code,
+ const char* msg)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+
+ JSC::VM& vm = globalObject->vm();
+ auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+ auto message = WTF::String::fromUTF8(msg);
+ auto error = JSC::createTypeError(globalObject, message);
+ JSC::throwException(globalObject, throwScope, error);
+ return napi_ok;
+}
+extern "C" napi_status napi_throw_range_error(napi_env env, const char* code,
+ const char* msg)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+
+ JSC::VM& vm = globalObject->vm();
+ auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+ auto message = WTF::String::fromUTF8(msg);
+ auto error = JSC::createRangeError(globalObject, message);
+ JSC::throwException(globalObject, throwScope, error);
+ return napi_ok;
+}
+
+extern "C" napi_status napi_object_freeze(napi_env env, napi_value object_value)
+{
+
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+ auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+ JSC::EncodedJSValue encodedValue = reinterpret_cast<JSC::EncodedJSValue>(object_value);
+ JSC::JSValue value = JSC::JSValue::decode(encodedValue);
+ if (!value.isObject()) {
+ return napi_object_expected;
+ }
+
+ JSC::JSObject* object = JSC::jsCast<JSC::JSObject*>(value);
+ if (!hasIndexedProperties(object->indexingType())) {
+ object->freeze(vm);
+ }
+
+ RELEASE_AND_RETURN(throwScope, napi_ok);
+}
+extern "C" napi_status napi_object_seal(napi_env env, napi_value object_value)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+ auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+ JSC::EncodedJSValue encodedValue = reinterpret_cast<JSC::EncodedJSValue>(object_value);
+ JSC::JSValue value = JSC::JSValue::decode(encodedValue);
+ if (!value.isObject()) {
+ return napi_object_expected;
+ }
+
+ JSC::JSObject* object = JSC::jsCast<JSC::JSObject*>(value);
+ if (!hasIndexedProperties(object->indexingType())) {
+ object->seal(vm);
+ }
+
+ RELEASE_AND_RETURN(throwScope, napi_ok);
+}
+
+extern "C" napi_status napi_get_global(napi_env env, napi_value* result)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+ *result = reinterpret_cast<napi_value>(globalObject->globalThis());
+ return napi_ok;
+}
+
+extern "C" napi_status napi_create_range_error(napi_env env, napi_value code,
+ napi_value msg,
+ napi_value* result)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+
+ JSC::EncodedJSValue encodedCode = reinterpret_cast<JSC::EncodedJSValue>(code);
+ JSC::JSValue codeValue = JSC::JSValue::decode(encodedCode);
+
+ JSC::EncodedJSValue encodedMessage = reinterpret_cast<JSC::EncodedJSValue>(msg);
+ JSC::JSValue messageValue = JSC::JSValue::decode(encodedMessage);
+
+ auto error = JSC::createRangeError(globalObject, messageValue.toWTFString(globalObject));
+ *result = reinterpret_cast<napi_value>(error);
+ return napi_ok;
+}
+
+extern "C" napi_status napi_get_new_target(napi_env env,
+ napi_callback_info cbinfo,
+ napi_value* result)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+
+ CallFrame* callFrame = reinterpret_cast<JSC::CallFrame*>(cbinfo);
+ JSC::JSValue newTarget = callFrame->newTarget();
+ *result = reinterpret_cast<napi_value>(JSC::JSValue::encode(newTarget));
+ return napi_ok;
+}
+
+extern "C" napi_status napi_create_dataview(napi_env env, size_t length,
+ napi_value arraybuffer,
+ size_t byte_offset,
+ napi_value* result)
+{
+ Zig::GlobalObject* globalObject = reinterpret_cast<Zig::GlobalObject*>(env);
+ JSC::VM& vm = globalObject->vm();
+ auto throwScope = DECLARE_THROW_SCOPE(vm);
+
+ JSC::EncodedJSValue encodedArraybuffer = reinterpret_cast<JSC::EncodedJSValue>(arraybuffer);
+ auto arraybufferValue = JSC::jsDynamicCast<JSC::JSArrayBuffer*>(vm, JSC::JSValue::decode(encodedArraybuffer));
+ if (!arraybufferValue) {
+ return napi_invalid_arg;
+ }
+ auto dataView = JSC::DataView::create(arraybufferValue->impl(), byte_offset, length);
+ *result = reinterpret_cast<napi_value>(dataView->wrap(globalObject, globalObject));
+ return napi_ok;
} \ No newline at end of file