diff options
author | 2023-09-15 04:23:37 -0700 | |
---|---|---|
committer | 2023-09-15 04:23:37 -0700 | |
commit | 92f2d9ab27fd2ab61b8bcfe8c0b42c7d6b90cdcf (patch) | |
tree | 5e4c07bc6118b2fa68c7d39655b9d353f6da9d98 | |
parent | 56c471a0052b081d01b973fc86a5d75a2373dce9 (diff) | |
download | bun-92f2d9ab27fd2ab61b8bcfe8c0b42c7d6b90cdcf.tar.gz bun-92f2d9ab27fd2ab61b8bcfe8c0b42c7d6b90cdcf.tar.zst bun-92f2d9ab27fd2ab61b8bcfe8c0b42c7d6b90cdcf.zip |
Does not fix #4622 (#5452)
* Fixes #4622
* cleanup
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
-rw-r--r-- | src/bun.js/bindings/napi.cpp | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/src/bun.js/bindings/napi.cpp b/src/bun.js/bindings/napi.cpp index 72ca50dcb..e500fae38 100644 --- a/src/bun.js/bindings/napi.cpp +++ b/src/bun.js/bindings/napi.cpp @@ -317,6 +317,10 @@ static void defineNapiProperty(Zig::GlobalObject* globalObject, JSC::JSObject* t extern "C" napi_status napi_set_property(napi_env env, napi_value target, napi_value key, napi_value value) { + if (UNLIKELY(!env || !target || !key)) { + return napi_invalid_arg; + } + auto globalObject = toJS(env); auto& vm = globalObject->vm(); auto* object = toJS(target).getObject(); @@ -327,7 +331,8 @@ extern "C" napi_status napi_set_property(napi_env env, napi_value target, auto keyProp = toJS(key); auto scope = DECLARE_CATCH_SCOPE(vm); - object->putDirect(globalObject->vm(), keyProp.toPropertyKey(globalObject), toJS(value)); + PutPropertySlot slot(object, true); + object->put(object, globalObject, keyProp.toPropertyKey(globalObject), toJS(value), slot); RETURN_IF_EXCEPTION(scope, napi_generic_failure); scope.clearException(); @@ -336,6 +341,10 @@ extern "C" napi_status napi_set_property(napi_env env, napi_value target, extern "C" napi_status napi_has_property(napi_env env, napi_value object, napi_value key, bool* result) { + if (UNLIKELY(!object || !env)) { + return napi_invalid_arg; + } + auto globalObject = toJS(env); auto& vm = globalObject->vm(); auto* target = toJS(object).getObject(); @@ -345,8 +354,7 @@ extern "C" napi_status napi_has_property(napi_env env, napi_value object, auto keyProp = toJS(key); auto scope = DECLARE_CATCH_SCOPE(vm); - // TODO: use the slot directly? - *result = !!target->getIfPropertyExists(globalObject, keyProp.toPropertyKey(globalObject)); + *result = target->hasProperty(globalObject, keyProp.toPropertyKey(globalObject)); RETURN_IF_EXCEPTION(scope, napi_generic_failure); scope.clearException(); @@ -1028,7 +1036,7 @@ extern "C" napi_status napi_fatal_exception(napi_env env, napi_value err) { auto globalObject = toJS(env); - JSC::JSValue value = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(err)); + JSC::JSValue value = toJS(err); JSC::JSObject* obj = value.getObject(); if (UNLIKELY(obj == nullptr || !obj->isErrorInstance())) { return napi_invalid_arg; @@ -1045,7 +1053,7 @@ extern "C" napi_status napi_throw(napi_env env, napi_value error) JSC::VM& vm = globalObject->vm(); auto throwScope = DECLARE_THROW_SCOPE(vm); - JSC::JSValue value = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(error)); + JSC::JSValue value = toJS(error); if (value) { JSC::throwException(globalObject, throwScope, value); } else { @@ -1131,8 +1139,8 @@ extern "C" napi_status napi_create_type_error(napi_env env, napi_value code, Zig::GlobalObject* globalObject = toJS(env); JSC::VM& vm = globalObject->vm(); - JSC::JSValue codeValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(code)); - JSC::JSValue messageValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(msg)); + JSC::JSValue codeValue = toJS(code); + JSC::JSValue messageValue = toJS(msg); auto error = JSC::createTypeError(globalObject, messageValue.toWTFString(globalObject)); if (codeValue) { @@ -1150,10 +1158,11 @@ extern "C" napi_status napi_create_error(napi_env env, napi_value code, Zig::GlobalObject* globalObject = toJS(env); JSC::VM& vm = globalObject->vm(); - JSC::JSValue codeValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(code)); - JSC::JSValue messageValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(msg)); + JSC::JSValue codeValue = toJS(code); + JSC::JSValue messageValue = toJS(msg); - auto error = JSC::createError(globalObject, messageValue.toWTFString(globalObject)); + WTF::String message = messageValue.toWTFString(globalObject); + auto* error = JSC::createError(globalObject, message); if (codeValue) { error->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), codeValue, 0); } @@ -1557,15 +1566,15 @@ extern "C" napi_status napi_define_class(napi_env env, extern "C" napi_status napi_coerce_to_string(napi_env env, napi_value value, napi_value* result) { - if (UNLIKELY(result == nullptr)) { + if (UNLIKELY(result == nullptr || value == nullptr || env == nullptr)) { return napi_invalid_arg; } Zig::GlobalObject* globalObject = toJS(env); JSC::VM& vm = globalObject->vm(); - auto scope = DECLARE_CATCH_SCOPE(vm); - JSC::JSValue jsValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(value)); + auto scope = DECLARE_THROW_SCOPE(vm); + JSC::JSValue jsValue = toJS(value); JSC::EnsureStillAliveScope ensureStillAlive(jsValue); // .toString() can throw @@ -1588,7 +1597,7 @@ extern "C" napi_status napi_get_property_names(napi_env env, napi_value object, Zig::GlobalObject* globalObject = toJS(env); JSC::VM& vm = globalObject->vm(); - JSC::JSValue jsValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(object)); + JSC::JSValue jsValue = toJS(object); if (!jsValue || !jsValue.isObject()) { return napi_invalid_arg; } @@ -1717,7 +1726,7 @@ extern "C" napi_status napi_get_element(napi_env env, napi_value objectValue, uint32_t index, napi_value* result) { JSValue jsValue = toJS(objectValue); - if (!jsValue || !jsValue.isObject()) { + if (UNLIKELY(!env || !jsValue || !jsValue.isObject())) { return napi_invalid_arg; } @@ -1737,7 +1746,7 @@ extern "C" napi_status napi_get_element(napi_env env, napi_value objectValue, extern "C" napi_status napi_create_object(napi_env env, napi_value* result) { - if (UNLIKELY(result == nullptr)) { + if (UNLIKELY(result == nullptr || env == nullptr)) { return napi_invalid_arg; } |