зеркало из https://github.com/mozilla/gecko-dev.git
Using singleton 1-byte unicode encoders and decoders. This will
eliminate creation of about 1000 objects on startup. r=waterson,cata a=waterson
This commit is contained in:
Родитель
38497c25ca
Коммит
3a9b6ee54c
|
@ -46,6 +46,9 @@ static NS_DEFINE_CID(kStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
|
||||||
static NS_DEFINE_CID(kLocaleServiceCID, NS_LOCALESERVICE_CID);
|
static NS_DEFINE_CID(kLocaleServiceCID, NS_LOCALESERVICE_CID);
|
||||||
static NS_DEFINE_CID(kSupportsArrayCID, NS_SUPPORTSARRAY_CID);
|
static NS_DEFINE_CID(kSupportsArrayCID, NS_SUPPORTSARRAY_CID);
|
||||||
|
|
||||||
|
// Pattern of cached, commonly used, single byte encoder and decoder
|
||||||
|
#define NS_1BYTE_CODER_PATTERN "ISO-8859"
|
||||||
|
#define NS_1BYTE_CODER_PATTERN_LEN 8
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
// Class nsCharsetConverterManager [declaration]
|
// Class nsCharsetConverterManager [declaration]
|
||||||
|
|
||||||
|
@ -472,19 +475,33 @@ NS_IMETHODIMP nsCharsetConverterManager::GetUnicodeEncoder(
|
||||||
nsIUnicodeEncoder ** aResult)
|
nsIUnicodeEncoder ** aResult)
|
||||||
{
|
{
|
||||||
*aResult= nsnull;
|
*aResult= nsnull;
|
||||||
nsIComponentManager* comMgr;
|
nsresult res = NS_OK;
|
||||||
nsresult res;
|
|
||||||
res = NS_GetGlobalComponentManager(&comMgr);
|
static const char kUnicodeEncoderProgIDBase[] = NS_UNICODEENCODER_PROGID_BASE;
|
||||||
if(NS_FAILED(res))
|
static PRInt32 baselen = sizeof(kUnicodeEncoderProgIDBase) - 1;
|
||||||
return res;
|
|
||||||
PRInt32 baselen = nsCRT::strlen(NS_UNICODEENCODER_PROGID_BASE);
|
|
||||||
char progid[256];
|
char progid[256];
|
||||||
PL_strncpy(progid, NS_UNICODEENCODER_PROGID_BASE, 256);
|
PL_strncpy(progid, kUnicodeEncoderProgIDBase, 256);
|
||||||
aDest->ToCString(progid + baselen, 256 - baselen);
|
aDest->ToCString(progid + baselen, 256 - baselen);
|
||||||
res = comMgr->CreateInstanceByProgID(progid,NULL,
|
|
||||||
NS_GET_IID(nsIUnicodeEncoder),(void**)aResult);
|
nsCOMPtr<nsIUnicodeEncoder> encoder;
|
||||||
if(NS_FAILED(res))
|
if (!strncmp(progid+baselen, NS_1BYTE_CODER_PATTERN, NS_1BYTE_CODER_PATTERN_LEN))
|
||||||
|
{
|
||||||
|
// Single byte encoders/decoders dont hold state. Optimize by using a service.
|
||||||
|
encoder = do_GetService(progid, &res);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
encoder = do_CreateInstance(progid, &res);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NS_FAILED(res))
|
||||||
res = NS_ERROR_UCONV_NOCONV;
|
res = NS_ERROR_UCONV_NOCONV;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*aResult = encoder.get();
|
||||||
|
NS_ADDREF(*aResult);
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -493,19 +510,32 @@ NS_IMETHODIMP nsCharsetConverterManager::GetUnicodeDecoder(
|
||||||
nsIUnicodeDecoder ** aResult)
|
nsIUnicodeDecoder ** aResult)
|
||||||
{
|
{
|
||||||
*aResult= nsnull;
|
*aResult= nsnull;
|
||||||
nsIComponentManager* comMgr;
|
nsresult res = NS_OK;;
|
||||||
nsresult res;
|
|
||||||
res = NS_GetGlobalComponentManager(&comMgr);
|
static const char kUnicodeDecoderProgIDBase[] = NS_UNICODEDECODER_PROGID_BASE;
|
||||||
if(NS_FAILED(res))
|
static PRInt32 baselen = sizeof(kUnicodeDecoderProgIDBase) - 1;
|
||||||
return res;
|
|
||||||
PRInt32 baselen = nsCRT::strlen(NS_UNICODEDECODER_PROGID_BASE);
|
|
||||||
char progid[256];
|
char progid[256];
|
||||||
PL_strncpy(progid, NS_UNICODEDECODER_PROGID_BASE, 256);
|
PL_strncpy(progid, kUnicodeDecoderProgIDBase, 256);
|
||||||
aSrc->ToCString(progid + baselen, 256 - baselen);
|
aSrc->ToCString(progid + baselen, 256 - baselen);
|
||||||
res = comMgr->CreateInstanceByProgID(progid,NULL,
|
|
||||||
NS_GET_IID(nsIUnicodeDecoder),(void**)aResult);
|
nsCOMPtr<nsIUnicodeDecoder> decoder;
|
||||||
|
if (!strncmp(progid+baselen, NS_1BYTE_CODER_PATTERN, NS_1BYTE_CODER_PATTERN_LEN))
|
||||||
|
{
|
||||||
|
// Single byte decoders dont hold state. Optimize by using a service.
|
||||||
|
decoder = do_GetService(progid, &res);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
decoder = do_CreateInstance(progid, &res);
|
||||||
|
}
|
||||||
if(NS_FAILED(res))
|
if(NS_FAILED(res))
|
||||||
res = NS_ERROR_UCONV_NOCONV;
|
res = NS_ERROR_UCONV_NOCONV;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*aResult = decoder.get();
|
||||||
|
NS_ADDREF(*aResult);
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -538,21 +568,10 @@ NS_IMETHODIMP nsCharsetConverterManager::GetUnicodeDecoder(
|
||||||
if (aResult == NULL) return NS_ERROR_NULL_POINTER;
|
if (aResult == NULL) return NS_ERROR_NULL_POINTER;
|
||||||
*aResult = NULL;
|
*aResult = NULL;
|
||||||
|
|
||||||
nsresult res = NS_OK;
|
// XXX use nsImmutableString
|
||||||
|
nsAutoString name;
|
||||||
const PRUnichar * name;
|
NS_CONST_CAST(nsIAtom*, aCharset)->ToString(name);
|
||||||
res = ((nsIAtom *) aCharset)->GetUnicode(&name);
|
return GetUnicodeDecoder(&name, aResult);
|
||||||
if (NS_FAILED(res)) return res;
|
|
||||||
|
|
||||||
nsAutoString progID; progID.AssignWithConversion(NS_UNICODEDECODER_PROGID_BASE);
|
|
||||||
progID.Append(name);
|
|
||||||
char buff[256];
|
|
||||||
progID.ToCString(buff, 256);
|
|
||||||
|
|
||||||
res = nsComponentManager::CreateInstance(buff, NULL,
|
|
||||||
NS_GET_IID(nsIUnicodeDecoder), (void **) aResult);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NS_IMETHODIMP nsCharsetConverterManager::GetUnicodeEncoder(
|
NS_IMETHODIMP nsCharsetConverterManager::GetUnicodeEncoder(
|
||||||
|
@ -563,21 +582,10 @@ NS_IMETHODIMP nsCharsetConverterManager::GetUnicodeEncoder(
|
||||||
if (aResult == NULL) return NS_ERROR_NULL_POINTER;
|
if (aResult == NULL) return NS_ERROR_NULL_POINTER;
|
||||||
*aResult = NULL;
|
*aResult = NULL;
|
||||||
|
|
||||||
nsresult res = NS_OK;
|
// XXX use nsImmutableString
|
||||||
|
nsAutoString name;
|
||||||
const PRUnichar * name;
|
NS_CONST_CAST(nsIAtom*, aCharset)->ToString(name);
|
||||||
res = ((nsIAtom *) aCharset)->GetUnicode(&name);
|
return GetUnicodeEncoder(&name, aResult);
|
||||||
if (NS_FAILED(res)) return res;
|
|
||||||
|
|
||||||
nsAutoString progID; progID.AssignWithConversion(NS_UNICODEENCODER_PROGID_BASE);
|
|
||||||
progID.Append(name);
|
|
||||||
char buff[256];
|
|
||||||
progID.ToCString(buff, 256);
|
|
||||||
|
|
||||||
res = nsComponentManager::CreateInstance(buff, NULL,
|
|
||||||
NS_GET_IID(nsIUnicodeEncoder), (void **) aResult);
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX move this macro into the UnicodeDecoder/Encoder interface
|
// XXX move this macro into the UnicodeDecoder/Encoder interface
|
||||||
|
|
Загрузка…
Ссылка в новой задаче