Skip to content

Commit 92f2d9a

Browse files
Does not fix #4622 (#5452)
* Fixes #4622 * cleanup --------- Co-authored-by: Jarred Sumner <[email protected]>
1 parent 56c471a commit 92f2d9a

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

src/bun.js/bindings/napi.cpp

+25-16
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,10 @@ static void defineNapiProperty(Zig::GlobalObject* globalObject, JSC::JSObject* t
317317
extern "C" napi_status napi_set_property(napi_env env, napi_value target,
318318
napi_value key, napi_value value)
319319
{
320+
if (UNLIKELY(!env || !target || !key)) {
321+
return napi_invalid_arg;
322+
}
323+
320324
auto globalObject = toJS(env);
321325
auto& vm = globalObject->vm();
322326
auto* object = toJS(target).getObject();
@@ -327,7 +331,8 @@ extern "C" napi_status napi_set_property(napi_env env, napi_value target,
327331
auto keyProp = toJS(key);
328332

329333
auto scope = DECLARE_CATCH_SCOPE(vm);
330-
object->putDirect(globalObject->vm(), keyProp.toPropertyKey(globalObject), toJS(value));
334+
PutPropertySlot slot(object, true);
335+
object->put(object, globalObject, keyProp.toPropertyKey(globalObject), toJS(value), slot);
331336
RETURN_IF_EXCEPTION(scope, napi_generic_failure);
332337

333338
scope.clearException();
@@ -336,6 +341,10 @@ extern "C" napi_status napi_set_property(napi_env env, napi_value target,
336341
extern "C" napi_status napi_has_property(napi_env env, napi_value object,
337342
napi_value key, bool* result)
338343
{
344+
if (UNLIKELY(!object || !env)) {
345+
return napi_invalid_arg;
346+
}
347+
339348
auto globalObject = toJS(env);
340349
auto& vm = globalObject->vm();
341350
auto* target = toJS(object).getObject();
@@ -345,8 +354,7 @@ extern "C" napi_status napi_has_property(napi_env env, napi_value object,
345354

346355
auto keyProp = toJS(key);
347356
auto scope = DECLARE_CATCH_SCOPE(vm);
348-
// TODO: use the slot directly?
349-
*result = !!target->getIfPropertyExists(globalObject, keyProp.toPropertyKey(globalObject));
357+
*result = target->hasProperty(globalObject, keyProp.toPropertyKey(globalObject));
350358
RETURN_IF_EXCEPTION(scope, napi_generic_failure);
351359

352360
scope.clearException();
@@ -1028,7 +1036,7 @@ extern "C" napi_status napi_fatal_exception(napi_env env,
10281036
napi_value err)
10291037
{
10301038
auto globalObject = toJS(env);
1031-
JSC::JSValue value = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(err));
1039+
JSC::JSValue value = toJS(err);
10321040
JSC::JSObject* obj = value.getObject();
10331041
if (UNLIKELY(obj == nullptr || !obj->isErrorInstance())) {
10341042
return napi_invalid_arg;
@@ -1045,7 +1053,7 @@ extern "C" napi_status napi_throw(napi_env env, napi_value error)
10451053
JSC::VM& vm = globalObject->vm();
10461054
auto throwScope = DECLARE_THROW_SCOPE(vm);
10471055

1048-
JSC::JSValue value = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(error));
1056+
JSC::JSValue value = toJS(error);
10491057
if (value) {
10501058
JSC::throwException(globalObject, throwScope, value);
10511059
} else {
@@ -1131,8 +1139,8 @@ extern "C" napi_status napi_create_type_error(napi_env env, napi_value code,
11311139
Zig::GlobalObject* globalObject = toJS(env);
11321140
JSC::VM& vm = globalObject->vm();
11331141

1134-
JSC::JSValue codeValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(code));
1135-
JSC::JSValue messageValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(msg));
1142+
JSC::JSValue codeValue = toJS(code);
1143+
JSC::JSValue messageValue = toJS(msg);
11361144

11371145
auto error = JSC::createTypeError(globalObject, messageValue.toWTFString(globalObject));
11381146
if (codeValue) {
@@ -1150,10 +1158,11 @@ extern "C" napi_status napi_create_error(napi_env env, napi_value code,
11501158
Zig::GlobalObject* globalObject = toJS(env);
11511159
JSC::VM& vm = globalObject->vm();
11521160

1153-
JSC::JSValue codeValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(code));
1154-
JSC::JSValue messageValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(msg));
1161+
JSC::JSValue codeValue = toJS(code);
1162+
JSC::JSValue messageValue = toJS(msg);
11551163

1156-
auto error = JSC::createError(globalObject, messageValue.toWTFString(globalObject));
1164+
WTF::String message = messageValue.toWTFString(globalObject);
1165+
auto* error = JSC::createError(globalObject, message);
11571166
if (codeValue) {
11581167
error->putDirect(vm, WebCore::builtinNames(vm).codePublicName(), codeValue, 0);
11591168
}
@@ -1557,15 +1566,15 @@ extern "C" napi_status napi_define_class(napi_env env,
15571566
extern "C" napi_status napi_coerce_to_string(napi_env env, napi_value value,
15581567
napi_value* result)
15591568
{
1560-
if (UNLIKELY(result == nullptr)) {
1569+
if (UNLIKELY(result == nullptr || value == nullptr || env == nullptr)) {
15611570
return napi_invalid_arg;
15621571
}
15631572

15641573
Zig::GlobalObject* globalObject = toJS(env);
15651574
JSC::VM& vm = globalObject->vm();
15661575

1567-
auto scope = DECLARE_CATCH_SCOPE(vm);
1568-
JSC::JSValue jsValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(value));
1576+
auto scope = DECLARE_THROW_SCOPE(vm);
1577+
JSC::JSValue jsValue = toJS(value);
15691578
JSC::EnsureStillAliveScope ensureStillAlive(jsValue);
15701579

15711580
// .toString() can throw
@@ -1588,7 +1597,7 @@ extern "C" napi_status napi_get_property_names(napi_env env, napi_value object,
15881597
Zig::GlobalObject* globalObject = toJS(env);
15891598
JSC::VM& vm = globalObject->vm();
15901599

1591-
JSC::JSValue jsValue = JSC::JSValue::decode(reinterpret_cast<JSC::EncodedJSValue>(object));
1600+
JSC::JSValue jsValue = toJS(object);
15921601
if (!jsValue || !jsValue.isObject()) {
15931602
return napi_invalid_arg;
15941603
}
@@ -1717,7 +1726,7 @@ extern "C" napi_status napi_get_element(napi_env env, napi_value objectValue,
17171726
uint32_t index, napi_value* result)
17181727
{
17191728
JSValue jsValue = toJS(objectValue);
1720-
if (!jsValue || !jsValue.isObject()) {
1729+
if (UNLIKELY(!env || !jsValue || !jsValue.isObject())) {
17211730
return napi_invalid_arg;
17221731
}
17231732

@@ -1737,7 +1746,7 @@ extern "C" napi_status napi_get_element(napi_env env, napi_value objectValue,
17371746
extern "C" napi_status napi_create_object(napi_env env, napi_value* result)
17381747
{
17391748

1740-
if (UNLIKELY(result == nullptr)) {
1749+
if (UNLIKELY(result == nullptr || env == nullptr)) {
17411750
return napi_invalid_arg;
17421751
}
17431752

0 commit comments

Comments
 (0)