It is possible to add an integer to RefPtr 
    Categories
(Core :: MFBT, defect)
Tracking
()
People
(Reporter: jwwang, Unassigned)
References
Details
| Comment 1•10 years ago
           | ||
| Comment 2•5 years ago
           | ||
(In reply to Jeff Walden [:Waldo] from comment #1)
It probably is convenient but dangerous, yes. I think it was this way
because that's how nsRefPtr before it worked. If it's not that much work to
change over to require explicit .get(), that'd be a good thing to do.
I think this should really be done. The implicit conversion to a raw pointer is pretty confusing, not only in this case.
But
I'm not sure how much I could hope that.
We'd probably have to add a new
type for RefPtr-as-argument if we wanted to support this, because currently
we probably just assume we can pass RefPtr instances to T* arguments.
What does this mean? Why is a special type needed? Assuming that the argument type stays T*, we can just pass refPtr.get(). But often, if the recipient actually requires its own RefPtr, the argument type can be changed to RefPtr<T>, and we can pass refPtr or std::move(refPtr). With respect to refcounting, this is never worse as with a T* argument, but possibly better, as we can spare modifying the refcount at all in the latter, move case.
Not a bad thing to do, just a lot of work.
Just adding .get() can be easily done with a clang-based rule. Changing argument types is probably harder.
|   | ||
| Comment 3•5 years ago
           | ||
(In reply to Simon Giesecke [:sg] [he/him] from comment #2)
(In reply to Jeff Walden [:Waldo] from comment #1)
We'd probably have to add a new
type for RefPtr-as-argument if we wanted to support this, because currently
we probably just assume we can pass RefPtr instances to T* arguments.What does this mean? Why is a special type needed? Assuming that the argument type stays
T*, we can just passrefPtr.get().
I imagine that the new argument type would preserve implicit coercion; requiring .get() would make things...rather noisy, I think.
We have historically discouraged passing smart pointers by value to avoid unnecessary refcounting.  I don't have a good sense of how often callees take strong references to T* vs. just calling methods on the passed T*.
| Comment 4•5 years ago
           | ||
(In reply to Nathan Froyd [:froydnj] from comment #3)
(In reply to Simon Giesecke [:sg] [he/him] from comment #2)
(In reply to Jeff Walden [:Waldo] from comment #1)
We'd probably have to add a new
type for RefPtr-as-argument if we wanted to support this, because currently
we probably just assume we can pass RefPtr instances to T* arguments.What does this mean? Why is a special type needed? Assuming that the argument type stays
T*, we can just passrefPtr.get().I imagine that the new argument type would preserve implicit coercion; requiring
.get()would make things...rather noisy, I think.
Hm, ok, that might be an option. By that, one would enforce that a RefPtr
We have historically discouraged passing smart pointers by value to avoid unnecessary refcounting.
I very much agree this should be avoided. As I said, in the case the callee acquires a strong reference, changing the argument type from T* to RefPtr<T> is a precondition for avoiding unnecessary refcounting. If the callee doesn't acquire a strong reference, its argument type should not be changed to RefPtr<T>.
I don't have a good sense of how often callees take strong references to
T*vs. just calling methods on the passedT*.
At least for constructors, it's the former in most cases. As part of Bug 1609133, I can check how many cases of the former exist.
| Updated•3 years ago
           | 
Description
•