diff -r 000000000000 -r 6474c204b198 toolkit/crashreporter/test/nsTestCrasher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolkit/crashreporter/test/nsTestCrasher.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,126 @@ +#include "mozilla/Assertions.h" + +#include + +#include "nscore.h" +#include "nsXULAppAPI.h" +#include "nsExceptionHandler.h" +#include "mozilla/unused.h" + +/* + * This pure virtual call example is from MSDN + */ +class A; + +void fcn( A* ); + +class A +{ +public: + virtual void f() = 0; + A() { fcn( this ); } +}; + +class B : A +{ + void f() { } +public: + void use() { } +}; + +void fcn( A* p ) +{ + p->f(); +} + +void PureVirtualCall() +{ + // generates a pure virtual function call + B b; + b.use(); // make sure b's actually used +} + +// Keep these in sync with CrashTestUtils.jsm! +const int16_t CRASH_INVALID_POINTER_DEREF = 0; +const int16_t CRASH_PURE_VIRTUAL_CALL = 1; +const int16_t CRASH_RUNTIMEABORT = 2; +const int16_t CRASH_OOM = 3; +const int16_t CRASH_MOZ_CRASH = 4; +const int16_t CRASH_ABORT = 5; + +extern "C" NS_EXPORT +void Crash(int16_t how) +{ + switch (how) { + case CRASH_INVALID_POINTER_DEREF: { + volatile int* foo = (int*)0x42; + *foo = 0; + // not reached + break; + } + case CRASH_PURE_VIRTUAL_CALL: { + PureVirtualCall(); + // not reached + break; + } + case CRASH_RUNTIMEABORT: { + NS_RUNTIMEABORT("Intentional crash"); + break; + } + case CRASH_OOM: { + mozilla::unused << moz_xmalloc((size_t) -1); + mozilla::unused << moz_xmalloc((size_t) -1); + mozilla::unused << moz_xmalloc((size_t) -1); + break; + } + case CRASH_MOZ_CRASH: { + MOZ_CRASH(); + break; + } + case CRASH_ABORT: { + abort(); + break; + } + default: + break; + } +} + +extern "C" NS_EXPORT +nsISupports* LockDir(nsIFile *directory) +{ + nsISupports* lockfile = nullptr; + XRE_LockProfileDirectory(directory, &lockfile); + return lockfile; +} + +char testData[32]; + +extern "C" NS_EXPORT +uint64_t SaveAppMemory() +{ + for (size_t i=0; i