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

This commit is contained in:
190n
2024-10-31 21:02:26 -07:00
committed by GitHub
parent 62881ee36b
commit 71fdb59918
2 changed files with 35 additions and 43 deletions

View File

@@ -598,15 +598,16 @@ extern "C" napi_status napi_set_property(napi_env env, napi_value target,
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto* object = targetValue.getObject();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* object = targetValue.toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
auto keyProp = toJS(key);
auto scope = DECLARE_CATCH_SCOPE(vm);
PutPropertySlot slot(object, false);
Identifier identifier = keyProp.toPropertyKey(globalObject);
RETURN_IF_EXCEPTION(scope, napi_generic_failure);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
JSValue jsValue = toJS(value);
@@ -637,15 +638,13 @@ extern "C" napi_status napi_has_property(napi_env env, napi_value object,
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto* target = toJS(object).getObject();
if (!target) {
return napi_object_expected;
}
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
auto keyProp = toJS(key);
auto scope = DECLARE_CATCH_SCOPE(vm);
*result = target->hasProperty(globalObject, keyProp.toPropertyKey(globalObject));
RETURN_IF_EXCEPTION(scope, napi_generic_failure);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
scope.clearException();
return napi_ok;
@@ -693,16 +692,14 @@ extern "C" napi_status napi_get_property(napi_env env, napi_value object,
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* target = toJS(object).getObject();
if (!target) {
return napi_object_expected;
}
auto* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
JSC::EnsureStillAliveScope ensureAlive(target);
auto keyProp = toJS(key);
JSC::EnsureStillAliveScope ensureAlive2(keyProp);
auto scope = DECLARE_CATCH_SCOPE(vm);
*result = toNapi(target->get(globalObject, keyProp.toPropertyKey(globalObject)), globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
@@ -717,16 +714,14 @@ extern "C" napi_status napi_delete_property(napi_env env, napi_value object,
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* target = toJS(object).getObject();
if (!target) {
return napi_object_expected;
}
auto* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
auto keyProp = toJS(key);
auto scope = DECLARE_CATCH_SCOPE(vm);
auto deleteResult = target->deleteProperty(globalObject, keyProp.toPropertyKey(globalObject));
RETURN_IF_EXCEPTION(scope, napi_generic_failure);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
if (LIKELY(result)) {
*result = deleteResult;
@@ -746,16 +741,14 @@ extern "C" napi_status napi_has_own_property(napi_env env, napi_value object,
auto globalObject = toJS(env);
auto& vm = globalObject->vm();
auto scope = DECLARE_CATCH_SCOPE(vm);
auto* target = toJS(object).getObject();
if (!target) {
return napi_object_expected;
}
auto* target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
auto keyProp = toJS(key);
auto scope = DECLARE_CATCH_SCOPE(vm);
*result = target->hasOwnProperty(globalObject, JSC::PropertyName(keyProp.toPropertyKey(globalObject)));
RETURN_IF_EXCEPTION(scope, napi_generic_failure);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
scope.clearException();
return napi_ok;
@@ -768,11 +761,10 @@ extern "C" napi_status napi_set_named_property(napi_env env, napi_value object,
NAPI_PREMABLE
auto globalObject = toJS(env);
auto target = toJS(object).getObject();
auto& vm = globalObject->vm();
if (UNLIKELY(!target)) {
return napi_object_expected;
}
auto scope = DECLARE_CATCH_SCOPE(vm);
auto target = toJS(object).toObject(globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
if (UNLIKELY(utf8name == nullptr || !*utf8name || !value)) {
return napi_invalid_arg;
@@ -785,11 +777,10 @@ extern "C" napi_status napi_set_named_property(napi_env env, napi_value object,
auto nameStr = WTF::String::fromUTF8({ utf8name, strlen(utf8name) });
auto identifier = JSC::Identifier::fromString(vm, WTFMove(nameStr));
auto scope = DECLARE_CATCH_SCOPE(vm);
PutPropertySlot slot(target, true);
target->put(target, globalObject, identifier, jsValue, slot);
RETURN_IF_EXCEPTION(scope, napi_generic_failure);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
scope.clearException();
return napi_ok;
}
@@ -851,18 +842,16 @@ 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();
if (UNLIKELY(!target)) {
return 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);
RETURN_IF_EXCEPTION(scope, napi_generic_failure);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);
scope.clearException();
return napi_ok;
@@ -880,14 +869,12 @@ 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();
if (UNLIKELY(!target)) {
return 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);
auto scope = DECLARE_CATCH_SCOPE(vm);
*result = toNapi(target->get(globalObject, name), globalObject);
RETURN_IF_EXCEPTION(scope, napi_pending_exception);

View File

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