7db630a55be9d955c8ac125da609b304cbcc6010vboxsync// Test02.cpp
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync#include "nsIDOMNode.h"
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync#include "nsCOMPtr.h"
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync#include "nsString.h"
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync#ifdef __MWERKS__
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync #pragma exceptions off
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync#endif
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsyncNS_DEF_PTR(nsIDOMNode);
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync /*
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync This test file compares the generated code size of similar functions between raw
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync COM interface pointers (|AddRef|ing and |Release|ing by hand) and |nsCOMPtr|s.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync Function size results were determined by examining dissassembly of the generated code.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync mXXX is the size of the generated code on the Macintosh. wXXX is the size on Windows.
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync For these tests, all reasonable optimizations were enabled and exceptions were
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync disabled (just as we build for release).
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync The tests in this file explore more complicated functionality: assigning a pointer
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync to be reference counted into a [raw, nsCOMPtr] object using |QueryInterface|;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync ensuring that it is |AddRef|ed and |Release|d appropriately; calling through the pointer
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync to a function supplied by the underlying COM interface. The tests in this file expand
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync on the tests in "Test01.cpp" by adding |QueryInterface|.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync Windows:
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync raw01 52
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync nsCOMPtr 63
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync raw 66
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync nsCOMPtr* 68
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync Macintosh:
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync nsCOMPtr 120 (1.0000)
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync Raw01 128 (1.1429) i.e., 14.29% bigger than nsCOMPtr
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync Raw00 144 (1.2000)
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync */
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsyncvoid // nsresult
7db630a55be9d955c8ac125da609b304cbcc6010vboxsyncTest02_Raw00( nsISupports* aDOMNode, nsString* aResult )
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync // m144, w66
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync {
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync// -- the following code is assumed, but is commented out so we compare only
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync// the relevent generated code
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync// if ( !aDOMNode )
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync// return NS_ERROR_NULL_POINTER;
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync nsIDOMNode* node = 0;
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync nsresult status = aDOMNode->QueryInterface(NS_GET_IID(nsIDOMNode), (void**)&node);
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync if ( NS_SUCCEEDED(status) )
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync {
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync node->GetNodeName(*aResult);
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync }
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync NS_IF_RELEASE(node);
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync// return status;
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync }
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsyncvoid // nsresult
7db630a55be9d955c8ac125da609b304cbcc6010vboxsyncTest02_Raw01( nsISupports* aDOMNode, nsString* aResult )
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync // m128, w52
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync {
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync// if ( !aDOMNode )
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync// return NS_ERROR_NULL_POINTER;
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync nsIDOMNode* node;
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync nsresult status = aDOMNode->QueryInterface(NS_GET_IID(nsIDOMNode), (void**)&node);
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync if ( NS_SUCCEEDED(status) )
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync {
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync node->GetNodeName(*aResult);
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync NS_RELEASE(node);
7db630a55be9d955c8ac125da609b304cbcc6010vboxsync }
// return status;
}
void // nsresult
Test02_nsCOMPtr( nsISupports* aDOMNode, nsString* aResult )
// m120, w63/68
{
nsresult status;
nsCOMPtr<nsIDOMNode> node = do_QueryInterface(aDOMNode, &status);
if ( node )
node->GetNodeName(*aResult);
// return status;
}