XPCOMGC/Stack Pointers

From MozillaWiki
Jump to: navigation, search

Automatic rewriting spec for XPCOMGC:

Detect every instance of nsCOMPtr that is used as a stack variable, and rewrite it to be a raw pointer.

  • Remove use of getter_AddRefs with these objects.
  • Rewrite nsCOMPtr::swap()
  • Remove nsCOMPtr::get() for stack vars
  • Function return values & parameters are part of the stack
    • Rewrite already_AddRefed<Foo> return values
    • Rewrite nsCOMPtr &bla parameters


  nsFoo::Function(nsISupports* gah)
    //rewrite stack declarations
-   nsCOMPtr<nsIBar> bar;
+   nsIBar* bar;
    // support multi-var declarations
-   nsCOMPtr<nsIBaz> boo, gahbaz = do_QueryInterface(gah);
+   nsIBaz* boo, *gahbaz = do_QueryInterface(gah);

    // Don't use getter_AddRefs for stack variables
-   nsresult rv = gahbaz->GetBar(getter_AddRefs(bar));
+   nsresult rv = gahbaz->GetBar(&bar);

    // Make the getter_AddRefs downcasting magic explicit
-   Function(getter_AddRefs(boo));
+   Function((nsISupports**)&boo);
    // keep heap-allocated variables untouched

Command to make the patch useful:

sed 's/.home.tglek.work.actionmonkey.//' /tmp/nsgenerichtmlelement.diff |filterdiff -x xpcom/glue/nsCOMPtr.h -x xpcom/glue/nsIWeakReferenceUtils.h -x xpcom/glue/nsThreadUtils.h -x xpcom/threads/nsThread.h -x /\* |patch -p0 --dry-run

Attribute-based rewrites

Functions that take COMPtr& parameters make life difficult(especially if those are templated). COMPtr& gets the & converted to a *, a couple of other funky cases exist.