Hi all,

In WebKit, it’s fairly common to write a member variable as RefPtr or 
std::unique_ptr that later gets lazily initialized to some value but never 
unset or assigned of a different value after that.

e.g.

class Foo {
    Bar& bar() {
        if (!m_bar)
            m_bar = Bar::create();
        return *m_bar;
    }
    Ref<Bar> protectedBar() { return bar(); }

    RefPtr<Bar> m_bar;
}

Assuming there is no other code modifying m_bar, foo->bar()->method() is always 
safe to call even if method wasn’t a trivial function. Right now, static 
analyzer doesn’t recognize this pattern so we’d be forced to write code like 
this: foo->protectedBar()->method() where ensureProtectedBar is a wrapper 
around ensureBar which returns Ref<Bar>.

A suggestion was made that static analyzer can recognize this patten. 
Specifically, if we introduced a new smart pointer types that only allow 
setting the value once, static analyzer can allow foo->bar()->method()and avoid 
ref-churn in some cases:

e.g.

class Foo {
    Bar& bar() {
        if (!m_bar)
            m_bar = Bar::create();
        return *m_bar;
    }

    SetOnceRefPtr<Bar> m_bar;
}

SetOnceRefPtr::operator=(T*) release asserts that m_ptr isn’t set, and doesn’t 
have a move constructor, operator=(nullptr_t), leakRef(), releaseNonNull(), 
etc… which can override the value of m_ptr after setting the value via 
operator= or in constructor.

We could create various variants: SetOnceRef, SetOnceUniquePtr, 
SetOnceUniqueRef.

Do you think this will be useful? 

- R. Niwa

_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to