Fix napi property methods on non-objects (#14935)

This commit is contained in:
190n
2024-10-31 21:02:26 -07:00
committed by Ben Grant
parent 7fab6701e5
commit 08116e43f4
2 changed files with 41 additions and 22 deletions

View File

@@ -603,7 +603,10 @@ extern "C" napi_status napi_set_property(napi_env env, napi_value target,
NAPI_RETURN_EARLY_IF_FALSE(env, targetValue.isObject(), napi_object_expected);
auto globalObject = toJS(env);
auto* object = targetValue.getObject();
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* object = targetValue.toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
auto keyProp = toJS(key);
@@ -666,12 +669,17 @@ extern "C" napi_status napi_has_property(napi_env env, napi_value object,
NAPI_CHECK_ARG(env, key);
auto globalObject = toJS(env);
auto* target = toJS(object).getObject();
NAPI_RETURN_EARLY_IF_FALSE(env, target, napi_object_expected);
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
auto keyProp = toJS(key);
*result = target->hasProperty(globalObject, keyProp.toPropertyKey(globalObject));
NAPI_RETURN_SUCCESS_UNLESS_EXCEPTION(env);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
scope.clearException();
return napi_ok;
}
extern "C" napi_status napi_get_date_value(napi_env env, napi_value value, double* result)
@@ -698,9 +706,11 @@ extern "C" napi_status napi_get_property(napi_env env, napi_value object,
NAPI_CHECK_ARG(env, result);
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* target = toJS(object).getObject();
NAPI_RETURN_EARLY_IF_FALSE(env, target, napi_object_expected);
auto* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
JSC::EnsureStillAliveScope ensureAlive(target);
auto keyProp = toJS(key);
@@ -717,13 +727,11 @@ extern "C" napi_status napi_delete_property(napi_env env, napi_value object,
NAPI_CHECK_ARG(env, key);
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto* target = toJS(object).getObject();
NAPI_RETURN_EARLY_IF_FALSE(env, target, napi_object_expected);
auto* target = toJS(object).toObject(globalObject);
NAPI_RETURN_IF_EXCEPTION(env);
auto keyProp = toJS(key);
auto scope = DECLARE_CATCH_SCOPE(vm);
auto deleteResult = target->deleteProperty(globalObject, keyProp.toPropertyKey(globalObject));
NAPI_RETURN_IF_EXCEPTION(env);
@@ -743,13 +751,18 @@ extern "C" napi_status napi_has_own_property(napi_env env, napi_value object,
NAPI_CHECK_ARG(env, result);
auto globalObject = toJS(env);
auto* target = toJS(object).getObject();
NAPI_RETURN_EARLY_IF_FALSE(env, target, napi_object_expected);
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
auto keyProp = toJS(key);
NAPI_RETURN_EARLY_IF_FALSE(env, keyProp.isString() || keyProp.isSymbol(), napi_name_expected);
*result = target->hasOwnProperty(globalObject, JSC::PropertyName(keyProp.toPropertyKey(globalObject)));
NAPI_RETURN_SUCCESS_UNLESS_EXCEPTION(env);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
scope.clearException();
return napi_ok;
}
extern "C" napi_status napi_set_named_property(napi_env env, napi_value object,
@@ -763,11 +776,11 @@ extern "C" napi_status napi_set_named_property(napi_env env, napi_value object,
NAPI_RETURN_EARLY_IF_FALSE(env, *utf8name, napi_invalid_arg);
NAPI_CHECK_ARG(env, value);
auto target = toJS(object).getObject();
NAPI_RETURN_EARLY_IF_FALSE(env, target, napi_object_expected);
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
JSValue jsValue = toJS(value);
JSC::EnsureStillAliveScope ensureAlive(jsValue);
@@ -833,13 +846,13 @@ extern "C" napi_status napi_has_named_property(napi_env env, napi_value object,
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
JSObject* target = toJS(object).getObject();
NAPI_RETURN_EARLY_IF_FALSE(env, target, napi_object_expected);
JSObject* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
PROPERTY_NAME_FROM_UTF8(name);
auto scope = DECLARE_CATCH_SCOPE(vm);
PropertySlot slot(target, PropertySlot::InternalMethodType::HasProperty);
*result = target->getPropertySlot(globalObject, name, slot);
NAPI_RETURN_SUCCESS_UNLESS_EXCEPTION(env);
@@ -856,8 +869,9 @@ extern "C" napi_status napi_get_named_property(napi_env env, napi_value object,
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
JSObject* target = toJS(object).getObject();
NAPI_RETURN_EARLY_IF_FALSE(env, target, napi_object_expected);
auto scope = DECLARE_CATCH_SCOPE(vm);
JSObject* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
PROPERTY_NAME_FROM_UTF8(name);

View File

@@ -79,6 +79,9 @@ nativeTests.test_get_property = () => {
},
},
),
5,
"hello",
// TODO(@190n) test null and undefined here on the napi fix branch
];
const keys = [
"foo",
@@ -92,6 +95,8 @@ nativeTests.test_get_property = () => {
throw new Error("Symbol.toPrimitive");
},
},
"toString",
"slice",
];
for (const object of objects) {