xpcom/tests/SizeTest02.cpp
author Mozilla Releng Treescript <release+treescript@mozilla.org>
Mon, 19 Aug 2019 20:55:53 +0000
changeset 541999 02464de32c92ca7d913e339f6f3813982e87ac0f
parent 507657 09c71a7cf75aeaf2963050e315276fb9a866fd62
permissions -rw-r--r--
No bug - Tagging 66a12ddcf77c6a1548989ced39edf39af78deb80 with FIREFOX_69_0b15_BUILD1 a=release CLOSED TREE DONTBUILD

// Test02.cpp

#include "nsINode.h"
#include "nsCOMPtr.h"
#include "nsString.h"

NS_DEF_PTR(nsINode);

/*
        This test file compares the generated code size of similar functions
   between raw COM interface pointers (|AddRef|ing and |Release|ing by hand) and
   |nsCOMPtr|s.

        Function size results were determined by examining dissassembly of the
   generated code. mXXX is the size of the generated code on the Macintosh. wXXX
   is the size on Windows. For these tests, all reasonable optimizations were
   enabled and exceptions were disabled (just as we build for release).

        The tests in this file explore more complicated functionality: assigning
   a pointer to be reference counted into a [raw, nsCOMPtr] object using
   |QueryInterface|; ensuring that it is |AddRef|ed and |Release|d
   appropriately; calling through the pointer to a function supplied by the
   underlying COM interface.  The tests in this file expand on the tests in
   "Test01.cpp" by adding |QueryInterface|.

        Windows:
                raw01
   52 nsCOMPtr							 63 raw
   66 nsCOMPtr*							 68

        Macintosh:
                nsCOMPtr 120 	(1.0000) Raw01
   128		(1.1429)	i.e., 14.29% bigger than nsCOMPtr Raw00
   144		(1.2000)
*/

void  // nsresult
Test02_Raw00(nsISupports* aDOMNode, nsString* aResult)
// m144, w66
{
  // -- the following code is assumed, but is commented out so we compare only
  //		 the relevent generated code

  //		if ( !aDOMNode )
  //			return NS_ERROR_NULL_POINTER;

  nsINode* node = 0;
  nsresult status =
      aDOMNode->QueryInterface(NS_GET_IID(nsINode), (void**)&node);
  if (NS_SUCCEEDED(status)) {
    node->GetNodeName(*aResult);
  }

  NS_IF_RELEASE(node);

  //		return status;
}

void  // nsresult
Test02_Raw01(nsISupports* aDOMNode, nsString* aResult)
// m128, w52
{
  //		if ( !aDOMNode )
  //			return NS_ERROR_NULL_POINTER;

  nsINode* node;
  nsresult status =
      aDOMNode->QueryInterface(NS_GET_IID(nsINode), (void**)&node);
  if (NS_SUCCEEDED(status)) {
    node->GetNodeName(*aResult);
    NS_RELEASE(node);
  }

  //		return status;
}

void  // nsresult
Test02_nsCOMPtr(nsISupports* aDOMNode, nsString* aResult)
// m120, w63/68
{
  nsresult status;
  nsCOMPtr<nsINode> node = do_QueryInterface(aDOMNode, &status);

  if (node) node->GetNodeName(*aResult);

  //		return status;
}