| // Tests that opaque roots behave correctly during young generation collections |
| |
| var Element = $vm.Element; |
| var Root = $vm.Root; |
| var getElement = $vm.getElement; |
| |
| try { |
| // regression test for bug 160773. This should not crash. |
| new (Element.bind()); |
| } catch(e) { |
| } |
| |
| // Create the primary Root. |
| var root = new Root(); |
| // This secondary root is for allocating a second Element without overriding |
| // the primary Root's Element. |
| var otherRoot = new Root(); |
| |
| // Run an Eden collection so that the Root will be in the old gen (and won't be rescanned). |
| edenGC(); |
| |
| // Create a new Element and set a custom property on it. |
| var elem = new Element(root); |
| elem.customProperty = "hello"; |
| |
| // Make the Element unreachable except through the ephemeron with the Root. |
| elem = null; |
| |
| // Create another Element so that we process the weak handles in block of the original Element. |
| var test = new Element(otherRoot); |
| |
| // Run another Eden collection to process the weak handles in the Element's block. If opaque roots |
| // are cleared then we'll think that the original Element is dead because the Root won't be in the |
| // set of opaque roots. |
| edenGC(); |
| |
| // Check if the primary Root's Element exists and has our custom property. |
| var elem = getElement(root); |
| if (elem.customProperty != "hello") |
| throw new Error("bad value of customProperty: " + elem.customProperty); |