зеркало из https://github.com/mozilla/gecko-dev.git
Bug 609942: anonfunfix for eval cache comparisons. (r=brendan)
This commit is contained in:
Родитель
e916a2c73e
Коммит
8dec940d29
|
@ -120,11 +120,14 @@ class AutoVersionAPI
|
|||
explicit AutoVersionAPI(JSContext *cx, JSVersion newVersion)
|
||||
: cx(cx), oldVersion(cx->findVersion()), oldVersionWasOverride(cx->isVersionOverridden()),
|
||||
oldOptions(cx->options) {
|
||||
JS_ASSERT(!VersionExtractFlags(newVersion) ||
|
||||
VersionExtractFlags(newVersion) == VersionFlags::HAS_XML);
|
||||
cx->options = VersionHasXML(newVersion)
|
||||
? (cx->options | JSOPTION_XML)
|
||||
: (cx->options & ~JSOPTION_XML);
|
||||
|
||||
/*
|
||||
* Note: ANONFUNFIX is ignored for backwards compatibility, must be set
|
||||
* via JS_SetOptions.
|
||||
*/
|
||||
cx->maybeOverrideVersion(newVersion);
|
||||
SyncOptionsToVersion(cx);
|
||||
}
|
||||
|
@ -1021,6 +1024,7 @@ CheckOptionVersionSync(JSContext *cx)
|
|||
uint32 options = cx->options;
|
||||
JSVersion version = cx->findVersion();
|
||||
JS_ASSERT(OptionsHasXML(options) == VersionHasXML(version));
|
||||
JS_ASSERT(OptionsHasAnonFunFix(options) == VersionHasAnonFunFix(version));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -742,11 +742,13 @@ js::SyncOptionsToVersion(JSContext* cx)
|
|||
{
|
||||
JSVersion version = cx->findVersion();
|
||||
uint32 options = cx->options;
|
||||
if (OptionsHasXML(options) == VersionHasXML(version)) {
|
||||
if (OptionsHasXML(options) == VersionHasXML(version) &&
|
||||
OptionsHasAnonFunFix(options) == VersionHasAnonFunFix(version)) {
|
||||
/* No need to override. */
|
||||
return false;
|
||||
}
|
||||
VersionSetXML(&version, OptionsHasXML(options));
|
||||
VersionSetAnonFunFix(&version, OptionsHasAnonFunFix(options));
|
||||
cx->maybeOverrideVersion(version);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1803,9 +1803,18 @@ OptionsSameVersionFlags(uint32 self, uint32 other)
|
|||
return !((self & mask) ^ (other & mask));
|
||||
}
|
||||
|
||||
/*
|
||||
* Flags accompany script version data so that a) dynamically created scripts
|
||||
* can inherit their caller's compile-time properties and b) scripts can be
|
||||
* appropriately compared in the eval cache across global option changes. An
|
||||
* example of the latter is enabling the top-level-anonymous-function-is-error
|
||||
* option: subsequent evals of the same, previously-valid script text may have
|
||||
* become invalid.
|
||||
*/
|
||||
namespace VersionFlags {
|
||||
static const uint32 MASK = 0x0FFF; /* see JSVersion in jspubtd.h */
|
||||
static const uint32 HAS_XML = 0x1000; /* flag induced by XML option */
|
||||
static const uint32 MASK = 0x0FFF; /* see JSVersion in jspubtd.h */
|
||||
static const uint32 HAS_XML = 0x1000; /* flag induced by XML option */
|
||||
static const uint32 ANONFUNFIX = 0x2000; /* see jsapi.h comment on JSOPTION_ANONFUNFIX */
|
||||
}
|
||||
|
||||
static inline JSVersion
|
||||
|
@ -1827,6 +1836,12 @@ VersionShouldParseXML(JSVersion version)
|
|||
return VersionHasXML(version) || VersionNumber(version) >= JSVERSION_1_6;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
VersionHasAnonFunFix(JSVersion version)
|
||||
{
|
||||
return !!(version & VersionFlags::ANONFUNFIX);
|
||||
}
|
||||
|
||||
static inline void
|
||||
VersionSetXML(JSVersion *version, bool enable)
|
||||
{
|
||||
|
@ -1836,6 +1851,15 @@ VersionSetXML(JSVersion *version, bool enable)
|
|||
*version = JSVersion(uint32(*version) & ~VersionFlags::HAS_XML);
|
||||
}
|
||||
|
||||
static inline void
|
||||
VersionSetAnonFunFix(JSVersion *version, bool enable)
|
||||
{
|
||||
if (enable)
|
||||
*version = JSVersion(uint32(*version) | VersionFlags::ANONFUNFIX);
|
||||
else
|
||||
*version = JSVersion(uint32(*version) & ~VersionFlags::ANONFUNFIX);
|
||||
}
|
||||
|
||||
static inline JSVersion
|
||||
VersionExtractFlags(JSVersion version)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче