Bug 609942: anonfunfix for eval cache comparisons. (r=brendan)

This commit is contained in:
Chris Leary 2010-11-09 09:00:54 -08:00
Родитель e916a2c73e
Коммит 8dec940d29
3 изменённых файлов: 35 добавлений и 5 удалений

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

@ -120,11 +120,14 @@ class AutoVersionAPI
explicit AutoVersionAPI(JSContext *cx, JSVersion newVersion) explicit AutoVersionAPI(JSContext *cx, JSVersion newVersion)
: cx(cx), oldVersion(cx->findVersion()), oldVersionWasOverride(cx->isVersionOverridden()), : cx(cx), oldVersion(cx->findVersion()), oldVersionWasOverride(cx->isVersionOverridden()),
oldOptions(cx->options) { oldOptions(cx->options) {
JS_ASSERT(!VersionExtractFlags(newVersion) ||
VersionExtractFlags(newVersion) == VersionFlags::HAS_XML);
cx->options = VersionHasXML(newVersion) cx->options = VersionHasXML(newVersion)
? (cx->options | JSOPTION_XML) ? (cx->options | JSOPTION_XML)
: (cx->options & ~JSOPTION_XML); : (cx->options & ~JSOPTION_XML);
/*
* Note: ANONFUNFIX is ignored for backwards compatibility, must be set
* via JS_SetOptions.
*/
cx->maybeOverrideVersion(newVersion); cx->maybeOverrideVersion(newVersion);
SyncOptionsToVersion(cx); SyncOptionsToVersion(cx);
} }
@ -1021,6 +1024,7 @@ CheckOptionVersionSync(JSContext *cx)
uint32 options = cx->options; uint32 options = cx->options;
JSVersion version = cx->findVersion(); JSVersion version = cx->findVersion();
JS_ASSERT(OptionsHasXML(options) == VersionHasXML(version)); JS_ASSERT(OptionsHasXML(options) == VersionHasXML(version));
JS_ASSERT(OptionsHasAnonFunFix(options) == VersionHasAnonFunFix(version));
#endif #endif
} }

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

@ -742,11 +742,13 @@ js::SyncOptionsToVersion(JSContext* cx)
{ {
JSVersion version = cx->findVersion(); JSVersion version = cx->findVersion();
uint32 options = cx->options; uint32 options = cx->options;
if (OptionsHasXML(options) == VersionHasXML(version)) { if (OptionsHasXML(options) == VersionHasXML(version) &&
OptionsHasAnonFunFix(options) == VersionHasAnonFunFix(version)) {
/* No need to override. */ /* No need to override. */
return false; return false;
} }
VersionSetXML(&version, OptionsHasXML(options)); VersionSetXML(&version, OptionsHasXML(options));
VersionSetAnonFunFix(&version, OptionsHasAnonFunFix(options));
cx->maybeOverrideVersion(version); cx->maybeOverrideVersion(version);
return true; return true;
} }

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

@ -1803,9 +1803,18 @@ OptionsSameVersionFlags(uint32 self, uint32 other)
return !((self & mask) ^ (other & mask)); 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 { namespace VersionFlags {
static const uint32 MASK = 0x0FFF; /* see JSVersion in jspubtd.h */ static const uint32 MASK = 0x0FFF; /* see JSVersion in jspubtd.h */
static const uint32 HAS_XML = 0x1000; /* flag induced by XML option */ 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 static inline JSVersion
@ -1827,6 +1836,12 @@ VersionShouldParseXML(JSVersion version)
return VersionHasXML(version) || VersionNumber(version) >= JSVERSION_1_6; return VersionHasXML(version) || VersionNumber(version) >= JSVERSION_1_6;
} }
static inline bool
VersionHasAnonFunFix(JSVersion version)
{
return !!(version & VersionFlags::ANONFUNFIX);
}
static inline void static inline void
VersionSetXML(JSVersion *version, bool enable) VersionSetXML(JSVersion *version, bool enable)
{ {
@ -1836,6 +1851,15 @@ VersionSetXML(JSVersion *version, bool enable)
*version = JSVersion(uint32(*version) & ~VersionFlags::HAS_XML); *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 static inline JSVersion
VersionExtractFlags(JSVersion version) VersionExtractFlags(JSVersion version)
{ {