NS_ENSURE_STATE(state)

NS_ENSURE_TRUE(state, NS_ERROR_UNEXPECTED)

NS_ENSURE_SUCCESS(res,ret)

PR_BEGIN_MACRO nsresult __rv = res;
if (NS_FAILED(__rv)) {
  NS_ENSURE_SUCCESS_BODY(res, ret) return ret;
}
PR_END_MACRO

NS_ENSURE_FINITE3(f1,f2,f3,rv)

if (!NS_FloatIsFinite((f1) + (f2) + (f3))) {
  return (rv);
}

NS_ENSURE_FINITE4(f1,f2,f3,f4,rv)

if (!NS_FloatIsFinite((f1) + (f2) + (f3) + (f4))) {
  return (rv);
}

NS_ENSURE_FINITE5(f1,f2,f3,f4,f5,rv)

if (!NS_FloatIsFinite((f1) + (f2) + (f3) + (f4) + (f5))) {
  return (rv);
}

NS_ENSURE_SUCCESS_BODY(res,ret)

NS_WARNING("NS_ENSURE_SUCCESS("
#res ", " #ret ") failed");

NS_ENSURE_FINITE2(f1,f2,rv)

if (!NS_FloatIsFinite((f1) + (f2))) {
  return (rv);
}

NS_ENSURE_FINITE6(f1,f2,f3,f4,f5,f6,rv)

if (!NS_FloatIsFinite((f1) + (f2) + (f3) + (f4) + (f5) + (f6))) {
  return (rv);
}

NS_ENSURE_FINITE(f,rv)

if (!NS_FloatIsFinite(f)) {
  return (rv);
}

NS_ENSURE_ARG(arg)

NS_ENSURE_TRUE(arg, NS_ERROR_INVALID_ARG)

NS_ENSURE_ARG_RANGE(arg,min,max)

NS_ENSURE_TRUE(((arg) >= min) && ((arg) <= max), NS_ERROR_INVALID_ARG)

NS_ENSURE_PROPER_AGGREGATION(outer,iid)

NS_ENSURE_FALSE(outer
		&& !iid.Equals(NS_GET_IID(nsISupports)), NS_ERROR_INVALID_ARG)

NS_ENSURE_NO_AGGREGATION(outer)

NS_ENSURE_FALSE(outer, NS_ERROR_NO_AGGREGATION)

NS_ENSURE_TRUE(x,ret)

PR_BEGIN_MACRO if (NS_UNLIKELY(!(x))) {
  NS_WARNING("NS_ENSURE_TRUE("
#x ") failed"); return ret; } PR_END_MACRO

NS_ENSURE_ARG_MAX(arg,max)

NS_ENSURE_TRUE((arg) <= max, NS_ERROR_INVALID_ARG)

NS_ENSURE_ARG_MIN(arg,min)

NS_ENSURE_TRUE((arg) >= min, NS_ERROR_INVALID_ARG)

NS_ENSURE_ARG_POINTER(arg)

NS_ENSURE_TRUE(arg, NS_ERROR_INVALID_POINTER)

NS_ENSURE_FALSE(x,ret)

NS_ENSURE_TRUE(!(x), ret)

NS_ENSURE_SUCCESS_LOG(res,ret)

NS_ENSURE_TRUE_LOG(NS_SUCCEEDED(res), ret)

NS_ENSURE_TRUE_LOG(x,ret)

PR_BEGIN_MACRO if (NS_UNLIKELY(!(x))) {
  NS_WARNING("NS_ENSURE_TRUE("
#x ") failed"); gLogConsoleErrors = PR_TRUE; return ret; } PR_END_MACRO

NS_ENSURE_VALIDCALL

if (!NS_IsMainThread()) {
  NS_ERROR("Using observer service off the main thread!");
  return NS_ERROR_UNEXPECTED;
}
if (mShuttingDown) {
  NS_ERROR("Using observer service after XPCOM shutdown!");
  return NS_ERROR_ILLEGAL_DURING_SHUTDOWN;
}

NS_ENSURE_NATIVE_MATRIX(obj,retval)

{
  nsresult        rv;
  if (retval)
    *retval = nsnull;
  nsCOMPtr < nsISVGValue > val = do_QueryInterface(obj, &rv);
  NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_SVG_WRONG_TYPE_ERR);
}

NS_ENSURE_A11Y_SUCCESS(res,ret)

PR_BEGIN_MACRO nsresult __rv = res;
if (NS_FAILED(__rv)) {
  NS_ENSURE_SUCCESS_BODY(res, ret) return ret;
}
if (__rv == NS_OK_DEFUNCT_OBJECT)
  return ret;
PR_END_MACRO

NS_ENSURE_NATIVE_PATH_SEG(obj,retval)

{
  nsresult        rv;
  if (retval)
    *retval = nsnull;
  nsCOMPtr < nsSVGPathSeg > path = do_QueryInterface(obj, &rv);
  NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_SVG_WRONG_TYPE_ERR);
}

NS_ENSURE_NATIVE_TRANSFORM(obj,retval)

{
  nsresult        rv;
  if (retval)
    *retval = nsnull;
  nsCOMPtr < nsISVGValue > transform = do_QueryInterface(obj, &rv);
  NS_ENSURE_SUCCESS(rv, NS_ERROR_DOM_SVG_WRONG_TYPE_ERR);
}

NS_ENSURE_SUBMIT_SUCCESS(rv)

if (NS_FAILED(rv)) {
  ForgetCurrentSubmission();
  return rv;
}