Bug 701863 - make JS/C++ divide explicit; r=taras

This commit is contained in:
Nathan Froyd 2012-01-06 14:39:29 -05:00
Родитель cb5200e379
Коммит ed26231443
1 изменённых файлов: 30 добавлений и 19 удалений

Просмотреть файл

@ -84,6 +84,8 @@ public:
private: private:
bool AddSQLInfo(JSContext *cx, JSObject *rootObj, bool mainThread); bool AddSQLInfo(JSContext *cx, JSObject *rootObj, bool mainThread);
// Like GetHistogramById, but returns the underlying C++ object, not the JS one.
nsresult GetHistogramByName(const nsACString &name, Histogram **ret);
// This is used for speedy JS string->Telemetry::ID conversions // This is used for speedy JS string->Telemetry::ID conversions
typedef nsBaseHashtableET<nsCharPtrHashKey, Telemetry::ID> CharPtrEntryType; typedef nsBaseHashtableET<nsCharPtrHashKey, Telemetry::ID> CharPtrEntryType;
typedef nsTHashtable<CharPtrEntryType> HistogramMapType; typedef nsTHashtable<CharPtrEntryType> HistogramMapType;
@ -389,6 +391,33 @@ TelemetryImpl::AddSQLInfo(JSContext *cx, JSObject *rootObj, bool mainThread)
} }
nsresult
TelemetryImpl::GetHistogramByName(const nsACString &name, Histogram **ret)
{
// Cache names
// Note the histogram names are statically allocated
if (!mHistogramMap.Count()) {
for (PRUint32 i = 0; i < Telemetry::HistogramCount; i++) {
CharPtrEntryType *entry = mHistogramMap.PutEntry(gHistograms[i].id);
if (NS_UNLIKELY(!entry)) {
mHistogramMap.Clear();
return NS_ERROR_OUT_OF_MEMORY;
}
entry->mData = (Telemetry::ID) i;
}
}
CharPtrEntryType *entry = mHistogramMap.GetEntry(PromiseFlatCString(name).get());
if (!entry)
return NS_ERROR_FAILURE;
nsresult rv = GetHistogramByEnumId(entry->mData, ret);
if (NS_FAILED(rv))
return rv;
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
TelemetryImpl::GetHistogramSnapshots(JSContext *cx, jsval *ret) TelemetryImpl::GetHistogramSnapshots(JSContext *cx, jsval *ret)
{ {
@ -434,26 +463,8 @@ TelemetryImpl::GetSlowSQL(JSContext *cx, jsval *ret)
NS_IMETHODIMP NS_IMETHODIMP
TelemetryImpl::GetHistogramById(const nsACString &name, JSContext *cx, jsval *ret) TelemetryImpl::GetHistogramById(const nsACString &name, JSContext *cx, jsval *ret)
{ {
// Cache names
// Note the histogram names are statically allocated
if (!mHistogramMap.Count()) {
for (PRUint32 i = 0; i < Telemetry::HistogramCount; i++) {
CharPtrEntryType *entry = mHistogramMap.PutEntry(gHistograms[i].id);
if (NS_UNLIKELY(!entry)) {
mHistogramMap.Clear();
return NS_ERROR_OUT_OF_MEMORY;
}
entry->mData = (Telemetry::ID) i;
}
}
CharPtrEntryType *entry = mHistogramMap.GetEntry(PromiseFlatCString(name).get());
if (!entry)
return NS_ERROR_FAILURE;
Histogram *h; Histogram *h;
nsresult rv = GetHistogramByName(name, &h);
nsresult rv = GetHistogramByEnumId(entry->mData, &h);
if (NS_FAILED(rv)) if (NS_FAILED(rv))
return rv; return rv;