Chromium Code Reviews| Index: test/cctest/test-api.cc |
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc |
| index c5c932b7516cc70738ad918a9311dabe1e985427..56a7f600718443590bf195c9560f6b0a06ddf347 100644 |
| --- a/test/cctest/test-api.cc |
| +++ b/test/cctest/test-api.cc |
| @@ -4986,6 +4986,67 @@ TEST(APIStackOverflowAndVerboseTryCatch) { |
| v8::V8::RemoveMessageListeners(receive_message); |
| } |
| +void APIStackOverflowNestedContextsHelper(bool is_bottom_call); |
|
Jarin
2014/03/25 15:28:33
In v8, bools as arguments are normally frowned upo
|
| + |
| +void APIStackOverflowNestedContextsCallback( |
| + const v8::FunctionCallbackInfo<Value>& args) { |
| + APIStackOverflowNestedContextsHelper(false); |
| +} |
| + |
| + |
| +void APIStackOverflowNestedContextsHelper(bool is_bottom_call) { |
| + v8::Isolate* isolate = CcTest::isolate(); |
| + TryCatch try_catch; |
| + |
| + Local<ObjectTemplate> global = ObjectTemplate::New(); |
| + global->Set(String::NewFromUtf8(isolate, "recur"), |
| + FunctionTemplate::New(isolate, APIStackOverflowNestedContextsCallback)); |
| + |
| + Local<Context> innerContext = Context::New(isolate, NULL, global); |
| + if (try_catch.HasCaught()) { |
| + try_catch.ReThrow(); |
| + return; |
| + } |
| + if (innerContext.IsEmpty()) return; |
| + |
| + Context::Scope context_scope(innerContext); |
| + Local<Script> script = v8::Script::Compile(v8::String::NewFromUtf8( |
| + isolate, |
| + "function f() { " |
| + " try { recur(); } catch(e) { throw e; } " |
| + " return 'bad'; " |
| + "} f(); ")); |
| + |
| + Local<Value> result = script->Run(); |
| + CHECK(result.IsEmpty()); |
| + if (try_catch.HasCaught()) { |
| + if (is_bottom_call) { |
| + String::Utf8Value ex_value(try_catch.Exception()); |
| + CHECK_EQ("RangeError: Maximum call stack size exceeded", *ex_value); |
| + } |
| + try_catch.ReThrow(); |
| + } |
| +} |
| + |
| + |
| +void APIStackOverflowNestedContexts(int extra_stack_bytes) { |
| + if (extra_stack_bytes) alloca(extra_stack_bytes); |
| + LocalContext context; |
| + v8::HandleScope scope(context->GetIsolate()); |
| + v8::TryCatch try_catch; |
| + APIStackOverflowNestedContextsHelper(true); |
| + CHECK(try_catch.HasCaught()); |
| +} |
| + |
| + |
| +TEST(APIStackOverflowNestedContexts) { |
| + // The place where a stack overflow can occur is not completely deterministic |
| + // so probe a few different depths |
| + APIStackOverflowNestedContexts(2500); |
| + APIStackOverflowNestedContexts(2800); |
| + APIStackOverflowNestedContexts(30000); |
| +} |
| + |
| THREADED_TEST(ExternalScriptException) { |
| v8::Isolate* isolate = CcTest::isolate(); |