AK+LibJS: Allow {TRY,MUST}{,_OR_THROW_OOM} on list-initializers

List initializers may contain commas without surrounding parenthesis,
causing them to be passed as multiple macro arguments.
This commit is contained in:
Jonne Ransijn 2024-11-17 11:21:20 +01:00
parent 079edffd47
commit a8094f3333
No known key found for this signature in database
GPG key ID: 49DC70026D2C578C
2 changed files with 8 additions and 8 deletions

View file

@ -21,11 +21,11 @@
// from a fallible expression. This will not do what you want; the statement expression // from a fallible expression. This will not do what you want; the statement expression
// will create a copy regardless, so it is explicitly disallowed. // will create a copy regardless, so it is explicitly disallowed.
#define TRY(expression) \ #define TRY(...) \
({ \ ({ \
/* Ignore -Wshadow to allow nesting the macro. */ \ /* Ignore -Wshadow to allow nesting the macro. */ \
AK_IGNORE_DIAGNOSTIC("-Wshadow", \ AK_IGNORE_DIAGNOSTIC("-Wshadow", \
auto&& _temporary_result = (expression)); \ auto&& _temporary_result = (__VA_ARGS__)); \
static_assert(!::AK::Detail::IsLvalueReference<decltype(_temporary_result.release_value())>, \ static_assert(!::AK::Detail::IsLvalueReference<decltype(_temporary_result.release_value())>, \
"Do not return a reference from a fallible expression"); \ "Do not return a reference from a fallible expression"); \
if (_temporary_result.is_error()) [[unlikely]] \ if (_temporary_result.is_error()) [[unlikely]] \
@ -33,11 +33,11 @@
_temporary_result.release_value(); \ _temporary_result.release_value(); \
}) })
#define MUST(expression) \ #define MUST(...) \
({ \ ({ \
/* Ignore -Wshadow to allow nesting the macro. */ \ /* Ignore -Wshadow to allow nesting the macro. */ \
AK_IGNORE_DIAGNOSTIC("-Wshadow", \ AK_IGNORE_DIAGNOSTIC("-Wshadow", \
auto&& _temporary_result = (expression)); \ auto&& _temporary_result = (__VA_ARGS__)); \
static_assert(!::AK::Detail::IsLvalueReference<decltype(_temporary_result.release_value())>, \ static_assert(!::AK::Detail::IsLvalueReference<decltype(_temporary_result.release_value())>, \
"Do not return a reference from a fallible expression"); \ "Do not return a reference from a fallible expression"); \
VERIFY(!_temporary_result.is_error()); \ VERIFY(!_temporary_result.is_error()); \

View file

@ -17,11 +17,11 @@
namespace JS { namespace JS {
#define TRY_OR_THROW_OOM(vm, expression) \ #define TRY_OR_THROW_OOM(vm, ...) \
({ \ ({ \
/* Ignore -Wshadow to allow nesting the macro. */ \ /* Ignore -Wshadow to allow nesting the macro. */ \
AK_IGNORE_DIAGNOSTIC("-Wshadow", \ AK_IGNORE_DIAGNOSTIC("-Wshadow", \
auto&& _temporary_result = (expression)); \ auto&& _temporary_result = (__VA_ARGS__)); \
if (_temporary_result.is_error()) { \ if (_temporary_result.is_error()) { \
VERIFY(_temporary_result.error().code() == ENOMEM); \ VERIFY(_temporary_result.error().code() == ENOMEM); \
return (vm).throw_completion<JS::InternalError>((vm).error_message(::JS::VM::ErrorMessage::OutOfMemory)); \ return (vm).throw_completion<JS::InternalError>((vm).error_message(::JS::VM::ErrorMessage::OutOfMemory)); \
@ -31,11 +31,11 @@ namespace JS {
_temporary_result.release_value(); \ _temporary_result.release_value(); \
}) })
#define MUST_OR_THROW_OOM(expression) \ #define MUST_OR_THROW_OOM(...) \
({ \ ({ \
/* Ignore -Wshadow to allow nesting the macro. */ \ /* Ignore -Wshadow to allow nesting the macro. */ \
AK_IGNORE_DIAGNOSTIC("-Wshadow", \ AK_IGNORE_DIAGNOSTIC("-Wshadow", \
auto&& _temporary_result = (expression)); \ auto&& _temporary_result = (__VA_ARGS__)); \
if (_temporary_result.is_error()) { \ if (_temporary_result.is_error()) { \
auto _completion = _temporary_result.release_error(); \ auto _completion = _temporary_result.release_error(); \
\ \