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.