Diff
Modified: trunk/Source/_javascript_Core/API/JSScriptRef.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/API/JSScriptRef.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/API/JSScriptRef.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -68,7 +68,10 @@
static bool parseScript(VM* vm, const SourceCode& source, ParserError& error)
{
- return !!JSC::parse<JSC::ProgramNode>(vm, source, 0, Identifier(), JSParseNormal, JSParseProgramCode, error);
+ return !!JSC::parse<JSC::ProgramNode>(
+ vm, source, 0, Identifier(), JSParserBuiltinMode::NotBuiltin,
+ JSParserStrictMode::NotStrict, JSParserCodeType::Program,
+ error);
}
extern "C" {
Modified: trunk/Source/_javascript_Core/ChangeLog (181663 => 181664)
--- trunk/Source/_javascript_Core/ChangeLog 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/ChangeLog 2015-03-17 21:15:03 UTC (rev 181664)
@@ -1,3 +1,69 @@
+2015-03-17 Geoffrey Garen <[email protected]>
+
+ Built-in functions should know that they use strict mode
+ https://bugs.webkit.org/show_bug.cgi?id=142788
+
+ Reviewed by Mark Lam.
+
+ Even though all of our builtin functions use strict mode, the parser
+ thinks that they don't. This is because Executable::toStrictness treats
+ builtin-ness and strict-ness as mutually exclusive.
+
+ The fix is to disambiguate builtin-ness from strict-ness.
+
+ This bug is currently unobservable because of some other parser bugs. But
+ it causes lots of test failures once those other bugs are fixed.
+
+ * API/JSScriptRef.cpp:
+ (parseScript):
+ * builtins/BuiltinExecutables.cpp:
+ (JSC::BuiltinExecutables::createBuiltinExecutable): Adopt the new API
+ for a separate value to indicate builtin-ness vs strict-ness.
+
+ * bytecode/UnlinkedCodeBlock.cpp:
+ (JSC::generateFunctionCodeBlock):
+ (JSC::UnlinkedFunctionExecutable::codeBlockFor): Ditto.
+
+ * bytecode/UnlinkedCodeBlock.h:
+ (JSC::UnlinkedFunctionExecutable::toStrictness): Deleted. This function
+ was misleading since it pretended that no builtin function was ever
+ strict, which is the opposite of true.
+
+ * parser/Lexer.cpp:
+ (JSC::Lexer<T>::Lexer):
+ * parser/Lexer.h:
+ * parser/Parser.cpp:
+ (JSC::Parser<LexerType>::Parser):
+ * parser/Parser.h:
+ (JSC::parse): Adopt the new API.
+
+ * parser/ParserModes.h: Added JSParserBuiltinMode, and tried to give
+ existing modes clearer names.
+
+ * runtime/CodeCache.cpp:
+ (JSC::CodeCache::getGlobalCodeBlock):
+ (JSC::CodeCache::getProgramCodeBlock):
+ (JSC::CodeCache::getEvalCodeBlock):
+ (JSC::CodeCache::getFunctionExecutableFromGlobalCode): Adopt the new API.
+
+ * runtime/CodeCache.h:
+ (JSC::SourceCodeKey::SourceCodeKey): Be sure to treat strict-ness and
+ bulitin-ness as separate pieces of the code cache key. We would not want
+ a user function to match a built-in function in the cache, even if they
+ agreed about strictness, since builtin functions have different lexing
+ rules.
+
+ * runtime/Completion.cpp:
+ (JSC::checkSyntax):
+ * runtime/Executable.cpp:
+ (JSC::FunctionExecutable::FunctionExecutable):
+ (JSC::ProgramExecutable::checkSyntax):
+ * runtime/Executable.h:
+ (JSC::FunctionExecutable::create):
+ * runtime/JSGlobalObject.cpp:
+ (JSC::JSGlobalObject::createProgramCodeBlock):
+ (JSC::JSGlobalObject::createEvalCodeBlock): Adopt the new API.
+
2015-03-16 Filip Pizlo <[email protected]>
DFG IR shouldn't have a separate node for every kind of put hint that could be described using PromotedLocationDescriptor
Modified: trunk/Source/_javascript_Core/builtins/BuiltinExecutables.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/builtins/BuiltinExecutables.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/builtins/BuiltinExecutables.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -65,10 +65,13 @@
JSTextPosition positionBeforeLastNewline;
ParserError error;
bool isParsingDefaultConstructor = constructorKind != ConstructorKind::None;
- JSParserStrictness strictness = isParsingDefaultConstructor ? JSParseNormal : JSParseBuiltin;
+ JSParserBuiltinMode builtinMode = isParsingDefaultConstructor ? JSParserBuiltinMode::NotBuiltin : JSParserBuiltinMode::Builtin;
UnlinkedFunctionKind kind = isParsingDefaultConstructor ? UnlinkedNormalFunction : UnlinkedBuiltinFunction;
RefPtr<SourceProvider> sourceOverride = isParsingDefaultConstructor ? source.provider() : nullptr;
- std::unique_ptr<ProgramNode> program = parse<ProgramNode>(&m_vm, source, 0, Identifier(), strictness, JSParseProgramCode,
+ std::unique_ptr<ProgramNode> program = parse<ProgramNode>(
+ &m_vm, source, 0, Identifier(), builtinMode,
+ JSParserStrictMode::NotStrict,
+ JSParserCodeType::Program,
error, &positionBeforeLastNewline, false, constructorKind);
if (!program) {
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -49,9 +49,16 @@
const ClassInfo UnlinkedEvalCodeBlock::s_info = { "UnlinkedEvalCodeBlock", &Base::s_info, 0, CREATE_METHOD_TABLE(UnlinkedEvalCodeBlock) };
const ClassInfo UnlinkedFunctionCodeBlock::s_info = { "UnlinkedFunctionCodeBlock", &Base::s_info, 0, CREATE_METHOD_TABLE(UnlinkedFunctionCodeBlock) };
-static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock(VM& vm, UnlinkedFunctionExecutable* executable, const SourceCode& source, CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode, UnlinkedFunctionKind functionKind, bool bodyIncludesBraces, ParserError& error)
+static UnlinkedFunctionCodeBlock* generateFunctionCodeBlock(
+ VM& vm, UnlinkedFunctionExecutable* executable, const SourceCode& source,
+ CodeSpecializationKind kind, DebuggerMode debuggerMode, ProfilerMode profilerMode,
+ UnlinkedFunctionKind functionKind, bool bodyIncludesBraces, ParserError& error)
{
- std::unique_ptr<FunctionNode> function = parse<FunctionNode>(&vm, source, executable->parameters(), executable->name(), executable->toStrictness(), JSParseFunctionCode, error, 0, bodyIncludesBraces);
+ JSParserBuiltinMode builtinMode = executable->isBuiltinFunction() ? JSParserBuiltinMode::Builtin : JSParserBuiltinMode::NotBuiltin;
+ JSParserStrictMode strictMode = executable->isInStrictContext() ? JSParserStrictMode::Strict : JSParserStrictMode::NotStrict;
+ std::unique_ptr<FunctionNode> function = parse<FunctionNode>(
+ &vm, source, executable->parameters(), executable->name(), builtinMode,
+ strictMode, JSParserCodeType::Function, error, 0, bodyIncludesBraces);
if (!function) {
ASSERT(error.isValid());
@@ -177,7 +184,10 @@
return executable;
}
-UnlinkedFunctionCodeBlock* UnlinkedFunctionExecutable::codeBlockFor(VM& vm, const SourceCode& source, CodeSpecializationKind specializationKind, DebuggerMode debuggerMode, ProfilerMode profilerMode, bool bodyIncludesBraces, ParserError& error)
+UnlinkedFunctionCodeBlock* UnlinkedFunctionExecutable::codeBlockFor(
+ VM& vm, const SourceCode& source, CodeSpecializationKind specializationKind,
+ DebuggerMode debuggerMode, ProfilerMode profilerMode, bool bodyIncludesBraces,
+ ParserError& error)
{
switch (specializationKind) {
case CodeForCall:
@@ -190,7 +200,10 @@
break;
}
- UnlinkedFunctionCodeBlock* result = generateFunctionCodeBlock(vm, this, source, specializationKind, debuggerMode, profilerMode, isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction, bodyIncludesBraces, error);
+ UnlinkedFunctionCodeBlock* result = generateFunctionCodeBlock(
+ vm, this, source, specializationKind, debuggerMode, profilerMode,
+ isBuiltinFunction() ? UnlinkedBuiltinFunction : UnlinkedNormalFunction,
+ bodyIncludesBraces, error);
if (error.isValid())
return nullptr;
Modified: trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h (181663 => 181664)
--- trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/bytecode/UnlinkedCodeBlock.h 2015-03-17 21:15:03 UTC (rev 181664)
@@ -121,14 +121,6 @@
size_t parameterCount() const;
bool isInStrictContext() const { return m_isInStrictContext; }
FunctionMode functionMode() const { return m_functionMode; }
- JSParserStrictness toStrictness() const
- {
- if (m_isBuiltinFunction)
- return JSParseBuiltin;
- if (m_isInStrictContext)
- return JSParseStrict;
- return JSParseNormal;
- }
ConstructorKind constructorKind() const { return static_cast<ConstructorKind>(m_constructorKind); }
unsigned unlinkedFunctionNameStart() const { return m_unlinkedFunctionNameStart; }
@@ -141,7 +133,9 @@
String paramString() const;
- UnlinkedFunctionCodeBlock* codeBlockFor(VM&, const SourceCode&, CodeSpecializationKind, DebuggerMode, ProfilerMode, bool bodyIncludesBraces, ParserError&);
+ UnlinkedFunctionCodeBlock* codeBlockFor(
+ VM&, const SourceCode&, CodeSpecializationKind, DebuggerMode, ProfilerMode,
+ bool bodyIncludesBraces, ParserError&);
static UnlinkedFunctionExecutable* fromGlobalCode(const Identifier&, ExecState&, const SourceCode&, JSObject*& exception);
Modified: trunk/Source/_javascript_Core/parser/Lexer.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/parser/Lexer.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/parser/Lexer.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -488,10 +488,10 @@
};
template <typename T>
-Lexer<T>::Lexer(VM* vm, JSParserStrictness strictness)
+Lexer<T>::Lexer(VM* vm, JSParserBuiltinMode builtinMode)
: m_isReparsing(false)
, m_vm(vm)
- , m_parsingBuiltinFunction(strictness == JSParseBuiltin)
+ , m_parsingBuiltinFunction(builtinMode == JSParserBuiltinMode::Builtin)
{
}
Modified: trunk/Source/_javascript_Core/parser/Lexer.h (181663 => 181664)
--- trunk/Source/_javascript_Core/parser/Lexer.h 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/parser/Lexer.h 2015-03-17 21:15:03 UTC (rev 181664)
@@ -71,7 +71,7 @@
WTF_MAKE_FAST_ALLOCATED;
public:
- Lexer(VM*, JSParserStrictness);
+ Lexer(VM*, JSParserBuiltinMode);
~Lexer();
// Character manipulation functions.
Modified: trunk/Source/_javascript_Core/parser/Parser.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/parser/Parser.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/parser/Parser.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -190,7 +190,11 @@
}
template <typename LexerType>
-Parser<LexerType>::Parser(VM* vm, const SourceCode& source, FunctionParameters* parameters, const Identifier& name, JSParserStrictness strictness, JSParserMode parserMode, ConstructorKind defaultConstructorKind)
+Parser<LexerType>::Parser(
+ VM* vm, const SourceCode& source, FunctionParameters* parameters,
+ const Identifier& name, JSParserBuiltinMode builtinMode,
+ JSParserStrictMode strictMode, JSParserCodeType codeType,
+ ConstructorKind defaultConstructorKind)
: m_vm(vm)
, m_source(&source)
, m_hasStackOverflow(false)
@@ -203,10 +207,10 @@
, m_lastIdentifier(0)
, m_lastFunctionName(nullptr)
, m_sourceElements(0)
- , m_parsingBuiltin(strictness == JSParseBuiltin)
+ , m_parsingBuiltin(builtinMode == JSParserBuiltinMode::Builtin)
, m_defaultConstructorKind(defaultConstructorKind)
{
- m_lexer = std::make_unique<LexerType>(vm, strictness);
+ m_lexer = std::make_unique<LexerType>(vm, builtinMode);
m_lexer->setCode(source, &m_parserArena);
m_token.m_location.line = source.firstLine();
m_token.m_location.startOffset = source.startOffset();
@@ -214,9 +218,9 @@
m_token.m_location.lineStartOffset = source.startOffset();
m_functionCache = vm->addSourceProviderCache(source.provider());
ScopeRef scope = pushScope();
- if (parserMode == JSParseFunctionCode)
+ if (codeType == JSParserCodeType::Function)
scope->setIsFunction();
- if (strictness == JSParseStrict)
+ if (strictMode == JSParserStrictMode::Strict)
scope->setStrictMode();
if (parameters) {
bool hadBindingParameters = false;
Modified: trunk/Source/_javascript_Core/parser/Parser.h (181663 => 181664)
--- trunk/Source/_javascript_Core/parser/Parser.h 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/parser/Parser.h 2015-03-17 21:15:03 UTC (rev 181664)
@@ -426,7 +426,9 @@
WTF_MAKE_FAST_ALLOCATED;
public:
- Parser(VM*, const SourceCode&, FunctionParameters*, const Identifier&, JSParserStrictness, JSParserMode,
+ Parser(
+ VM*, const SourceCode&, FunctionParameters*, const Identifier&,
+ JSParserBuiltinMode, JSParserStrictMode, JSParserCodeType,
ConstructorKind defaultConstructorKind = ConstructorKind::None);
~Parser();
@@ -981,19 +983,23 @@
}
template <class ParsedNode>
-std::unique_ptr<ParsedNode> parse(VM* vm, const SourceCode& source, FunctionParameters* parameters, const Identifier& name,
- JSParserStrictness strictness, JSParserMode parserMode, ParserError& error, JSTextPosition* positionBeforeLastNewline = 0,
- bool needReparsingAdjustment = false, ConstructorKind defaultConstructorKind = ConstructorKind::None)
+std::unique_ptr<ParsedNode> parse(
+ VM* vm, const SourceCode& source, FunctionParameters* parameters,
+ const Identifier& name, JSParserBuiltinMode builtinMode,
+ JSParserStrictMode strictMode, JSParserCodeType codeType,
+ ParserError& error, JSTextPosition* positionBeforeLastNewline = 0,
+ bool needReparsingAdjustment = false,
+ ConstructorKind defaultConstructorKind = ConstructorKind::None)
{
SamplingRegion samplingRegion("Parsing");
ASSERT(!source.provider()->source().isNull());
if (source.provider()->source().is8Bit()) {
- Parser<Lexer<LChar>> parser(vm, source, parameters, name, strictness, parserMode, defaultConstructorKind);
+ Parser<Lexer<LChar>> parser(vm, source, parameters, name, builtinMode, strictMode, codeType, defaultConstructorKind);
std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error, needReparsingAdjustment);
if (positionBeforeLastNewline)
*positionBeforeLastNewline = parser.positionBeforeLastNewline();
- if (strictness == JSParseBuiltin) {
+ if (builtinMode == JSParserBuiltinMode::Builtin) {
if (!result)
WTF::dataLog("Error compiling builtin: ", error.message(), "\n");
RELEASE_ASSERT(result);
@@ -1001,7 +1007,7 @@
}
return result;
}
- Parser<Lexer<UChar>> parser(vm, source, parameters, name, strictness, parserMode);
+ Parser<Lexer<UChar>> parser(vm, source, parameters, name, builtinMode, strictMode, codeType);
std::unique_ptr<ParsedNode> result = parser.parse<ParsedNode>(error, needReparsingAdjustment);
if (positionBeforeLastNewline)
*positionBeforeLastNewline = parser.positionBeforeLastNewline();
Modified: trunk/Source/_javascript_Core/parser/ParserModes.h (181663 => 181664)
--- trunk/Source/_javascript_Core/parser/ParserModes.h 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/parser/ParserModes.h 2015-03-17 21:15:03 UTC (rev 181664)
@@ -31,8 +31,9 @@
namespace JSC {
-enum JSParserStrictness { JSParseNormal, JSParseBuiltin, JSParseStrict };
-enum JSParserMode { JSParseProgramCode, JSParseFunctionCode };
+enum class JSParserStrictMode { NotStrict, Strict };
+enum class JSParserBuiltinMode { NotBuiltin, Builtin };
+enum class JSParserCodeType { Program, Function };
enum class ConstructorKind { None, Base, Derived };
enum class SuperBinding { Needed, NotNeeded };
Modified: trunk/Source/_javascript_Core/runtime/CodeCache.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/runtime/CodeCache.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/runtime/CodeCache.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -75,9 +75,9 @@
};
template <class UnlinkedCodeBlockType, class ExecutableType>
-UnlinkedCodeBlockType* CodeCache::getGlobalCodeBlock(VM& vm, ExecutableType* executable, const SourceCode& source, JSParserStrictness strictness, DebuggerMode debuggerMode, ProfilerMode profilerMode, ParserError& error)
+UnlinkedCodeBlockType* CodeCache::getGlobalCodeBlock(VM& vm, ExecutableType* executable, const SourceCode& source, JSParserBuiltinMode builtinMode, JSParserStrictMode strictMode, DebuggerMode debuggerMode, ProfilerMode profilerMode, ParserError& error)
{
- SourceCodeKey key = SourceCodeKey(source, String(), CacheTypes<UnlinkedCodeBlockType>::codeType, strictness);
+ SourceCodeKey key = SourceCodeKey(source, String(), CacheTypes<UnlinkedCodeBlockType>::codeType, builtinMode, strictMode);
SourceCodeValue* cache = m_sourceCode.findCacheAndUpdateAge(key);
bool canCache = debuggerMode == DebuggerOff && profilerMode == ProfilerOff && !vm.typeProfiler() && !vm.controlFlowProfiler();
if (cache && canCache) {
@@ -92,7 +92,9 @@
}
typedef typename CacheTypes<UnlinkedCodeBlockType>::RootNode RootNode;
- std::unique_ptr<RootNode> rootNode = parse<RootNode>(&vm, source, 0, Identifier(), strictness, JSParseProgramCode, error);
+ std::unique_ptr<RootNode> rootNode = parse<RootNode>(
+ &vm, source, 0, Identifier(), builtinMode, strictMode,
+ JSParserCodeType::Program, error);
if (!rootNode)
return nullptr;
@@ -118,25 +120,31 @@
return unlinkedCodeBlock;
}
-UnlinkedProgramCodeBlock* CodeCache::getProgramCodeBlock(VM& vm, ProgramExecutable* executable, const SourceCode& source, JSParserStrictness strictness, DebuggerMode debuggerMode, ProfilerMode profilerMode, ParserError& error)
+UnlinkedProgramCodeBlock* CodeCache::getProgramCodeBlock(VM& vm, ProgramExecutable* executable, const SourceCode& source, JSParserBuiltinMode builtinMode, JSParserStrictMode strictMode, DebuggerMode debuggerMode, ProfilerMode profilerMode, ParserError& error)
{
- return getGlobalCodeBlock<UnlinkedProgramCodeBlock>(vm, executable, source, strictness, debuggerMode, profilerMode, error);
+ return getGlobalCodeBlock<UnlinkedProgramCodeBlock>(vm, executable, source, builtinMode, strictMode, debuggerMode, profilerMode, error);
}
-UnlinkedEvalCodeBlock* CodeCache::getEvalCodeBlock(VM& vm, EvalExecutable* executable, const SourceCode& source, JSParserStrictness strictness, DebuggerMode debuggerMode, ProfilerMode profilerMode, ParserError& error)
+UnlinkedEvalCodeBlock* CodeCache::getEvalCodeBlock(VM& vm, EvalExecutable* executable, const SourceCode& source, JSParserBuiltinMode builtinMode, JSParserStrictMode strictMode, DebuggerMode debuggerMode, ProfilerMode profilerMode, ParserError& error)
{
- return getGlobalCodeBlock<UnlinkedEvalCodeBlock>(vm, executable, source, strictness, debuggerMode, profilerMode, error);
+ return getGlobalCodeBlock<UnlinkedEvalCodeBlock>(vm, executable, source, builtinMode, strictMode, debuggerMode, profilerMode, error);
}
UnlinkedFunctionExecutable* CodeCache::getFunctionExecutableFromGlobalCode(VM& vm, const Identifier& name, const SourceCode& source, ParserError& error)
{
- SourceCodeKey key = SourceCodeKey(source, name.string(), SourceCodeKey::FunctionType, JSParseNormal);
+ SourceCodeKey key = SourceCodeKey(
+ source, name.string(), SourceCodeKey::FunctionType,
+ JSParserBuiltinMode::NotBuiltin,
+ JSParserStrictMode::NotStrict);
SourceCodeValue* cache = m_sourceCode.findCacheAndUpdateAge(key);
if (cache)
return jsCast<UnlinkedFunctionExecutable*>(cache->cell.get());
JSTextPosition positionBeforeLastNewline;
- std::unique_ptr<ProgramNode> program = parse<ProgramNode>(&vm, source, 0, Identifier(), JSParseNormal, JSParseProgramCode, error, &positionBeforeLastNewline);
+ std::unique_ptr<ProgramNode> program = parse<ProgramNode>(
+ &vm, source, 0, Identifier(), JSParserBuiltinMode::NotBuiltin,
+ JSParserStrictMode::NotStrict, JSParserCodeType::Program,
+ error, &positionBeforeLastNewline);
if (!program) {
RELEASE_ASSERT(error.isValid());
return nullptr;
Modified: trunk/Source/_javascript_Core/runtime/CodeCache.h (181663 => 181664)
--- trunk/Source/_javascript_Core/runtime/CodeCache.h 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/runtime/CodeCache.h 2015-03-17 21:15:03 UTC (rev 181664)
@@ -61,10 +61,13 @@
{
}
- SourceCodeKey(const SourceCode& sourceCode, const String& name, CodeType codeType, JSParserStrictness jsParserStrictness)
+ SourceCodeKey(const SourceCode& sourceCode, const String& name, CodeType codeType, JSParserBuiltinMode builtinMode, JSParserStrictMode strictMode)
: m_sourceCode(sourceCode)
, m_name(name)
- , m_flags((codeType << 2) | jsParserStrictness)
+ , m_flags(
+ (static_cast<unsigned>(codeType) << 2)
+ | (static_cast<unsigned>(builtinMode) << 1)
+ | static_cast<unsigned>(strictMode))
, m_hash(string().impl()->hash())
{
}
@@ -249,8 +252,8 @@
CodeCache();
~CodeCache();
- UnlinkedProgramCodeBlock* getProgramCodeBlock(VM&, ProgramExecutable*, const SourceCode&, JSParserStrictness, DebuggerMode, ProfilerMode, ParserError&);
- UnlinkedEvalCodeBlock* getEvalCodeBlock(VM&, EvalExecutable*, const SourceCode&, JSParserStrictness, DebuggerMode, ProfilerMode, ParserError&);
+ UnlinkedProgramCodeBlock* getProgramCodeBlock(VM&, ProgramExecutable*, const SourceCode&, JSParserBuiltinMode, JSParserStrictMode, DebuggerMode, ProfilerMode, ParserError&);
+ UnlinkedEvalCodeBlock* getEvalCodeBlock(VM&, EvalExecutable*, const SourceCode&, JSParserBuiltinMode, JSParserStrictMode, DebuggerMode, ProfilerMode, ParserError&);
UnlinkedFunctionExecutable* getFunctionExecutableFromGlobalCode(VM&, const Identifier&, const SourceCode&, ParserError&);
void clear()
@@ -260,7 +263,7 @@
private:
template <class UnlinkedCodeBlockType, class ExecutableType>
- UnlinkedCodeBlockType* getGlobalCodeBlock(VM&, ExecutableType*, const SourceCode&, JSParserStrictness, DebuggerMode, ProfilerMode, ParserError&);
+ UnlinkedCodeBlockType* getGlobalCodeBlock(VM&, ExecutableType*, const SourceCode&, JSParserBuiltinMode, JSParserStrictMode, DebuggerMode, ProfilerMode, ParserError&);
CodeCacheMap m_sourceCode;
};
Modified: trunk/Source/_javascript_Core/runtime/Completion.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/runtime/Completion.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/runtime/Completion.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -55,7 +55,9 @@
{
JSLockHolder lock(vm);
RELEASE_ASSERT(vm.atomicStringTable() == wtfThreadData().atomicStringTable());
- return !!parse<ProgramNode>(&vm, source, 0, Identifier(), JSParseNormal, JSParseProgramCode, error);
+ return !!parse<ProgramNode>(
+ &vm, source, 0, Identifier(), JSParserBuiltinMode::NotBuiltin,
+ JSParserStrictMode::NotStrict, JSParserCodeType::Program, error);
}
JSValue evaluate(ExecState* exec, const SourceCode& source, JSValue thisValue, JSValue* returnedException)
Modified: trunk/Source/_javascript_Core/runtime/Executable.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/runtime/Executable.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/runtime/Executable.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -394,7 +394,10 @@
const ClassInfo FunctionExecutable::s_info = { "FunctionExecutable", &ScriptExecutable::s_info, 0, CREATE_METHOD_TABLE(FunctionExecutable) };
-FunctionExecutable::FunctionExecutable(VM& vm, const SourceCode& source, UnlinkedFunctionExecutable* unlinkedExecutable, unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn, bool bodyIncludesBraces)
+FunctionExecutable::FunctionExecutable(VM& vm, const SourceCode& source,
+ UnlinkedFunctionExecutable* unlinkedExecutable, unsigned firstLine,
+ unsigned lastLine, unsigned startColumn, unsigned endColumn,
+ bool bodyIncludesBraces)
: ScriptExecutable(vm.functionExecutableStructure.get(), vm, source, unlinkedExecutable->isInStrictContext())
, m_unlinkedExecutable(vm, this, unlinkedExecutable)
, m_bodyIncludesBraces(bodyIncludesBraces)
@@ -465,7 +468,9 @@
ParserError error;
VM* vm = &exec->vm();
JSGlobalObject* lexicalGlobalObject = exec->lexicalGlobalObject();
- std::unique_ptr<ProgramNode> programNode = parse<ProgramNode>(vm, m_source, 0, Identifier(), JSParseNormal, JSParseProgramCode, error);
+ std::unique_ptr<ProgramNode> programNode = parse<ProgramNode>(
+ vm, m_source, 0, Identifier(), JSParserBuiltinMode::NotBuiltin,
+ JSParserStrictMode::NotStrict, JSParserCodeType::Program, error);
if (programNode)
return 0;
ASSERT(error.isValid());
Modified: trunk/Source/_javascript_Core/runtime/Executable.h (181663 => 181664)
--- trunk/Source/_javascript_Core/runtime/Executable.h 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/runtime/Executable.h 2015-03-17 21:15:03 UTC (rev 181664)
@@ -541,7 +541,10 @@
public:
typedef ScriptExecutable Base;
- static FunctionExecutable* create(VM& vm, const SourceCode& source, UnlinkedFunctionExecutable* unlinkedExecutable, unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn, bool bodyIncludesBraces = true)
+ static FunctionExecutable* create(
+ VM& vm, const SourceCode& source, UnlinkedFunctionExecutable* unlinkedExecutable,
+ unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn,
+ bool bodyIncludesBraces = true)
{
FunctionExecutable* executable = new (NotNull, allocateCell<FunctionExecutable>(vm.heap)) FunctionExecutable(vm, source, unlinkedExecutable, firstLine, lastLine, startColumn, endColumn, bodyIncludesBraces);
executable->finishCreation(vm);
@@ -643,7 +646,10 @@
bool bodyIncludesBraces() const { return m_bodyIncludesBraces; }
private:
- FunctionExecutable(VM&, const SourceCode&, UnlinkedFunctionExecutable*, unsigned firstLine, unsigned lastLine, unsigned startColumn, unsigned endColumn, bool bodyIncludesBraces);
+ FunctionExecutable(
+ VM&, const SourceCode&, UnlinkedFunctionExecutable*, unsigned firstLine,
+ unsigned lastLine, unsigned startColumn, unsigned endColumn,
+ bool bodyIncludesBraces);
bool isCompiling()
{
Modified: trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp (181663 => 181664)
--- trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp 2015-03-17 20:47:42 UTC (rev 181663)
+++ trunk/Source/_javascript_Core/runtime/JSGlobalObject.cpp 2015-03-17 21:15:03 UTC (rev 181664)
@@ -783,10 +783,12 @@
UnlinkedProgramCodeBlock* JSGlobalObject::createProgramCodeBlock(CallFrame* callFrame, ProgramExecutable* executable, JSObject** exception)
{
ParserError error;
- JSParserStrictness strictness = executable->isStrictMode() ? JSParseStrict : JSParseNormal;
+ JSParserStrictMode strictMode = executable->isStrictMode() ? JSParserStrictMode::Strict : JSParserStrictMode::NotStrict;
DebuggerMode debuggerMode = hasDebugger() ? DebuggerOn : DebuggerOff;
ProfilerMode profilerMode = hasProfiler() ? ProfilerOn : ProfilerOff;
- UnlinkedProgramCodeBlock* unlinkedCodeBlock = vm().codeCache()->getProgramCodeBlock(vm(), executable, executable->source(), strictness, debuggerMode, profilerMode, error);
+ UnlinkedProgramCodeBlock* unlinkedCodeBlock = vm().codeCache()->getProgramCodeBlock(
+ vm(), executable, executable->source(), JSParserBuiltinMode::NotBuiltin, strictMode,
+ debuggerMode, profilerMode, error);
if (hasDebugger())
debugger()->sourceParsed(callFrame, executable->source().provider(), error.line(), error.message());
@@ -802,10 +804,12 @@
UnlinkedEvalCodeBlock* JSGlobalObject::createEvalCodeBlock(CallFrame* callFrame, EvalExecutable* executable)
{
ParserError error;
- JSParserStrictness strictness = executable->isStrictMode() ? JSParseStrict : JSParseNormal;
+ JSParserStrictMode strictMode = executable->isStrictMode() ? JSParserStrictMode::Strict : JSParserStrictMode::NotStrict;
DebuggerMode debuggerMode = hasDebugger() ? DebuggerOn : DebuggerOff;
ProfilerMode profilerMode = hasProfiler() ? ProfilerOn : ProfilerOff;
- UnlinkedEvalCodeBlock* unlinkedCodeBlock = vm().codeCache()->getEvalCodeBlock(vm(), executable, executable->source(), strictness, debuggerMode, profilerMode, error);
+ UnlinkedEvalCodeBlock* unlinkedCodeBlock = vm().codeCache()->getEvalCodeBlock(
+ vm(), executable, executable->source(), JSParserBuiltinMode::NotBuiltin, strictMode,
+ debuggerMode, profilerMode, error);
if (hasDebugger())
debugger()->sourceParsed(callFrame, executable->source().provider(), error.line(), error.message());