Fix for bug 560462 (Use fast unwrapping for more quickstubs) - use fast unwrapping for nsIDOMNode_GetNodeType, nsIDOMNodeList_GetLength, nsIDOMElement, nsIDOMNSElement_, nsIDOMNSHTMLElement, nsIDOMDocument, nsIDOMNSDocument, nsIDOM3Document, nsIDOMHTMLDocument and nsIDOMNSHTMLDocument_. r=jst.

This commit is contained in:
Peter Van der Beken 2010-04-19 17:41:39 +02:00
parent 75ccb33e1a
commit f9b24fc187
7 changed files with 105 additions and 48 deletions

View File

@ -192,6 +192,8 @@ static NS_DEFINE_CID(kDOMEventGroupCID, NS_DOMEVENTGROUP_CID);
// FOR CSP (autogenerated by xpidl)
#include "nsIContentSecurityPolicy.h"
#include "nsHTMLStyleSheet.h"
#include "nsHTMLCSSStyleSheet.h"
#include "mozilla/dom/Link.h"
using namespace mozilla::dom;

View File

@ -95,13 +95,7 @@
#include "nsGkAtoms.h"
#include "nsIApplicationCache.h"
#include "nsIApplicationCacheContainer.h"
// Put these here so all document impls get them automatically
#include "nsHTMLStyleSheet.h"
#include "nsHTMLCSSStyleSheet.h"
#include "nsStyleSet.h"
#include "nsXMLEventsManager.h"
#include "pldhash.h"
#include "nsAttrAndChildArray.h"
#include "nsDOMAttributeMap.h"
@ -135,6 +129,9 @@ struct nsRadioGroupStruct;
class nsOnloadBlocker;
class nsUnblockOnloadEvent;
class nsChildContentList;
class nsXMLEventsManager;
class nsHTMLStyleSheet;
class nsHTMLCSSStyleSheet;
/**
* Right now our identifier map entries contain information for 'name'

View File

@ -74,16 +74,20 @@ enum nsDOMClassInfoID {
* to that interface from the *canonical* nsISupports!
*/
#define DOMCI_CASTABLE_INTERFACES(_extra) \
DOMCI_CASTABLE_INTERFACE(nsINode, 0, _extra) \
DOMCI_CASTABLE_INTERFACE(nsIContent, 1, _extra) \
DOMCI_CASTABLE_INTERFACE(nsIDocument, 2, _extra) \
DOMCI_CASTABLE_INTERFACE(nsINodeList, 3, _extra) \
DOMCI_CASTABLE_INTERFACE(nsICSSDeclaration, 4, _extra) \
DOMCI_CASTABLE_INTERFACE(nsGenericTextNode, 5, _extra)
DOMCI_CASTABLE_INTERFACE(nsINode, nsINode, 0, _extra) \
DOMCI_CASTABLE_INTERFACE(nsIContent, nsIContent, 1, _extra) \
DOMCI_CASTABLE_INTERFACE(nsIDocument, nsIDocument, 2, _extra) \
DOMCI_CASTABLE_INTERFACE(nsINodeList, nsINodeList, 3, _extra) \
DOMCI_CASTABLE_INTERFACE(nsICSSDeclaration, nsICSSDeclaration, 4, _extra) \
DOMCI_CASTABLE_INTERFACE(nsGenericTextNode, nsGenericTextNode, 5, _extra) \
DOMCI_CASTABLE_INTERFACE(nsDocument, nsIDocument, 6, _extra) \
DOMCI_CASTABLE_INTERFACE(nsGenericHTMLElement, nsGenericHTMLElement, 7, \
_extra) \
DOMCI_CASTABLE_INTERFACE(nsHTMLDocument, nsIDocument, 8, _extra)
// Make sure all classes mentioned in DOMCI_CASTABLE_INTERFACES
// have been declared.
#define DOMCI_CASTABLE_INTERFACE(_interface, _u1, _u2) class _interface;
#define DOMCI_CASTABLE_INTERFACE(_interface, _u1, _u2, _u3) class _interface;
DOMCI_CASTABLE_INTERFACES(unused)
#undef DOMCI_CASTABLE_INTERFACE
@ -135,7 +139,7 @@ template <typename Interface> struct DOMCI_CastableTo {
/**
* Here we calculate the bitmap for a given class.
*/
#define DOMCI_CASTABLE_INTERFACE(_interface, _bit, _class) \
#define DOMCI_CASTABLE_INTERFACE(_interface, _base, _bit, _class) \
(DOMCI_CASTABLE_TO(_interface, _class) ? 1 << _bit : 0) +
#define DOMCI_DATA(_dom_class, _class) \

View File

@ -121,6 +121,9 @@ LOCAL_INCLUDES = \
-I$(topsrcdir)/js/src/nanojit \
-I$(topsrcdir)/caps/include \
-I$(topsrcdir)/content/base/src \
-I$(topsrcdir)/content/html/content/src \
-I$(topsrcdir)/content/html/document/src \
-I$(topsrcdir)/layout/style \
$(NULL)
EXTRA_DSO_LDOPTS += \

View File

@ -141,8 +141,7 @@ members = [
'nsIDOMNode.removeChild',
'nsIDOMNode.hasAttributes',
'nsIDOMNode.attributes',
'nsIDOMNodeList.item',
'nsIDOMNodeList.length',
'nsIDOMNodeList.*',
'nsIDOMNodeSelector.querySelector',
'nsIDOMNodeSelector.querySelectorAll',
'nsIDOMText.splitText',
@ -150,9 +149,7 @@ members = [
'nsIDOM3Document.adoptNode',
'nsIDOM3Document.renameNode',
'nsIDOM3Node.*',
'nsIDOMDOMStringList.item',
'nsIDOMDOMStringList.length',
'nsIDOMDOMStringList.contains',
'nsIDOMDOMStringList.*',
'nsIDOMDOMTokenList.*',
'nsIDOMDOMSettableTokenList.*',
'nsIDOMNameList.getName',
@ -183,20 +180,17 @@ members = [
'nsIDOMNSElement.mozMatchesSelector',
# dom/interfaces/css
'nsIDOMElementCSSInlineStyle.style',
'nsIDOMElementCSSInlineStyle.*',
'nsIDOMCSS2Properties.*',
'nsIDOMNSCSS2Properties.*',
'nsIDOMRect.top',
'nsIDOMRect.right',
'nsIDOMRect.left',
'nsIDOMRect.bottom',
'nsIDOMRect.*',
'nsIDOMViewCSS.getComputedStyle',
# dom/interfaces/events
'nsIDOMEventTarget.dispatchEvent',
'nsIDOMEventTarget.removeEventListener',
'nsIDOMNSEventTarget.addEventListener',
'nsIDOMDocumentEvent.createEvent',
'nsIDOMDocumentEvent.*',
'nsIDOMEvent.*',
'nsIDOMMouseEvent.*',
@ -501,8 +495,11 @@ customIncludes = [
'nsIDocument.h',
'nsINodeList.h',
'nsCSSPropertiesQS.h',
'nsDocument.h',
'nsGenericDOMDataNode.h',
'nsGenericElement.h',
'nsGenericHTMLElement.h',
'nsHTMLDocument.h',
'nsDOMQS.h',
]
@ -626,17 +623,43 @@ customMethodCalls = {
' if(NS_FAILED(rv))\n'
' result = nsnull;'
},
'nsIDOMNode_GetNodeType': {
'thisType': 'nsINode',
'canFail': False
},
'nsIDOMNodeList_Item': {
'thisType': 'nsINodeList',
'code': ' nsINode *result = self->GetNodeAt(arg0);',
'canFail': False
},
'nsIDOMNodeList_GetLength': {
'thisType': 'nsINodeList'
},
'nsIDOMHTMLDocument_': {
'thisType': 'nsHTMLDocument'
},
'nsIDOMHTMLDocument_Write': {
'thisType': 'nsHTMLDocument',
'code': nsIDOMHTMLDocument_Write_customMethodCallCode % 'Write'
},
'nsIDOMHTMLDocument_Writeln': {
'thisType': 'nsHTMLDocument',
'code': nsIDOMHTMLDocument_Write_customMethodCallCode % 'Writeln'
},
'nsIDOMHTMLDocument_GetBody': {
'thisType': 'nsHTMLDocument',
'code': ' nsIContent *result = self->GetBody();',
'canFail': False
},
'nsIDOMHTMLDocument_GetElementsByName': {
'thisType': 'nsHTMLDocument',
'code': ' nsRefPtr<nsContentList> result = '
'self->GetElementsByName(arg0);',
'canFail': False
},
'nsIDOMNSHTMLDocument_': {
'thisType': 'nsHTMLDocument'
},
'nsIDOMStorage_Clear': {
'code': nsIDOMStorage_Clear_customMethodCallCode
},
@ -646,13 +669,7 @@ customMethodCalls = {
'nsIDOMCanvasRenderingContext2D_FillStyle': { 'skipgen': True },
'nsIDOMCSS2Properties_': CSS2Properties_,
'nsIDOMNSCSS2Properties_': CSS2Properties_,
'nsIDOMNSElement_GetClientRects': {
'thisType': 'nsGenericElement'
},
'nsIDOMNSElement_GetBoundingClientRect': {
'thisType': 'nsGenericElement'
},
'nsIDOMNSElement_GetElementsByClassName': {
'nsIDOMNSElement_': {
'thisType': 'nsGenericElement'
},
'nsIDOMNSElement_GetScrollWidth': {
@ -693,6 +710,9 @@ customMethodCalls = {
'code': ' PRBool result = self->MozMatchesSelector(arg0);',
'canFail': False
},
'nsIDOM3Text_': {
'thisType': 'nsGenericTextNode'
},
'nsIDOM3Text_IsElementContentWhitespace': {
'thisType': 'nsGenericTextNode',
'code': ' PRBool result = self->IsElementContentWhitespace();',
@ -703,9 +723,6 @@ customMethodCalls = {
'code': ' nsIContent* result = '
'self->ReplaceWholeText(PromiseFlatString(arg0), &rv);'
},
'nsIDOM3Text_WholeText': {
'thisType': 'nsGenericTextNode'
},
'nsIDOMNodeSelector_QuerySelector': {
'thisType': 'nsINode',
'code': ' nsIContent* result = '
@ -717,6 +734,9 @@ customMethodCalls = {
' rv = nsGenericElement::doQuerySelectorAll(self, '
'arg0, getter_AddRefs(result));'
},
'nsIDOM3Node_': {
'thisType': 'nsINode'
},
'nsIDOM3Node_GetBaseURI': {
'thisType': 'nsINode',
'canFail': False
@ -729,9 +749,6 @@ customMethodCalls = {
'thisType': 'nsINode',
'canFail': False
},
'nsIDOM3Node_SetTextContent': {
'thisType': 'nsINode'
},
'nsIDOM3Node_IsSameNode': {
'thisType': 'nsINode',
'arg0Type': 'nsINode',
@ -757,16 +774,41 @@ customMethodCalls = {
'code': ' PRBool result = self->IsEqualNode(arg0);',
'canFail': False
},
'nsIDOM3Node_GetFeature': {
'thisType': 'nsINode'
},
'nsIDOM3Node_GetUserData': {
'thisType': 'nsINode',
'code': ' nsIVariant *result = self->GetUserData(arg0);',
'canFail': False
},
'nsIDOM3Node_SetUserData': {
'thisType': 'nsINode'
'nsIDOMNSHTMLElement_': {
'thisType': 'nsGenericHTMLElement'
},
'nsIDOMDocument_': {
'thisType': 'nsDocument'
},
'nsIDOMDocument_GetElementById': {
'thisType': 'nsDocument',
'code': ' mozilla::dom::Element *result = self->GetElementById(arg0, &rv);'
},
'nsIDOMDocument_GetElementsByTagName': {
'thisType': 'nsDocument',
'code': ' nsRefPtr<nsContentList> result ='
'self->GetElementsByTagName(arg0);',
'canFail': False
},
'nsIDOMDocument_GetElementsByTagNameNS': {
'thisType': 'nsDocument',
'code': ' nsRefPtr<nsContentList> result ='
'self->GetElementsByTagNameNS(arg0, arg1);',
'canFail': False
},
'nsIDOMNSDocument_': {
'thisType': 'nsDocument'
},
'nsIDOM3Document_': {
'thisType': 'nsDocument'
},
'nsIDOMElement_': {
'thisType': 'nsGenericElement'
},
# WebGL
'nsICanvasRenderingContextWebGL_BufferData': CUSTOM_QS,

View File

@ -39,7 +39,7 @@
#include "nsDOMClassInfoID.h"
#define DEFINE_UNWRAP_CAST(_interface, _bit) \
#define DEFINE_UNWRAP_CAST(_interface, _base, _bit) \
NS_SPECIALIZE_TEMPLATE \
inline JSBool \
xpc_qsUnwrapThis<_interface>(JSContext *cx, \
@ -56,7 +56,7 @@ xpc_qsUnwrapThis<_interface>(JSContext *cx, \
&rv); \
if(!native) \
return xpc_qsThrow(cx, rv); \
*ppThis = static_cast<_interface*>(native); \
*ppThis = static_cast<_interface*>(static_cast<_base*>(native)); \
return JS_TRUE; \
} \
\
@ -72,12 +72,12 @@ xpc_qsUnwrapArg<_interface>(JSContext *cx, \
nsISupports *native = castNativeArgFromWrapper(cx, v, _bit, ppArgRef, vp, \
&rv); \
if(NS_SUCCEEDED(rv)) \
*ppArg = static_cast<_interface*>(native); \
*ppArg = static_cast<_interface*>(static_cast<_base*>(native)); \
return rv; \
}
#define DOMCI_CASTABLE_INTERFACE(_interface, _bit, _extra) \
DEFINE_UNWRAP_CAST(_interface, _bit)
#define DOMCI_CASTABLE_INTERFACE(_interface, _base, _bit, _extra) \
DEFINE_UNWRAP_CAST(_interface, _base, _bit)
DOMCI_CASTABLE_INTERFACES(unused)
@ -139,4 +139,10 @@ xpc_qsUnwrapArg<nsGenericElement>(JSContext *cx,
return rv;
}
inline nsISupports*
ToSupports(nsContentList *p)
{
return static_cast<nsINodeList*>(p);
}
#endif /* nsDOMQS_h__ */

View File

@ -389,6 +389,7 @@ class nsStyleSet
};
#ifdef _IMPL_NS_LAYOUT
inline
void nsRuleNode::AddRef()
{
@ -405,3 +406,5 @@ void nsRuleNode::Release()
}
}
#endif
#endif