/** * Removes ('pops') all child contexts chained to the given context and itself, * then makes the parent of the given context the new active context, so this * comes with an implicit @see SimpleTest::getContext(). * * @param SimpleTestContext $context The context to pop. It must have been * produced before by either * @see SimpleTest::getContext() or * @see SimpleTest::pushContext(). * @return SimpleTestContext The now activate context. */ static function popContext($ctx) { // see if $ctx is indeed a parent of ours ... $child = self::$context; while ($child && $child !== $ctx) { $child = $child->getParent(); } if (!$child) { return self::getContext(); } // ... only when it is do we 'pop' the chain of children: self::$context = $ctx; // ... and see whether there's a valid parent to be had: if ($ctx = $ctx->getParent()) { self::$context = $ctx; } /* The GC should now recognize the child contexts as 'discarded' as the parent contexts don't reference the children, it's the other way around, so our 'self::$context' reference should have been the only thing that kept them alive till now. */ return self::$context; }