assert.h revision ea1e119d89f21a5c3825ae16876429d69501468a
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * MS COM / XPCOM Abstraction Layer:
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Assertion macros for COM/XPCOM
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 * 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 * 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 * 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 * 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 * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync do { AssertMsg (SUCCEEDED (rc), ("COM RC = %Rhrc (0x%08X)\n", rc, rc)); NOREF (rc); } while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * A special version of AssertComRC that returns the given expression
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * if the result code is failed.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param ret the expression to return
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgReturn (SUCCEEDED (rc), ("COM RC = %Rhrc (0x%08X)\n", rc, rc), ret)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * A special version of AssertComRC that returns the given result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * if it is failed.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param ret the expression to return
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync AssertMsgReturn (SUCCEEDED (rc), ("COM RC = %Rhrc (0x%08X)\n", rc, rc), rc)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * A special version of AssertComRC that returns if the result code is failed.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param ret the expression to return
a2544ef163bb615c50680a75e0958e2eb801727avboxsync AssertMsgReturnVoid (SUCCEEDED (rc), ("COM RC = %Rhrc (0x%08X)\n", rc, rc))
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * A special version of AssertComRC that evaluates the given expression and
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * breaks if the result code is failed.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param rc COM result code
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param eval the expression to evaluate
a2544ef163bb615c50680a75e0958e2eb801727avboxsync if (!SUCCEEDED (rc)) { AssertComRC (rc); eval; break; } else do {} while (0)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * A special version of AssertComRC that evaluates the given expression and
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * throws it if the result code is failed.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param rc COM result code
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param eval the expression to throw
a2544ef163bb615c50680a75e0958e2eb801727avboxsync if (!SUCCEEDED (rc)) { AssertComRC (rc); throw (eval); } else do {} while (0)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * A special version of AssertComRC that just breaks if the result code is
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * @param rc COM result code
a2544ef163bb615c50680a75e0958e2eb801727avboxsync if (!SUCCEEDED (rc)) { AssertComRC (rc); break; } else do {} while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * A special version of AssertComRC that just throws @a rc if the result code is
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!SUCCEEDED (rc)) { AssertComRC (rc); throw rc; } else do {} while (0)
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Checks whether the given COM result code is successful.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * If not, executes the return statement with this result code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!SUCCEEDED (rc)) { return (rc); } else do {} while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Checks whether the given COM result code is successful.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * If not, executes the break statement.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * @param rc COM result code
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (!SUCCEEDED (rc)) { break; } else do {} while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Checks whether the given COM result code is successful.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * If not, throws the given COM result.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param rc COM result code
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (!SUCCEEDED (rc)) { throw rc; } else do {} while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * A section of helpful macros for error output
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Prints a line describing the given COM result code.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * Used by command line tools or for debugging.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Prints the extended error information.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Used by command line tools or for debugging.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * @param info com::ErrorInfo instance
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(), \
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(), \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync info.getCalleeName().raw(), info.getCalleeIID().raw())); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync } while (0)
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 * Used by command line tools or for debugging and assumes the |HRESULT rc|
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * variable is accessible for assigning in the current scope.
a2544ef163bb615c50680a75e0958e2eb801727avboxsync RTPrintf ("[!] FAILED calling " #method " at line %d!\n", __LINE__); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync Log (("[!] FAILED calling " #method " at line %d!\n", __LINE__)); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync } while (0)
a2544ef163bb615c50680a75e0958e2eb801727avboxsync * Does the same as CHECK_RC(), but executes the |return rc| statement on
a2544ef163bb615c50680a75e0958e2eb801727avboxsync do { CHECK_RC (method); if (FAILED (rc)) return rc; } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_RC(), but executes the |break| statement on
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (1) { CHECK_RC (method); if (FAILED (rc)) break; } else do {} while (0)
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 * Used by command line tools or for debugging and assumes the |HRESULT rc|
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * variable is accessible for assigning in the current scope.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_ERROR(), but executes the |return ret| statement on
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { CHECK_ERROR (iface, method); if (FAILED (rc)) return (ret); } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_ERROR(), but executes the |break| statement on
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (1) { CHECK_ERROR (iface, method); if (FAILED (rc)) break; } else do {} while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } while (0)
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 } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_ERROR_NI(), but executes the |return rc| statement
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * on failure.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { CHECK_ERROR_NI (method); if (FAILED (rc)) return rc; } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as CHECK_ERROR_NI(), but executes the |break| statement
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * on failure.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync if (1) { CHECK_ERROR_NI (method); if (FAILED (rc)) break; } else do {} while (0)
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 RTPrintf ("[!] ASSERTION FAILED at line %d: %s\n", __LINE__, #expr); \
a2544ef163bb615c50680a75e0958e2eb801727avboxsync Log (("[!] ASSERTION FAILED at line %d: %s\n", __LINE__, #expr)); \
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as ASSERT(), but executes the |return ret| statement if the
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * expression to assert is false.
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync do { ASSERT (expr); if (!(expr)) return (ret); } while (0)
8e9d8c088aac57bedb558d3164bb681a582e4474vboxsync * Does the same as ASSERT(), but executes the |break| statement if the
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync * expression to assert is false.
9fc464631dc4a68fbb5eb6419d61fbe91b6b16bdvboxsync if (1) { ASSERT (expr); if (!(expr)) break; } else do {} while (0)