/* 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/Likely.h" #include "mozilla/Result.h" // IWYU pragma: keep(used by macro MOZ_TRY) /** * 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` and is called in a * function that returns `Result`. * * [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(); \ }) #endif // mozilla_Try_h