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
-~----------~----~----~----~------~----~------~--~---

Reply via email to