Bug 1398499: Part 1 - Use separate cache paths for shared/unshared scripts. r=mccr8

Scripts for use in shared globals need to be compiled for non-syntactic
scopes, while scripts for standalone globals should be compiled as global
scripts for better performance.

Since the startup cache and script preloader store scripts as they were
compiled in the last session, when global sharing settings may have been
different, it can lead to a mismatch, and a crash, due to loading the wrong
type of script.

Using a separate cache path for each type of script fixes this problem, since
it ensures that the cached script will always be of the type we expect.

MozReview-Commit-ID: DnNb2Xi6KeL

--HG--
extra : rebase_source : d2474d1da3f8e1066c21a7c65693ea09ec5b8074
This commit is contained in:
Kris Maglione 2017-09-09 14:59:00 -07:00
Родитель bb4a414d58
Коммит 8b676de4b0
1 изменённых файлов: 4 добавлений и 2 удалений

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

@ -60,7 +60,8 @@ using namespace xpc;
using namespace JS; using namespace JS;
static const char kObserverServiceContractID[] = "@mozilla.org/observer-service;1"; static const char kObserverServiceContractID[] = "@mozilla.org/observer-service;1";
static const char kJSCachePrefix[] = "jsloader";
#define JS_CACHE_PREFIX(aType) "jsloader/" aType
/** /**
* Buffer sizes for serialization and deserialization of scripts. * Buffer sizes for serialization and deserialization of scripts.
@ -701,7 +702,8 @@ mozJSComponentLoader::ObjectForLocation(ComponentLoaderInfo& aInfo,
aInfo.EnsureResolvedURI(); aInfo.EnsureResolvedURI();
nsAutoCString cachePath(kJSCachePrefix); nsAutoCString cachePath(reuseGlobal ? JS_CACHE_PREFIX("non-syntactic")
: JS_CACHE_PREFIX("global"));
rv = PathifyURI(aInfo.ResolvedURI(), cachePath); rv = PathifyURI(aInfo.ResolvedURI(), cachePath);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);