Bug 1398601 - Add global/non-syntactic prefix to subscript loader cache r=kmag

We want to be able to store scripts compiled with or without
non-syntactic support in cache when we toggle JSM global sharing. In
current code this script is cloned on execution, but with JSM global
sharing we have would hit assertions.

MozReview-Commit-ID: 2pVTTxLpx6S
This commit is contained in:
Ted Campbell
2017-09-12 18:05:08 -04:00
parent ff3ffc21b1
commit 0c81c28ba7

View File

@@ -89,6 +89,21 @@ mozJSSubScriptLoader::~mozJSSubScriptLoader()
NS_IMPL_ISUPPORTS(mozJSSubScriptLoader, mozIJSSubScriptLoader)
#define JSSUB_CACHE_PREFIX(aType) "jssubloader/" aType
static void
SubscriptCachePath(JSContext* cx, nsIURI* uri, JS::HandleObject targetObj, nsACString& cachePath)
{
// StartupCache must distinguish between non-syntactic vs global, as well as
// javascript version when computing the cache key.
bool hasNonSyntacticScope = !JS_IsGlobalObject(targetObj);
JSVersion version = JS_GetVersion(cx);
cachePath.Assign(hasNonSyntacticScope ? JSSUB_CACHE_PREFIX("non-syntactic")
: JSSUB_CACHE_PREFIX("global"));
cachePath.AppendPrintf("/%d", version);
PathifyURI(uri, cachePath);
}
static void
ReportError(JSContext* cx, const nsACString& msg)
{
@@ -206,9 +221,7 @@ EvalScript(JSContext* cx,
if (script && (startupCache || preloadCache)) {
nsAutoCString cachePath;
JSVersion version = JS_GetVersion(cx);
cachePath.AppendPrintf("jssubloader/%d", version);
PathifyURI(uri, cachePath);
SubscriptCachePath(cx, uri, targetObj, cachePath);
nsCString uriStr;
if (preloadCache && NS_SUCCEEDED(uri->GetSpec(uriStr))) {
@@ -661,10 +674,8 @@ mozJSSubScriptLoader::DoLoadSubScriptWithOptions(const nsAString& url,
|| scheme.EqualsLiteral("blob");
StartupCache* cache = ignoreCache ? nullptr : StartupCache::GetSingleton();
JSVersion version = JS_GetVersion(cx);
nsAutoCString cachePath;
cachePath.AppendPrintf("jssubloader/%d", version);
PathifyURI(uri, cachePath);
SubscriptCachePath(cx, uri, targetObj, cachePath);
RootedScript script(cx);
if (!options.ignoreCache) {