assert.h revision ea1e119d89f21a5c3825ae16876429d69501468a
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/** @file
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * MS COM / XPCOM Abstraction Layer:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Assertion macros for COM/XPCOM
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/*
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * available from http://www.virtualbox.org. This file is free software;
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * you can redistribute it and/or modify it under the terms of the GNU
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * General Public License (GPL) as published by the Free Software
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * The contents of this file may alternatively be used under the terms
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * of the Common Development and Distribution License Version 1.0
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * VirtualBox OSE distribution, in which case the provisions of the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * CDDL are applicable instead of those of the GPL.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * You may elect to license modified versions of this file under the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * terms and conditions of either the GPL or the CDDL or both.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * additional information or have any questions.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#ifndef ___VBox_com_assert_h
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define ___VBox_com_assert_h
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#include <iprt/assert.h>
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Asserts that the COM result code is succeeded in strict builds.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * In non-strict builds the result code will be NOREF'ed to kill compiler warnings.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define AssertComRC(rc) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync do { AssertMsg (SUCCEEDED (rc), ("COM RC = %Rhrc (0x%08X)\n", rc, rc)); NOREF (rc); } while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * A special version of AssertComRC that returns the given expression
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * if the result code is failed.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param ret the expression to return
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define AssertComRCReturn(rc, ret) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgReturn (SUCCEEDED (rc), ("COM RC = %Rhrc (0x%08X)\n", rc, rc), ret)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * A special version of AssertComRC that returns the given result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * if it is failed.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param ret the expression to return
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define AssertComRCReturnRC(rc) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgReturn (SUCCEEDED (rc), ("COM RC = %Rhrc (0x%08X)\n", rc, rc), rc)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * A special version of AssertComRC that returns if the result code is failed.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param ret the expression to return
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define AssertComRCReturnVoid(rc) \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync AssertMsgReturnVoid (SUCCEEDED (rc), ("COM RC = %Rhrc (0x%08X)\n", rc, rc))
a2544ef163bb615c50680a75e0958e2eb801727avboxsync
a2544ef163bb615c50680a75e0958e2eb801727avboxsync/**
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * A special version of AssertComRC that evaluates the given expression and
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * breaks if the result code is failed.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync *
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param rc COM result code
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param eval the expression to evaluate
a2544ef163bb615c50680a75e0958e2eb801727avboxsync */
a2544ef163bb615c50680a75e0958e2eb801727avboxsync#define AssertComRCBreak(rc, eval) \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync if (!SUCCEEDED (rc)) { AssertComRC (rc); eval; break; } else do {} while (0)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync
a2544ef163bb615c50680a75e0958e2eb801727avboxsync/**
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * A special version of AssertComRC that evaluates the given expression and
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * throws it if the result code is failed.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync *
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param rc COM result code
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param eval the expression to throw
a2544ef163bb615c50680a75e0958e2eb801727avboxsync */
a2544ef163bb615c50680a75e0958e2eb801727avboxsync#define AssertComRCThrow(rc, eval) \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync if (!SUCCEEDED (rc)) { AssertComRC (rc); throw (eval); } else do {} while (0)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync
a2544ef163bb615c50680a75e0958e2eb801727avboxsync/**
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * A special version of AssertComRC that just breaks if the result code is
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * failed.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync *
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param rc COM result code
a2544ef163bb615c50680a75e0958e2eb801727avboxsync */
a2544ef163bb615c50680a75e0958e2eb801727avboxsync#define AssertComRCBreakRC(rc) \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync if (!SUCCEEDED (rc)) { AssertComRC (rc); break; } else do {} while (0)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync
a2544ef163bb615c50680a75e0958e2eb801727avboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * A special version of AssertComRC that just throws @a rc if the result code is
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * failed.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync *
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * @param rc COM result code
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define AssertComRCThrowRC(rc) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!SUCCEEDED (rc)) { AssertComRC (rc); throw rc; } else do {} while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Checks whether the given COM result code is successful.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * If not, executes the return statement with this result code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define CheckComRCReturnRC(rc) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!SUCCEEDED (rc)) { return (rc); } else do {} while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Checks whether the given COM result code is successful.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * If not, executes the break statement.
dce1a38a7e4bfc36180d68e76bae78acc26c9565vboxsync *
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * @param rc COM result code
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define CheckComRCBreakRC(rc) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (!SUCCEEDED (rc)) { break; } else do {} while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Checks whether the given COM result code is successful.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * If not, throws the given COM result.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CheckComRCThrowRC(rc) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!SUCCEEDED (rc)) { throw rc; } else do {} while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/*
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * A section of helpful macros for error output
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
a2544ef163bb615c50680a75e0958e2eb801727avboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Prints a line describing the given COM result code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Used by command line tools or for debugging.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define PRINT_RC_MESSAGE(rc) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync do { \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTPrintf ("[!] Primary RC = %Rhra\n", rc); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync Log (("[!] Primary RC = %Rhra\n", rc)); \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync } while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Prints the extended error information.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Used by command line tools or for debugging.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync *
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param info com::ErrorInfo instance
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define PRINT_ERROR_INFO(info) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync RTPrintf ("[!] Full error info present: %RTbool, basic error info present: %RTbool\n", \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync info.isFullAvailable(), info.isBasicAvailable()); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync Log (("[!] Full error info present: %RTbool, basic error info present: %RTbool\n", \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync info.isFullAvailable(), info.isBasicAvailable())); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (info.isFullAvailable() || info.isBasicAvailable()) { \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync RTPrintf ("[!] Result Code = %Rhra\n", info.getResultCode()); \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTPrintf ("[!] Text = %ls\n", info.getText().raw()); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync RTPrintf ("[!] Component = %ls, Interface: %ls, {%RTuuid}\n", \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync info.getComponent().raw(), info.getInterfaceName().raw(), \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync info.getInterfaceID().raw()); \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync RTPrintf ("[!] Callee = %ls, {%RTuuid}\n", \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync info.getCalleeName().raw(), info.getCalleeIID().raw()); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync Log (("[!] Result Code = %Rhra\n", info.getResultCode())); \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log (("[!] Text = %ls\n", info.getText().raw())); \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync Log (("[!] Component = %ls, Interface: %ls, {%RTuuid}\n", \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync info.getComponent().raw(), info.getInterfaceName().raw(), \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync info.getInterfaceID().raw())); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync Log (("[!] Callee = %ls, {%RTuuid}\n", \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync info.getCalleeName().raw(), info.getCalleeIID().raw())); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync } \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync } while (0)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync
a2544ef163bb615c50680a75e0958e2eb801727avboxsync/**
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * Calls the given interface method and then checks if the return value
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * (COM result code) indicates a failure. If so, prints the failed
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * function/line/file and the description of the result code.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync *
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * Used by command line tools or for debugging and assumes the |HRESULT rc|
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * variable is accessible for assigning in the current scope.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync */
a2544ef163bb615c50680a75e0958e2eb801727avboxsync#define CHECK_RC(method) \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync do { \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync rc = method; \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync if (FAILED (rc)) { \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync RTPrintf ("[!] FAILED calling " #method " at line %d!\n", __LINE__); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync Log (("[!] FAILED calling " #method " at line %d!\n", __LINE__)); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync PRINT_RC_MESSAGE(rc); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync } \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync } while (0)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync
a2544ef163bb615c50680a75e0958e2eb801727avboxsync/**
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * Does the same as CHECK_RC(), but executes the |return rc| statement on
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * failure.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync */
a2544ef163bb615c50680a75e0958e2eb801727avboxsync#define CHECK_RC_RET(method) \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync do { CHECK_RC (method); if (FAILED (rc)) return rc; } while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_RC(), but executes the |break| statement on
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * failure.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CHECK_RC_BREAK(method) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (1) { CHECK_RC (method); if (FAILED (rc)) break; } else do {} while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Calls the given method of the given interface and then checks if the return
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * value (COM result code) indicates a failure. If so, prints the failed
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * function/line/file, the description of the result code and attempts to
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * query the extended error information on the current thread (using
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * com::ErrorInfo) if the interface reports that it supports error information.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync *
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Used by command line tools or for debugging and assumes the |HRESULT rc|
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * variable is accessible for assigning in the current scope.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CHECK_ERROR(iface, method) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync { \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync CHECK_RC(iface->method); \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (FAILED(rc)) { \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync com::ErrorInfo info (iface); \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRINT_ERROR_INFO (info); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_ERROR(), but executes the |return ret| statement on
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * failure.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CHECK_ERROR_RET(iface, method, ret) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { CHECK_ERROR (iface, method); if (FAILED (rc)) return (ret); } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_ERROR(), but executes the |break| statement on
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * failure.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CHECK_ERROR_BREAK(iface, method) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (1) { CHECK_ERROR (iface, method); if (FAILED (rc)) break; } else do {} while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CHECK_ERROR_NOCALL() \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync com::ErrorInfo info; \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRINT_ERROR_INFO (info); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync/**
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Does the same as CHECK_ERROR(), but doesn't need the interface pointer
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * because doesn't do a check whether the interface supports error info or not.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CHECK_ERROR_NI(method) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync CHECK_RC (method); \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (FAILED (rc)) { \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync com::ErrorInfo info; \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync PRINT_ERROR_INFO (info); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_ERROR_NI(), but executes the |return rc| statement
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * on failure.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CHECK_ERROR_NI_RET(method) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { CHECK_ERROR_NI (method); if (FAILED (rc)) return rc; } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_ERROR_NI(), but executes the |break| statement
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * on failure.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define CHECK_ERROR_NI_BREAK(method) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (1) { CHECK_ERROR_NI (method); if (FAILED (rc)) break; } else do {} while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync
432f4382a4f933a320e4e251fa738d3cfab5af9cvboxsync/**
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * Asserts the given expression is true. When the expression is false, prints
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * a line containing the failied function/line/file; otherwise does nothing.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define ASSERT(expr) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (!(expr)) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync { \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync RTPrintf ("[!] ASSERTION FAILED at line %d: %s\n", __LINE__, #expr); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync Log (("[!] ASSERTION FAILED at line %d: %s\n", __LINE__, #expr)); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as ASSERT(), but executes the |return ret| statement if the
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * expression to assert is false.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync#define ASSERT_RET(expr, ret) \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { ASSERT (expr); if (!(expr)) return (ret); } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync/**
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as ASSERT(), but executes the |break| statement if the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * expression to assert is false.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync */
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync#define ASSERT_BREAK(expr) \
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (1) { ASSERT (expr); if (!(expr)) break; } else do {} while (0)
#endif