Skip to content

Commit

Permalink
Bug 1456035: Part 2 - Add fast path for XPCWrappedJS QueryInterface w…
Browse files Browse the repository at this point in the history
…ith native helper. r=mccr8

When the QueryInterface method for an XPCWrappedJS class is implemented by the
native helper, we can avoid a lot of overhead by simply asking it if it
supports a given interface rather than going through all of the JSAPI call and
exception handling overhead we'd need otherwise.

MozReview-Commit-ID: FVAN3oYRE9I
  • Loading branch information
kmaglione committed Apr 23, 2018
1 parent 8728641 commit 5ccbf64
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions js/xpconnect/src/XPCWrappedJSClass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "mozilla/dom/DOMException.h"
#include "mozilla/dom/DOMExceptionBinding.h"
#include "mozilla/dom/DOMPrefs.h"
#include "mozilla/dom/MozQueryInterface.h"
#include "mozilla/jsipc/CrossProcessObjectWrappers.h"

#include "jsapi.h"
Expand Down Expand Up @@ -232,8 +233,14 @@ nsXPCWrappedJSClass::CallQueryInterfaceOnJSObject(JSContext* cx,
}
}

id = xpc_NewIDObject(cx, jsobj, aIID);
if (id) {
dom::MozQueryInterface* mozQI = nullptr;
if (NS_SUCCEEDED(UNWRAP_OBJECT(MozQueryInterface, &fun, mozQI))) {
if (mozQI->QueriesTo(aIID))
return jsobj.get();
return nullptr;
}

if ((id = xpc_NewIDObject(cx, jsobj, aIID))) {
// Throwing NS_NOINTERFACE is the prescribed way to fail QI from JS. It
// is not an exception that is ever worth reporting, but we don't want
// to eat all exceptions either.
Expand Down Expand Up @@ -275,10 +282,10 @@ nsXPCWrappedJSClass::CallQueryInterfaceOnJSObject(JSContext* cx,
} else if (!success) {
NS_WARNING("QI hook ran OOMed - this is probably a bug!");
}
}

if (success)
success = JS_ValueToObject(cx, retval, &retObj);
if (success)
success = JS_ValueToObject(cx, retval, &retObj);
}

return success ? retObj.get() : nullptr;
}
Expand Down

0 comments on commit 5ccbf64

Please sign in to comment.