Source code
Revision control
Copy as Markdown
Other Tools
/* -*- 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
#ifndef mozilla_Try_h
#define mozilla_Try_h
#include "mozilla/Likely.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>`.
*
*/
#define MOZ_TRY(expr) \
__extension__({ \
auto mozTryVarTempResult = ::mozilla::ToResult(expr); \
if (MOZ_UNLIKELY(mozTryVarTempResult.isErr())) { \
return mozTryVarTempResult.propagateErr(); \
} \
mozTryVarTempResult.unwrap(); \
})
#endif // mozilla_Try_h