| Index: test/cctest/test-log-ia32.cc
|
| diff --git a/test/cctest/test-log-ia32.cc b/test/cctest/test-log-ia32.cc
|
| index 7312901ccaa20f3b7df206d4b64db91ca3244c11..a40a800ee3a55c070eddafcf5ee7c05b8b9d6cfd 100644
|
| --- a/test/cctest/test-log-ia32.cc
|
| +++ b/test/cctest/test-log-ia32.cc
|
| @@ -37,13 +37,11 @@ static v8::Persistent<v8::Context> env;
|
|
|
|
|
| static struct {
|
| - StackTracer* tracer;
|
| TickSample* sample;
|
| -} trace_env = { NULL, NULL };
|
| +} trace_env = { NULL };
|
|
|
|
|
| -static void InitTraceEnv(StackTracer* tracer, TickSample* sample) {
|
| - trace_env.tracer = tracer;
|
| +static void InitTraceEnv(TickSample* sample) {
|
| trace_env.sample = sample;
|
| }
|
|
|
| @@ -53,7 +51,7 @@ static void DoTrace(Address fp) {
|
| // sp is only used to define stack high bound
|
| trace_env.sample->sp =
|
| reinterpret_cast<unsigned int>(trace_env.sample) - 10240;
|
| - trace_env.tracer->Trace(trace_env.sample);
|
| + StackTracer::Trace(trace_env.sample);
|
| }
|
|
|
|
|
| @@ -99,6 +97,8 @@ class TraceExtension : public v8::Extension {
|
| v8::Handle<String> name);
|
| static v8::Handle<v8::Value> Trace(const v8::Arguments& args);
|
| static v8::Handle<v8::Value> JSTrace(const v8::Arguments& args);
|
| + static v8::Handle<v8::Value> JSEntrySP(const v8::Arguments& args);
|
| + static v8::Handle<v8::Value> JSEntrySPLevel2(const v8::Arguments& args);
|
| private:
|
| static Address GetFP(const v8::Arguments& args);
|
| static const char* kSource;
|
| @@ -107,8 +107,9 @@ class TraceExtension : public v8::Extension {
|
|
|
| const char* TraceExtension::kSource =
|
| "native function trace();"
|
| - "native function js_trace();";
|
| -
|
| + "native function js_trace();"
|
| + "native function js_entry_sp();"
|
| + "native function js_entry_sp_level2();";
|
|
|
| v8::Handle<v8::FunctionTemplate> TraceExtension::GetNativeFunction(
|
| v8::Handle<String> name) {
|
| @@ -116,6 +117,10 @@ v8::Handle<v8::FunctionTemplate> TraceExtension::GetNativeFunction(
|
| return v8::FunctionTemplate::New(TraceExtension::Trace);
|
| } else if (name->Equals(String::New("js_trace"))) {
|
| return v8::FunctionTemplate::New(TraceExtension::JSTrace);
|
| + } else if (name->Equals(String::New("js_entry_sp"))) {
|
| + return v8::FunctionTemplate::New(TraceExtension::JSEntrySP);
|
| + } else if (name->Equals(String::New("js_entry_sp_level2"))) {
|
| + return v8::FunctionTemplate::New(TraceExtension::JSEntrySPLevel2);
|
| } else {
|
| CHECK(false);
|
| return v8::Handle<v8::FunctionTemplate>();
|
| @@ -143,6 +148,34 @@ v8::Handle<v8::Value> TraceExtension::JSTrace(const v8::Arguments& args) {
|
| }
|
|
|
|
|
| +static Address GetJsEntrySp() {
|
| + CHECK_NE(NULL, Top::GetCurrentThread());
|
| + return Top::js_entry_sp(Top::GetCurrentThread());
|
| +}
|
| +
|
| +
|
| +v8::Handle<v8::Value> TraceExtension::JSEntrySP(const v8::Arguments& args) {
|
| + CHECK_NE(0, GetJsEntrySp());
|
| + return v8::Undefined();
|
| +}
|
| +
|
| +
|
| +static void CompileRun(const char* source) {
|
| + Script::Compile(String::New(source))->Run();
|
| +}
|
| +
|
| +
|
| +v8::Handle<v8::Value> TraceExtension::JSEntrySPLevel2(
|
| + const v8::Arguments& args) {
|
| + v8::HandleScope scope;
|
| + const Address js_entry_sp = GetJsEntrySp();
|
| + CHECK_NE(0, js_entry_sp);
|
| + CompileRun("js_entry_sp();");
|
| + CHECK_EQ(js_entry_sp, GetJsEntrySp());
|
| + return v8::Undefined();
|
| +}
|
| +
|
| +
|
| static TraceExtension kTraceExtension;
|
| v8::DeclareExtension kTraceExtensionDeclaration(&kTraceExtension);
|
|
|
| @@ -164,11 +197,6 @@ static Handle<JSFunction> CompileFunction(const char* source) {
|
| }
|
|
|
|
|
| -static void CompileRun(const char* source) {
|
| - Script::Compile(String::New(source))->Run();
|
| -}
|
| -
|
| -
|
| static Local<Value> GetGlobalProperty(const char* name) {
|
| return env->Global()->Get(String::New(name));
|
| }
|
| @@ -255,8 +283,7 @@ static void CreateTraceCallerFunction(const char* func_name,
|
|
|
| TEST(CFromJSStackTrace) {
|
| TickSample sample;
|
| - StackTracer tracer(reinterpret_cast<uintptr_t>(&sample));
|
| - InitTraceEnv(&tracer, &sample);
|
| + InitTraceEnv(&sample);
|
|
|
| InitializeVM();
|
| v8::HandleScope scope;
|
| @@ -277,8 +304,7 @@ TEST(CFromJSStackTrace) {
|
|
|
| TEST(PureJSStackTrace) {
|
| TickSample sample;
|
| - StackTracer tracer(reinterpret_cast<uintptr_t>(&sample));
|
| - InitTraceEnv(&tracer, &sample);
|
| + InitTraceEnv(&sample);
|
|
|
| InitializeVM();
|
| v8::HandleScope scope;
|
| @@ -323,11 +349,22 @@ static int CFunc(int depth) {
|
|
|
| TEST(PureCStackTrace) {
|
| TickSample sample;
|
| - StackTracer tracer(reinterpret_cast<uintptr_t>(&sample));
|
| - InitTraceEnv(&tracer, &sample);
|
| + InitTraceEnv(&sample);
|
| // Check that sampler doesn't crash
|
| CHECK_EQ(10, CFunc(10));
|
| }
|
|
|
|
|
| +TEST(JsEntrySp) {
|
| + InitializeVM();
|
| + v8::HandleScope scope;
|
| + CHECK_EQ(0, GetJsEntrySp());
|
| + CompileRun("a = 1; b = a + 1;");
|
| + CHECK_EQ(0, GetJsEntrySp());
|
| + CompileRun("js_entry_sp();");
|
| + CHECK_EQ(0, GetJsEntrySp());
|
| + CompileRun("js_entry_sp_level2();");
|
| + CHECK_EQ(0, GetJsEntrySp());
|
| +}
|
| +
|
| #endif // ENABLE_LOGGING_AND_PROFILING
|
|
|