Bug 498543 - Null-checking JS_THIS_OBJECT Results. r=jwalden

This commit is contained in:
Felix Fung 2011-12-01 13:30:28 -08:00
parent a76a0e42b5
commit 2a48036e59
12 changed files with 138 additions and 12 deletions

View File

@ -139,6 +139,9 @@ JSBool
EventTarget::AddEventListener(JSContext* aCx, uintN aArgc, jsval* aVp) EventTarget::AddEventListener(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return true;
}
EventTarget* self = GetPrivate(aCx, obj); EventTarget* self = GetPrivate(aCx, obj);
if (!self) { if (!self) {
@ -167,6 +170,9 @@ JSBool
EventTarget::RemoveEventListener(JSContext* aCx, uintN aArgc, jsval* aVp) EventTarget::RemoveEventListener(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return true;
}
EventTarget* self = GetPrivate(aCx, obj); EventTarget* self = GetPrivate(aCx, obj);
if (!self) { if (!self) {
@ -195,6 +201,9 @@ JSBool
EventTarget::DispatchEvent(JSContext* aCx, uintN aArgc, jsval* aVp) EventTarget::DispatchEvent(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return true;
}
EventTarget* self = GetPrivate(aCx, obj); EventTarget* self = GetPrivate(aCx, obj);
if (!self) { if (!self) {

View File

@ -317,6 +317,9 @@ private:
StopPropagation(JSContext* aCx, uintN aArgc, jsval* aVp) StopPropagation(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
Event* event = GetInstancePrivate(aCx, obj, sFunctions[0].name); Event* event = GetInstancePrivate(aCx, obj, sFunctions[0].name);
if (!event) { if (!event) {
@ -332,6 +335,9 @@ private:
StopImmediatePropagation(JSContext* aCx, uintN aArgc, jsval* aVp) StopImmediatePropagation(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
Event* event = GetInstancePrivate(aCx, obj, sFunctions[3].name); Event* event = GetInstancePrivate(aCx, obj, sFunctions[3].name);
if (!event) { if (!event) {
@ -347,6 +353,9 @@ private:
PreventDefault(JSContext* aCx, uintN aArgc, jsval* aVp) PreventDefault(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
Event* event = GetInstancePrivate(aCx, obj, sFunctions[1].name); Event* event = GetInstancePrivate(aCx, obj, sFunctions[1].name);
if (!event) { if (!event) {
@ -367,6 +376,9 @@ private:
InitEvent(JSContext* aCx, uintN aArgc, jsval* aVp) InitEvent(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
Event* event = GetInstancePrivate(aCx, obj, sFunctions[2].name); Event* event = GetInstancePrivate(aCx, obj, sFunctions[2].name);
if (!event) { if (!event) {
@ -627,6 +639,9 @@ private:
InitMessageEvent(JSContext* aCx, uintN aArgc, jsval* aVp) InitMessageEvent(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
MessageEvent* event = GetInstancePrivate(aCx, obj, sFunctions[0].name); MessageEvent* event = GetInstancePrivate(aCx, obj, sFunctions[0].name);
if (!event) { if (!event) {
@ -823,6 +838,9 @@ private:
InitErrorEvent(JSContext* aCx, uintN aArgc, jsval* aVp) InitErrorEvent(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
ErrorEvent* event = GetInstancePrivate(aCx, obj, sFunctions[0].name); ErrorEvent* event = GetInstancePrivate(aCx, obj, sFunctions[0].name);
if (!event) { if (!event) {
@ -1010,6 +1028,9 @@ private:
InitProgressEvent(JSContext* aCx, uintN aArgc, jsval* aVp) InitProgressEvent(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
ProgressEvent* event = GetInstancePrivate(aCx, obj, sFunctions[0].name); ProgressEvent* event = GetInstancePrivate(aCx, obj, sFunctions[0].name);
if (!event) { if (!event) {

View File

@ -122,6 +122,9 @@ private:
ToString(JSContext* aCx, uintN aArgc, jsval* aVp) ToString(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
JSClass* classPtr; JSClass* classPtr;
if (!obj || ((classPtr = JS_GET_CLASS(aCx, obj)) != &sClass)) { if (!obj || ((classPtr = JS_GET_CLASS(aCx, obj)) != &sClass)) {

View File

@ -185,6 +185,9 @@ private:
MozSlice(JSContext* aCx, uintN aArgc, jsval* aVp) MozSlice(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
nsIDOMBlob* blob = GetInstancePrivate(aCx, obj, "mozSlice"); nsIDOMBlob* blob = GetInstancePrivate(aCx, obj, "mozSlice");
if (!blob) { if (!blob) {

View File

@ -180,6 +180,9 @@ private:
ReadAsArrayBuffer(JSContext* aCx, uintN aArgc, jsval* aVp) ReadAsArrayBuffer(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
FileReaderSyncPrivate* fileReader = FileReaderSyncPrivate* fileReader =
GetInstancePrivate(aCx, obj, "readAsArrayBuffer"); GetInstancePrivate(aCx, obj, "readAsArrayBuffer");
@ -224,6 +227,9 @@ private:
ReadAsDataURL(JSContext* aCx, uintN aArgc, jsval* aVp) ReadAsDataURL(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
FileReaderSyncPrivate* fileReader = FileReaderSyncPrivate* fileReader =
GetInstancePrivate(aCx, obj, "readAsDataURL"); GetInstancePrivate(aCx, obj, "readAsDataURL");
@ -261,6 +267,9 @@ private:
ReadAsBinaryString(JSContext* aCx, uintN aArgc, jsval* aVp) ReadAsBinaryString(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
FileReaderSyncPrivate* fileReader = FileReaderSyncPrivate* fileReader =
GetInstancePrivate(aCx, obj, "readAsBinaryString"); GetInstancePrivate(aCx, obj, "readAsBinaryString");
@ -298,6 +307,9 @@ private:
ReadAsText(JSContext* aCx, uintN aArgc, jsval* aVp) ReadAsText(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
FileReaderSyncPrivate* fileReader = FileReaderSyncPrivate* fileReader =
GetInstancePrivate(aCx, obj, "readAsText"); GetInstancePrivate(aCx, obj, "readAsText");

View File

@ -267,6 +267,9 @@ private:
Terminate(JSContext* aCx, uintN aArgc, jsval* aVp) Terminate(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
const char*& name = sFunctions[0].name; const char*& name = sFunctions[0].name;
WorkerPrivate* worker = GetInstancePrivate(aCx, obj, name); WorkerPrivate* worker = GetInstancePrivate(aCx, obj, name);
@ -281,6 +284,9 @@ private:
PostMessage(JSContext* aCx, uintN aArgc, jsval* aVp) PostMessage(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
const char*& name = sFunctions[1].name; const char*& name = sFunctions[1].name;
WorkerPrivate* worker = GetInstancePrivate(aCx, obj, name); WorkerPrivate* worker = GetInstancePrivate(aCx, obj, name);

View File

@ -386,6 +386,9 @@ private:
Close(JSContext* aCx, uintN aArgc, jsval* aVp) Close(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[0].name); WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[0].name);
if (!scope) { if (!scope) {
@ -399,6 +402,9 @@ private:
ImportScripts(JSContext* aCx, uintN aArgc, jsval* aVp) ImportScripts(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[1].name); WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[1].name);
if (!scope) { if (!scope) {
@ -416,6 +422,9 @@ private:
SetTimeout(JSContext* aCx, uintN aArgc, jsval* aVp) SetTimeout(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[2].name); WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[2].name);
if (!scope) { if (!scope) {
@ -434,6 +443,9 @@ private:
ClearTimeout(JSContext* aCx, uintN aArgc, jsval* aVp) ClearTimeout(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[3].name); WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[3].name);
if (!scope) { if (!scope) {
@ -452,6 +464,9 @@ private:
SetInterval(JSContext* aCx, uintN aArgc, jsval* aVp) SetInterval(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[4].name); WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[4].name);
if (!scope) { if (!scope) {
@ -470,6 +485,9 @@ private:
ClearInterval(JSContext* aCx, uintN aArgc, jsval* aVp) ClearInterval(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[5].name); WorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, sFunctions[5].name);
if (!scope) { if (!scope) {
@ -487,8 +505,12 @@ private:
static JSBool static JSBool
Dump(JSContext* aCx, uintN aArgc, jsval* aVp) Dump(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
if (!GetInstancePrivate(aCx, JS_THIS_OBJECT(aCx, aVp), JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
sFunctions[6].name)) { if (!obj) {
return false;
}
if (!GetInstancePrivate(aCx, obj, sFunctions[6].name)) {
return false; return false;
} }
@ -513,8 +535,12 @@ private:
static JSBool static JSBool
AtoB(JSContext* aCx, uintN aArgc, jsval* aVp) AtoB(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
if (!GetInstancePrivate(aCx, JS_THIS_OBJECT(aCx, aVp), JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
sFunctions[7].name)) { if (!obj) {
return false;
}
if (!GetInstancePrivate(aCx, obj, sFunctions[7].name)) {
return false; return false;
} }
@ -535,8 +561,12 @@ private:
static JSBool static JSBool
BtoA(JSContext* aCx, uintN aArgc, jsval* aVp) BtoA(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
if (!GetInstancePrivate(aCx, JS_THIS_OBJECT(aCx, aVp), JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
sFunctions[8].name)) { if (!obj) {
return false;
}
if (!GetInstancePrivate(aCx, obj, sFunctions[8].name)) {
return false; return false;
} }
@ -754,6 +784,9 @@ private:
PostMessage(JSContext* aCx, uintN aArgc, jsval* aVp) PostMessage(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
const char*& name = sFunctions[0].name; const char*& name = sFunctions[0].name;
DedicatedWorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, name); DedicatedWorkerGlobalScope* scope = GetInstancePrivate(aCx, obj, name);

View File

@ -605,6 +605,9 @@ private:
Abort(JSContext* aCx, uintN aArgc, jsval* aVp) Abort(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
XMLHttpRequestPrivate* priv = XMLHttpRequestPrivate* priv =
GetInstancePrivate(aCx, obj, sFunctions[0].name); GetInstancePrivate(aCx, obj, sFunctions[0].name);
@ -619,6 +622,9 @@ private:
GetAllResponseHeaders(JSContext* aCx, uintN aArgc, jsval* aVp) GetAllResponseHeaders(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
XMLHttpRequestPrivate* priv = XMLHttpRequestPrivate* priv =
GetInstancePrivate(aCx, obj, sFunctions[1].name); GetInstancePrivate(aCx, obj, sFunctions[1].name);
@ -639,6 +645,9 @@ private:
GetResponseHeader(JSContext* aCx, uintN aArgc, jsval* aVp) GetResponseHeader(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
XMLHttpRequestPrivate* priv = XMLHttpRequestPrivate* priv =
GetInstancePrivate(aCx, obj, sFunctions[2].name); GetInstancePrivate(aCx, obj, sFunctions[2].name);
@ -675,6 +684,9 @@ private:
Open(JSContext* aCx, uintN aArgc, jsval* aVp) Open(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
XMLHttpRequestPrivate* priv = XMLHttpRequestPrivate* priv =
GetInstancePrivate(aCx, obj, sFunctions[3].name); GetInstancePrivate(aCx, obj, sFunctions[3].name);
@ -698,6 +710,9 @@ private:
Send(JSContext* aCx, uintN aArgc, jsval* aVp) Send(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
XMLHttpRequestPrivate* priv = XMLHttpRequestPrivate* priv =
GetInstancePrivate(aCx, obj, sFunctions[4].name); GetInstancePrivate(aCx, obj, sFunctions[4].name);
@ -714,6 +729,9 @@ private:
SendAsBinary(JSContext* aCx, uintN aArgc, jsval* aVp) SendAsBinary(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
XMLHttpRequestPrivate* priv = XMLHttpRequestPrivate* priv =
GetInstancePrivate(aCx, obj, sFunctions[5].name); GetInstancePrivate(aCx, obj, sFunctions[5].name);
@ -744,6 +762,9 @@ private:
SetRequestHeader(JSContext* aCx, uintN aArgc, jsval* aVp) SetRequestHeader(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
XMLHttpRequestPrivate* priv = XMLHttpRequestPrivate* priv =
GetInstancePrivate(aCx, obj, sFunctions[6].name); GetInstancePrivate(aCx, obj, sFunctions[6].name);
@ -764,6 +785,9 @@ private:
OverrideMimeType(JSContext* aCx, uintN aArgc, jsval* aVp) OverrideMimeType(JSContext* aCx, uintN aArgc, jsval* aVp)
{ {
JSObject* obj = JS_THIS_OBJECT(aCx, aVp); JSObject* obj = JS_THIS_OBJECT(aCx, aVp);
if (!obj) {
return false;
}
XMLHttpRequestPrivate* priv = XMLHttpRequestPrivate* priv =
GetInstancePrivate(aCx, obj, sFunctions[7].name); GetInstancePrivate(aCx, obj, sFunctions[7].name);

View File

@ -3904,8 +3904,11 @@ FunctionWrapper(JSContext *cx, uintN argc, jsval *vp)
return false; return false;
NS_ASSERTION(JSVAL_IS_OBJECT(v), "weird function"); NS_ASSERTION(JSVAL_IS_OBJECT(v), "weird function");
return JS_CallFunctionValue(cx, JS_THIS_OBJECT(cx, vp), v, JSObject *obj = JS_THIS_OBJECT(cx, vp);
argc, JS_ARGV(cx, vp), vp); if (!obj) {
return JS_FALSE;
}
return JS_CallFunctionValue(cx, obj, v, argc, JS_ARGV(cx, vp), vp);
} }
JSBool JSBool

View File

@ -450,7 +450,7 @@ static JSBool
XrayToString(JSContext *cx, uintN argc, jsval *vp) XrayToString(JSContext *cx, uintN argc, jsval *vp)
{ {
JSObject *wrapper = JS_THIS_OBJECT(cx, vp); JSObject *wrapper = JS_THIS_OBJECT(cx, vp);
if (!IsWrapper(wrapper) || !WrapperFactory::IsXrayWrapper(wrapper)) { if (!wrapper || !IsWrapper(wrapper) || !WrapperFactory::IsXrayWrapper(wrapper)) {
JS_ReportError(cx, "XrayToString called on an incompatible object"); JS_ReportError(cx, "XrayToString called on an incompatible object");
return false; return false;
} }

View File

@ -66,9 +66,13 @@ stepFunc(JSContext *aCtx,
{ {
nsCOMPtr<nsIXPConnect> xpc(Service::getXPConnect()); nsCOMPtr<nsIXPConnect> xpc(Service::getXPConnect());
nsCOMPtr<nsIXPConnectWrappedNative> wrapper; nsCOMPtr<nsIXPConnectWrappedNative> wrapper;
nsresult rv = xpc->GetWrappedNativeOfJSObject( JSObject *obj = JS_THIS_OBJECT(aCtx, _vp);
aCtx, JS_THIS_OBJECT(aCtx, _vp), getter_AddRefs(wrapper) if (!obj) {
); return JS_FALSE;
}
nsresult rv =
xpc->GetWrappedNativeOfJSObject(aCtx, obj, getter_AddRefs(wrapper));
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
::JS_ReportError(aCtx, "mozIStorageStatement::step() could not obtain native statement"); ::JS_ReportError(aCtx, "mozIStorageStatement::step() could not obtain native statement");
return JS_FALSE; return JS_FALSE;

View File

@ -217,6 +217,10 @@ JSHistogram_Add(JSContext *cx, uintN argc, jsval *vp)
if (TelemetryImpl::CanRecord()) { if (TelemetryImpl::CanRecord()) {
JSObject *obj = JS_THIS_OBJECT(cx, vp); JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj) {
return JS_FALSE;
}
Histogram *h = static_cast<Histogram*>(JS_GetPrivate(cx, obj)); Histogram *h = static_cast<Histogram*>(JS_GetPrivate(cx, obj));
if (h->histogram_type() == Histogram::BOOLEAN_HISTOGRAM) if (h->histogram_type() == Histogram::BOOLEAN_HISTOGRAM)
h->Add(!!value); h->Add(!!value);
@ -230,6 +234,10 @@ JSBool
JSHistogram_Snapshot(JSContext *cx, uintN argc, jsval *vp) JSHistogram_Snapshot(JSContext *cx, uintN argc, jsval *vp)
{ {
JSObject *obj = JS_THIS_OBJECT(cx, vp); JSObject *obj = JS_THIS_OBJECT(cx, vp);
if (!obj) {
return JS_FALSE;
}
Histogram *h = static_cast<Histogram*>(JS_GetPrivate(cx, obj)); Histogram *h = static_cast<Histogram*>(JS_GetPrivate(cx, obj));
JSObject *snapshot = JS_NewObject(cx, NULL, NULL, NULL); JSObject *snapshot = JS_NewObject(cx, NULL, NULL, NULL);
if (!snapshot) if (!snapshot)