Reviewers: Hannes Payer,

Description:
Fix sporadic crash in the RequestInterruptTestWithNativeAccessor.

The test was broken. V8 currently does not correctly lookup NativeDataProperty accessors attached to the PrototypeTemplate of FunctionTemplate (Issue 3066). As the result while(obj.shouldContinue) loop was immediately exiting and the test would terminate while RequestInterruptTestBase::InterruptThread would be still starting up. As the result later InterruptThread would try to access members of
the test object which was destroyed.

The test was fixed:

- instead of attaching accessor to PrototypeTemplate we attach it to
InstanceTemplate;
- an assertion was added to verify that we completed the test successfully due to interruptor firing not due to sporadic loop termination due to some unrelated
bug.

[email protected]

Please review this at https://codereview.chromium.org/109653010/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+9, -5 lines):
  M test/cctest/test-api.cc


Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index 644f00d74244aa75f945178ad76af7242394542a..f494e019a08f20f15fb0878210b7ea9835e8a802 100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -21048,6 +21048,10 @@ class RequestInterruptTestBase {
     TestBody();

     isolate_->ClearInterrupt();
+
+    // Verify we arrived here because interruptor was called
+    // not due to a bug causing us to exit the loop too early.
+    CHECK(!should_continue());
   }

   void WakeUpInterruptor() {
@@ -21146,11 +21150,11 @@ class RequestInterruptTestWithNativeAccessor : public RequestInterruptTestBase {
  public:
   virtual void TestBody() {
v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New(isolate_);
-    v8::Local<v8::Template> proto = t->PrototypeTemplate();
-    proto->SetNativeDataProperty(v8_str("shouldContinue"),
-                                 &ShouldContinueNativeGetter,
-                                 NULL,
-                                 v8::External::New(isolate_, this));
+    t->InstanceTemplate()->SetNativeDataProperty(
+        v8_str("shouldContinue"),
+        &ShouldContinueNativeGetter,
+        NULL,
+        v8::External::New(isolate_, this));
     env_->Global()->Set(v8_str("Klass"), t->GetFunction());

     CompileRun("var obj = new Klass; while (obj.shouldContinue) { }");


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to