Move stack trace logic into custom/ and add a macro to inject it.
This commit is contained in:
@@ -433,6 +433,10 @@ class OsStackTraceGetterInterface {
|
||||
// CurrentStackTrace() will use to find and hide Google Test stack frames.
|
||||
virtual void UponLeavingGTest() = 0;
|
||||
|
||||
// This string is inserted in place of stack frames that are part of
|
||||
// Google Test's implementation.
|
||||
static const char* const kElidedFramesMarker;
|
||||
|
||||
private:
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
|
||||
};
|
||||
@@ -440,26 +444,12 @@ class OsStackTraceGetterInterface {
|
||||
// A working implementation of the OsStackTraceGetterInterface interface.
|
||||
class OsStackTraceGetter : public OsStackTraceGetterInterface {
|
||||
public:
|
||||
OsStackTraceGetter() : caller_frame_(NULL) {}
|
||||
OsStackTraceGetter() {}
|
||||
|
||||
virtual string CurrentStackTrace(int max_depth, int skip_count)
|
||||
GTEST_LOCK_EXCLUDED_(mutex_);
|
||||
|
||||
virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
|
||||
|
||||
// This string is inserted in place of stack frames that are part of
|
||||
// Google Test's implementation.
|
||||
static const char* const kElidedFramesMarker;
|
||||
virtual string CurrentStackTrace(int max_depth, int skip_count);
|
||||
virtual void UponLeavingGTest();
|
||||
|
||||
private:
|
||||
Mutex mutex_; // protects all internal state
|
||||
|
||||
// We save the stack frame below the frame that calls user code.
|
||||
// We do this because the address of the frame immediately below
|
||||
// the user code changes between the call to UponLeavingGTest()
|
||||
// and any calls to CurrentStackTrace() from within the user code.
|
||||
void* caller_frame_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
|
||||
};
|
||||
|
||||
|
||||
36
src/gtest.cc
36
src/gtest.cc
@@ -32,6 +32,7 @@
|
||||
// The Google C++ Testing Framework (Google Test)
|
||||
|
||||
#include "gtest/gtest.h"
|
||||
#include "gtest/internal/custom/gtest.h"
|
||||
#include "gtest/gtest-spi.h"
|
||||
|
||||
#include <ctype.h>
|
||||
@@ -789,8 +790,12 @@ int UnitTestImpl::test_to_run_count() const {
|
||||
// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
|
||||
// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
|
||||
std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
|
||||
(void)skip_count;
|
||||
return "";
|
||||
return os_stack_trace_getter()->CurrentStackTrace(
|
||||
static_cast<int>(GTEST_FLAG(stack_trace_depth)),
|
||||
skip_count + 1
|
||||
// Skips the user-specified number of frames plus this function
|
||||
// itself.
|
||||
); // NOLINT
|
||||
}
|
||||
|
||||
// Returns the current time in milliseconds.
|
||||
@@ -3833,26 +3838,15 @@ ScopedTrace::~ScopedTrace()
|
||||
|
||||
// class OsStackTraceGetter
|
||||
|
||||
// Returns the current OS stack trace as an std::string. Parameters:
|
||||
//
|
||||
// max_depth - the maximum number of stack frames to be included
|
||||
// in the trace.
|
||||
// skip_count - the number of top frames to be skipped; doesn't count
|
||||
// against max_depth.
|
||||
//
|
||||
string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
|
||||
int /* skip_count */)
|
||||
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||
const char* const OsStackTraceGetterInterface::kElidedFramesMarker =
|
||||
"... " GTEST_NAME_ " internal frames ...";
|
||||
|
||||
string OsStackTraceGetter::CurrentStackTrace(int /*max_depth*/,
|
||||
int /*skip_count*/) {
|
||||
return "";
|
||||
}
|
||||
|
||||
void OsStackTraceGetter::UponLeavingGTest()
|
||||
GTEST_LOCK_EXCLUDED_(mutex_) {
|
||||
}
|
||||
|
||||
const char* const
|
||||
OsStackTraceGetter::kElidedFramesMarker =
|
||||
"... " GTEST_NAME_ " internal frames ...";
|
||||
void OsStackTraceGetter::UponLeavingGTest() {}
|
||||
|
||||
// A helper class that creates the premature-exit file in its
|
||||
// constructor and deletes the file in its destructor.
|
||||
@@ -4907,7 +4901,11 @@ void UnitTestImpl::set_os_stack_trace_getter(
|
||||
// getter, and returns it.
|
||||
OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
|
||||
if (os_stack_trace_getter_ == NULL) {
|
||||
#ifdef GTEST_OS_STACK_TRACE_GETTER_
|
||||
os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_;
|
||||
#else
|
||||
os_stack_trace_getter_ = new OsStackTraceGetter;
|
||||
#endif // GTEST_OS_STACK_TRACE_GETTER_
|
||||
}
|
||||
|
||||
return os_stack_trace_getter_;
|
||||
|
||||
Reference in New Issue
Block a user