SpAssert.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:2k
源码类别:

金融证券系统

开发平台:

Visual C++

  1. /*
  2. Cross Platform Core Code.
  3. Copyright(R) 2001-2002 Balang Software.
  4. All rights reserved.
  5. Using:
  6. SP_ASSERT( BOOL f );
  7. SP_VERIFY( BOOL f );
  8. */
  9. #include "StdAfx.h"
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. #ifdef _DEBUG
  15. int NEAR afxIgnoreAssertCount = 0;               // for testing diagnostics
  16. LONG NEAR afxAssertBusy = -1;
  17. #pragma optimize("qgel", off) // assembler cannot be globally optimized
  18. void SP_AssertFailedLine(LPCSTR lpszFileName, int nLine)
  19. {
  20. if (afxIgnoreAssertCount > 0)
  21. {
  22. afxIgnoreAssertCount--;
  23. return;
  24. }
  25. char sz[255];
  26. static char szTitle[] = "Assertion Failed!";
  27. static char szMessage[] = "%s: File %s, Line %d";
  28. static char szUnknown[] = "<unknown application>";
  29. // In case _AfxGetAppDataFails.
  30. if (++afxAssertBusy > 0)
  31. {
  32. afxAssertBusy--;
  33. // break into the debugger (or Dr Watson log)
  34. #ifndef _PORTABLE
  35. _asm { int 3 };
  36. #endif
  37. return;
  38. }
  39. // get app name or NULL if unknown (don't call assert)
  40. const char* pszAppName = "Spring";
  41. sprintf(sz, (LPCSTR)szMessage,
  42. (pszAppName == NULL) ? (LPCSTR)szUnknown : (LPCSTR)pszAppName,
  43. lpszFileName,
  44. nLine);
  45. SP_OutputDebugString(sz);
  46. SP_OutputDebugString(", ");
  47. SP_OutputDebugString(szTitle);
  48. SP_OutputDebugString("nr");
  49. int nCode = SP_MessageBox( NULL, sz, szTitle,
  50. MB_SYSTEMMODAL | MB_ICONHAND | MB_ABORTRETRYIGNORE);
  51. afxAssertBusy--;
  52. if (nCode == IDIGNORE)
  53. {
  54. return;     // ignore
  55. }
  56. else if (nCode == IDRETRY)
  57. {
  58. #ifndef _PORTABLE
  59. _asm { int 3 };
  60. #endif //_PORTABLE
  61. return;
  62. }
  63. abort();
  64. }
  65. #pragma optimize("", on)
  66. void SP_AssertValidObject( const Object* pOb, 
  67.  LPCSTR lpszFileName, int nLine )
  68. {
  69. if (pOb == NULL)
  70. {
  71. SP_TRACE0("ASSERT_VALID fails with NULL pointern");
  72. SP_AssertFailedLine(lpszFileName, nLine);
  73. return;     // quick escape
  74. }
  75. if (!SP_IsValidAddress((void*)pOb, sizeof(Object)))
  76. {
  77. SP_TRACE0("ASSERT_VALID fails with illegal pointern");
  78. SP_AssertFailedLine(lpszFileName, nLine);
  79. return;     // quick escape
  80. }
  81. #ifndef _M_I86SM
  82. // check to make sure the far VTable pointer is valid
  83. SP_ASSERT(sizeof(Object) == sizeof(void FAR*) + sizeof(int) );
  84. if (!SP_IsValidAddress(*(void FAR**)pOb, sizeof(void FAR*), FALSE))
  85. {
  86. SP_TRACE0("ASSERT_VALID fails with illegal vtable pointern");
  87. SP_AssertFailedLine(lpszFileName, nLine);
  88. return;     // quick escape
  89. }
  90. #endif
  91. pOb->AssertValid();
  92. }
  93. #endif//_DEBUG