Update V8 to r4588
We're using WebKit r58033, as used by
http://src.chromium.org/svn/releases/5.0.387.0/DEPS
This requires http://v8.googlecode.com/svn/trunk@4465 but this version has a
crashing bug for ARM. Instead we use http://v8.googlecode.com/svn/trunk@4588,
which is used by http://src.chromium.org/svn/releases/6.0.399.0/DEPS
Note that a trivial bug fix was required in arm/codegen-arm.cc. This is guarded
with ANDROID. See http://code.google.com/p/v8/issues/detail?id=703
Change-Id: I459647a8286c4f8c7405f0c5581ecbf051a6f1e8
diff --git a/test/cctest/test-log-stack-tracer.cc b/test/cctest/test-log-stack-tracer.cc
index 8ea9f79..4d9d759 100644
--- a/test/cctest/test-log-stack-tracer.cc
+++ b/test/cctest/test-log-stack-tracer.cc
@@ -191,7 +191,9 @@
static Handle<JSFunction> CompileFunction(const char* source) {
- return v8::Utils::OpenHandle(*Script::Compile(String::New(source)));
+ Handle<JSFunction> result(JSFunction::cast(
+ *v8::Utils::OpenHandle(*Script::Compile(String::New(source)))));
+ return result;
}
@@ -201,16 +203,16 @@
static Handle<JSFunction> GetGlobalJSFunction(const char* name) {
- Handle<JSFunction> js_func(JSFunction::cast(
- *(v8::Utils::OpenHandle(
- *GetGlobalProperty(name)))));
- return js_func;
+ Handle<JSFunction> result(JSFunction::cast(
+ *v8::Utils::OpenHandle(*GetGlobalProperty(name))));
+ return result;
}
static void CheckRetAddrIsInJSFunction(const char* func_name,
- Address ret_addr) {
- CheckRetAddrIsInJSFunction(func_name, ret_addr,
+ Address ret_addr) {
+ CheckRetAddrIsInJSFunction(func_name,
+ ret_addr,
GetGlobalJSFunction(func_name));
}
@@ -232,10 +234,12 @@
public:
CodeGeneratorPatcher() {
CodeGenerator::InlineRuntimeLUT genGetFramePointer =
- {&CodeGenerator::GenerateGetFramePointer, "_GetFramePointer"};
- // _FastCharCodeAt is not used in our tests.
+ {&CodeGenerator::GenerateGetFramePointer, "_GetFramePointer", 0};
+ // _RandomHeapNumber is just used as a dummy function that has zero
+ // arguments, the same as the _GetFramePointer function we actually patch
+ // in.
bool result = CodeGenerator::PatchInlineRuntimeEntry(
- NewString("_FastCharCodeAt"),
+ NewString("_RandomHeapNumber"),
genGetFramePointer, &oldInlineEntry);
CHECK(result);
}
@@ -276,23 +280,39 @@
#endif
SetGlobalProperty(func_name, v8::ToApi<Value>(func));
+ CHECK_EQ(*func, *GetGlobalJSFunction(func_name));
}
+// This test verifies that stack tracing works when called during
+// execution of a native function called from JS code. In this case,
+// StackTracer uses Top::c_entry_fp as a starting point for stack
+// walking.
TEST(CFromJSStackTrace) {
TickSample sample;
InitTraceEnv(&sample);
InitializeVM();
v8::HandleScope scope;
+ // Create global function JSFuncDoTrace which calls
+ // extension function trace() with the current frame pointer value.
CreateTraceCallerFunction("JSFuncDoTrace", "trace");
- CompileRun(
+ Local<Value> result = CompileRun(
"function JSTrace() {"
" JSFuncDoTrace();"
"};\n"
- "JSTrace();");
+ "JSTrace();\n"
+ "true;");
+ CHECK(!result.IsEmpty());
+ // When stack tracer is invoked, the stack should look as follows:
+ // script [JS]
+ // JSTrace() [JS]
+ // JSFuncDoTrace() [JS] [captures EBP value and encodes it as Smi]
+ // trace(EBP encoded as Smi) [native (extension)]
+ // DoTrace(EBP) [native]
+ // StackTracer::Trace
CHECK_GT(sample.frames_count, 1);
- // Stack sampling will start from the first JS function, i.e. "JSFuncDoTrace"
+ // Stack tracing will start from the first JS function, i.e. "JSFuncDoTrace"
CheckRetAddrIsInJSFunction("JSFuncDoTrace",
sample.stack[0]);
CheckRetAddrIsInJSFunction("JSTrace",
@@ -300,22 +320,41 @@
}
+// This test verifies that stack tracing works when called during
+// execution of JS code. However, as calling StackTracer requires
+// entering native code, we can only emulate pure JS by erasing
+// Top::c_entry_fp value. In this case, StackTracer uses passed frame
+// pointer value as a starting point for stack walking.
TEST(PureJSStackTrace) {
TickSample sample;
InitTraceEnv(&sample);
InitializeVM();
v8::HandleScope scope;
+ // Create global function JSFuncDoTrace which calls
+ // extension function js_trace() with the current frame pointer value.
CreateTraceCallerFunction("JSFuncDoTrace", "js_trace");
- CompileRun(
+ Local<Value> result = CompileRun(
"function JSTrace() {"
" JSFuncDoTrace();"
"};\n"
"function OuterJSTrace() {"
" JSTrace();"
"};\n"
- "OuterJSTrace();");
- // The last JS function called.
+ "OuterJSTrace();\n"
+ "true;");
+ CHECK(!result.IsEmpty());
+ // When stack tracer is invoked, the stack should look as follows:
+ // script [JS]
+ // OuterJSTrace() [JS]
+ // JSTrace() [JS]
+ // JSFuncDoTrace() [JS] [captures EBP value and encodes it as Smi]
+ // js_trace(EBP encoded as Smi) [native (extension)]
+ // DoTraceHideCEntryFPAddress(EBP) [native]
+ // StackTracer::Trace
+ //
+ // The last JS function called. It is only visible through
+ // sample.function, as its return address is above captured EBP value.
CHECK_EQ(GetGlobalJSFunction("JSFuncDoTrace")->address(),
sample.function);
CHECK_GT(sample.frames_count, 1);
@@ -352,6 +391,9 @@
}
+// This test verifies that stack tracing doesn't crash when called on
+// pure native code. StackTracer only unrolls JS code, so we can't
+// get any meaningful info here.
TEST(PureCStackTrace) {
TickSample sample;
InitTraceEnv(&sample);