Assertion failure in js/dom/global-constructors-attributes-dedicated-worker.html
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 31 Oct 2013 03:52:23 +0000 (03:52 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 31 Oct 2013 03:52:23 +0000 (03:52 +0000)
commitd085d368a46c924abcedca9bdeed023aa337c6e5
treeb80fb860d4822d1b8dae807144f7309247532408
parent4c81bb698bb1a185383a808e75a2cfb3a90be577
Assertion failure in js/dom/global-constructors-attributes-dedicated-worker.html
https://bugs.webkit.org/show_bug.cgi?id=123551
<rdar://problem/15356238>

Reviewed by Mark Hahnenberg.

WatchpointSets have always had this "fire everything on deletion" policy because it
seemed like a good fail-safe at the time I first implemented WatchpointSets. But
it's actually causing bugs rather than providing safety:

- Everyone who registers Watchpoints with WatchpointSets have separate mechanisms
  for either keeping the WatchpointSets alive or noticing when they are collected.
  So this wasn't actually providing any safety.

  One example of this is Structures, where:

  - CodeBlocks that register Watchpoints on Structure's WatchpointSet will also
    register weak references to the Structure, and the GC will jettison a CodeBlock
    if the Structure(s) it cares about dies.

  - StructureStubInfos that register Watchpoints on Structure's WatchpointSet will
    also be cleared by GC if the Structures die.

- The WatchpointSet destructor would get invoked from finalization/destruction.
  This would then cause CodeBlock::jettison() to be called on a CodeBlock, but that
  method requires doing things that access heap objects. This would usually cause
  problems on VM destruction, since then the CodeBlocks would still be alive but the
  whole heap would be destroyed.

This also ensures that CodeBlock::jettison() cannot cause a GC. This is safe since
that method doesn't really allocate objects, and it is likely necessary because
jettison() may be called from deep in the stack.

* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::jettison):
* bytecode/Watchpoint.cpp:
(JSC::WatchpointSet::~WatchpointSet):
* bytecode/Watchpoint.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@158341 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/bytecode/CodeBlock.cpp
Source/JavaScriptCore/bytecode/Watchpoint.cpp
Source/JavaScriptCore/bytecode/Watchpoint.h