Files
tubestation/mfbt/Try.h
Jan-Niklas Jaeschke 0a20c29367 Bug 1935816 - Make MOZ_TRY() macro return its success value instead of discarding it. r=glandium
This macro allows to write `mozilla::Result`-based code
similar to the rust try macro by using
gcc Statement Expressions [0],
which is a non-standard extension to gcc and clang.
This macro is used as an rvalue, while still returning early for error cases:

```
// Result<SuccessValue, E> Func();
Result<T, E> Bar() {
  SuccessValue val = MOZ_TRY(Func());
  // ...
}
```

This macro can only be used if `SuccessValue` is movable.

[0]: https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

Differential Revision: https://phabricator.services.mozilla.com/D235415
2025-05-09 09:27:55 +00:00

47 lines
1.8 KiB
C

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
* vim: set ts=8 sts=2 et sw=2 tw=80:
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_Try_h
#define mozilla_Try_h
#include "mozilla/Result.h"
/**
* MOZ_TRY(expr) is the C++ equivalent of Rust's `target = try!(expr);`, using
* gcc's statement expressions [0]. First, it evaluates expr, which must produce
* a Result value. On success, the result's success value is 'returned' as
* rvalue. On error, immediately returns the error result. This pattern allows
* to directly assign the success value:
*
* ```
* SuccessValue val = MOZ_TRY(Func());
* ```
*
* Where `Func()` returns a `Result<SuccessValue, E>` and is called in a
* function that returns `Result<T, E>`.
*
* [0]: https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html
*/
#define MOZ_TRY(expr) \
__extension__({ \
auto mozTryVarTempResult = ::mozilla::ToResult(expr); \
if (MOZ_UNLIKELY(mozTryVarTempResult.isErr())) { \
return mozTryVarTempResult.propagateErr(); \
} \
mozTryVarTempResult.unwrap(); \
})
/**
* MOZ_TRY_VAR(target, expr) is the C++ equivalent of Rust's `target =
* try!(expr);`. First, it evaluates expr, which must produce a Result value. On
* success, the result's success value is assigned to target. On error,
* immediately returns the error result. |target| must be an lvalue.
*
* This macro is obsolete and its usages should be replaced with `MOZ_TRY`.
*/
#define MOZ_TRY_VAR(target, expr) (target) = MOZ_TRY(expr);
#endif // mozilla_Try_h