Revision: 3364 Author: [email protected] Date: Wed Nov 25 08:46:56 2009 Log: Do not crash if a V8 extension fails to compile or throws an exception when the code is run.
Instead, return an empty context handle so the failure to create a context can be handled. BUG=http://crbug.com/28486 Review URL: http://codereview.chromium.org/442005 http://code.google.com/p/v8/source/detail?r=3364 Modified: /branches/bleeding_edge/src/bootstrapper.cc /branches/bleeding_edge/test/cctest/test-api.cc ======================================= --- /branches/bleeding_edge/src/bootstrapper.cc Wed Nov 11 01:50:06 2009 +++ /branches/bleeding_edge/src/bootstrapper.cc Wed Nov 25 08:46:56 2009 @@ -1338,8 +1338,6 @@ ASSERT(Top::has_pending_exception() != result); if (!result) { Top::clear_pending_exception(); - v8::Utils::ReportApiFailure( - "v8::Context::New()", "Error installing extension"); } current->set_state(v8::INSTALLED); return result; ======================================= --- /branches/bleeding_edge/test/cctest/test-api.cc Tue Nov 24 06:10:06 2009 +++ /branches/bleeding_edge/test/cctest/test-api.cc Wed Nov 25 08:46:56 2009 @@ -2668,6 +2668,40 @@ v8::Handle<Value> result = Script::Compile(v8_str("Foo()"))->Run(); CHECK_EQ(result, v8::Integer::New(4)); } + + +static const char* kSyntaxErrorInExtensionSource = + "["; + + +// Test that a syntax error in an extension does not cause a fatal +// error but results in an empty context. +THREADED_TEST(SyntaxErrorExtensions) { + v8::HandleScope handle_scope; + v8::RegisterExtension(new Extension("syntaxerror", + kSyntaxErrorInExtensionSource)); + const char* extension_names[] = { "syntaxerror" }; + v8::ExtensionConfiguration extensions(1, extension_names); + v8::Handle<Context> context = Context::New(&extensions); + CHECK(context.IsEmpty()); +} + + +static const char* kExceptionInExtensionSource = + "throw 42"; + + +// Test that an exception when installing an extension does not cause +// a fatal error but results in an empty context. +THREADED_TEST(ExceptionExtensions) { + v8::HandleScope handle_scope; + v8::RegisterExtension(new Extension("exception", + kExceptionInExtensionSource)); + const char* extension_names[] = { "exception" }; + v8::ExtensionConfiguration extensions(1, extension_names); + v8::Handle<Context> context = Context::New(&extensions); + CHECK(context.IsEmpty()); +} static void CheckDependencies(const char* name, const char* expected) { --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
