Unreviewed, rolling out r218512.
https://bugs.webkit.org/show_bug.cgi?id=173981
"It changes the behavior of the JS API's JSEvaluateScript
which breaks TurboTax" (Requested by saamyjoon on #webkit).
Reverted changeset:
"test262: Completion values for control flow do not match the
spec"
https://bugs.webkit.org/show_bug.cgi?id=171265
http://trac.webkit.org/changeset/218512
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@218957 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index 04936dd..d66515f 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,18 @@
+2017-06-29 Commit Queue <commit-queue@webkit.org>
+
+ Unreviewed, rolling out r218512.
+ https://bugs.webkit.org/show_bug.cgi?id=173981
+
+ "It changes the behavior of the JS API's JSEvaluateScript
+ which breaks TurboTax" (Requested by saamyjoon on #webkit).
+
+ Reverted changeset:
+
+ "test262: Completion values for control flow do not match the
+ spec"
+ https://bugs.webkit.org/show_bug.cgi?id=171265
+ http://trac.webkit.org/changeset/218512
+
2017-06-29 JF Bastien <jfbastien@apple.com>
WebAssembly: disable some APIs under CSP
diff --git a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
index 6879a4f..1a4b279 100644
--- a/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
+++ b/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
@@ -916,9 +916,7 @@
CodeType codeType() const { return m_codeType; }
- bool shouldBeConcernedWithCompletionValue() const { return m_codeType != FunctionCode; }
-
- bool shouldEmitDebugHooks() const { return m_shouldEmitDebugHooks; }
+ bool shouldEmitDebugHooks() { return m_shouldEmitDebugHooks; }
bool isStrictMode() const { return m_codeBlock->isStrictMode(); }
diff --git a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
index fa0c5e0..6c1aeb1 100644
--- a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
+++ b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
@@ -2461,25 +2461,30 @@
// ------------------------------ SourceElements -------------------------------
+
+inline StatementNode* SourceElements::lastStatement() const
+{
+ return m_tail;
+}
+
inline void SourceElements::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
- StatementNode* lastStatementWithCompletionValue = nullptr;
- if (generator.shouldBeConcernedWithCompletionValue()) {
- for (StatementNode* statement = m_head; statement; statement = statement->next()) {
- if (statement->hasCompletionValue())
- lastStatementWithCompletionValue = statement;
- }
- }
-
- for (StatementNode* statement = m_head; statement; statement = statement->next()) {
- if (statement == lastStatementWithCompletionValue)
- generator.emitLoad(dst, jsUndefined());
+ for (StatementNode* statement = m_head; statement; statement = statement->next())
generator.emitNodeInTailPosition(dst, statement);
- }
}
// ------------------------------ BlockNode ------------------------------------
+inline StatementNode* BlockNode::lastStatement() const
+{
+ return m_statements ? m_statements->lastStatement() : 0;
+}
+
+StatementNode* BlockNode::singleStatement() const
+{
+ return m_statements ? m_statements->singleStatement() : 0;
+}
+
void BlockNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
if (!m_statements)
@@ -2603,11 +2608,6 @@
void IfElseNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
- if (generator.shouldBeConcernedWithCompletionValue()) {
- if (m_ifBlock->hasEarlyBreakOrContinue() || (m_elseBlock && m_elseBlock->hasEarlyBreakOrContinue()))
- generator.emitLoad(dst, jsUndefined());
- }
-
Ref<Label> beforeThen = generator.newLabel();
Ref<Label> beforeElse = generator.newLabel();
Ref<Label> afterElse = generator.newLabel();
@@ -2643,9 +2643,6 @@
void DoWhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
- if (generator.shouldBeConcernedWithCompletionValue() && m_statement->hasEarlyBreakOrContinue())
- generator.emitLoad(dst, jsUndefined());
-
Ref<LabelScope> scope = generator.newLabelScope(LabelScope::Loop);
Ref<Label> topOfLoop = generator.newLabel();
@@ -2664,9 +2661,6 @@
void WhileNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
- if (generator.shouldBeConcernedWithCompletionValue() && m_statement->hasEarlyBreakOrContinue())
- generator.emitLoad(dst, jsUndefined());
-
Ref<LabelScope> scope = generator.newLabelScope(LabelScope::Loop);
Ref<Label> topOfLoop = generator.newLabel();
@@ -2691,9 +2685,6 @@
void ForNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
- if (generator.shouldBeConcernedWithCompletionValue() && m_statement->hasEarlyBreakOrContinue())
- generator.emitLoad(dst, jsUndefined());
-
Ref<LabelScope> scope = generator.newLabelScope(LabelScope::Loop);
RegisterID* forLoopSymbolTable = nullptr;
@@ -2843,9 +2834,6 @@
return;
}
- if (generator.shouldBeConcernedWithCompletionValue() && m_statement->hasEarlyBreakOrContinue())
- generator.emitLoad(dst, jsUndefined());
-
Ref<Label> end = generator.newLabel();
RegisterID* forLoopSymbolTable = nullptr;
@@ -3000,9 +2988,6 @@
return;
}
- if (generator.shouldBeConcernedWithCompletionValue() && m_statement->hasEarlyBreakOrContinue())
- generator.emitLoad(dst, jsUndefined());
-
RegisterID* forLoopSymbolTable = nullptr;
generator.pushLexicalScope(this, BytecodeGenerator::TDZCheckOptimization::Optimize, BytecodeGenerator::NestedScopeType::IsNested, &forLoopSymbolTable);
auto extractor = [this, dst](BytecodeGenerator& generator, RegisterID* value)
@@ -3156,8 +3141,6 @@
RefPtr<RegisterID> scope = generator.emitNode(m_expr);
generator.emitExpressionInfo(m_divot, m_divot - m_expressionLength, m_divot);
generator.emitPushWithScope(scope.get());
- if (generator.shouldBeConcernedWithCompletionValue() && m_statement->hasEarlyBreakOrContinue())
- generator.emitLoad(dst, jsUndefined());
generator.emitNodeInTailPosition(dst, m_statement);
generator.emitPopWithScope();
}
@@ -3326,9 +3309,6 @@
void SwitchNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
- if (generator.shouldBeConcernedWithCompletionValue())
- generator.emitLoad(dst, jsUndefined());
-
Ref<LabelScope> scope = generator.newLabelScope(LabelScope::Switch);
RefPtr<RegisterID> r0 = generator.emitNode(m_expr);
@@ -3373,9 +3353,6 @@
// NOTE: The catch and finally blocks must be labeled explicitly, so the
// optimizer knows they may be jumped to from anywhere.
- if (generator.shouldBeConcernedWithCompletionValue() && m_tryBlock->hasEarlyBreakOrContinue())
- generator.emitLoad(dst, jsUndefined());
-
ASSERT(m_catchBlock || m_finallyBlock);
BytecodeGenerator::CompletionRecordScope completionRecordScope(generator, m_finallyBlock);
@@ -3467,7 +3444,7 @@
int finallyStartOffset = m_catchBlock ? m_catchBlock->endOffset() + 1 : m_tryBlock->endOffset() + 1;
generator.emitProfileControlFlow(finallyStartOffset);
- generator.emitNodeInTailPosition(m_finallyBlock);
+ generator.emitNodeInTailPosition(dst, m_finallyBlock);
generator.emitFinallyCompletion(finallyContext, savedCompletionTypeRegister.get(), *finallyEndLabel);
generator.emitLabel(*finallyEndLabel);
@@ -3742,9 +3719,9 @@
// ------------------------------ ClassDeclNode ---------------------------------
-void ClassDeclNode::emitBytecode(BytecodeGenerator& generator, RegisterID*)
+void ClassDeclNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
- generator.emitNode(m_classDeclaration);
+ generator.emitNode(dst, m_classDeclaration);
}
// ------------------------------ ClassExprNode ---------------------------------
diff --git a/Source/JavaScriptCore/parser/Nodes.cpp b/Source/JavaScriptCore/parser/Nodes.cpp
index 85c31a3..b12ecf5 100644
--- a/Source/JavaScriptCore/parser/Nodes.cpp
+++ b/Source/JavaScriptCore/parser/Nodes.cpp
@@ -66,55 +66,6 @@
return m_head == m_tail ? m_head : nullptr;
}
-StatementNode* SourceElements::lastStatement() const
-{
- return m_tail;
-}
-
-bool SourceElements::hasCompletionValue() const
-{
- for (StatementNode* statement = m_head; statement; statement = statement->next()) {
- if (statement->hasCompletionValue())
- return true;
- }
-
- return false;
-}
-
-bool SourceElements::hasEarlyBreakOrContinue() const
-{
- for (StatementNode* statement = m_head; statement; statement = statement->next()) {
- if (statement->isBreak() || statement->isContinue())
- return true;
- if (statement->hasCompletionValue())
- return false;
- }
-
- return false;
-}
-
-// ------------------------------ BlockNode ------------------------------------
-
-StatementNode* BlockNode::lastStatement() const
-{
- return m_statements ? m_statements->lastStatement() : nullptr;
-}
-
-StatementNode* BlockNode::singleStatement() const
-{
- return m_statements ? m_statements->singleStatement() : nullptr;
-}
-
-bool BlockNode::hasCompletionValue() const
-{
- return m_statements ? m_statements->hasCompletionValue() : false;
-}
-
-bool BlockNode::hasEarlyBreakOrContinue() const
-{
- return m_statements ? m_statements->hasEarlyBreakOrContinue() : false;
-}
-
// ------------------------------ ScopeNode -----------------------------
ScopeNode::ScopeNode(ParserArena& parserArena, const JSTokenLocation& startLocation, const JSTokenLocation& endLocation, bool inStrictContext)
@@ -149,17 +100,7 @@
StatementNode* ScopeNode::singleStatement() const
{
- return m_statements ? m_statements->singleStatement() : nullptr;
-}
-
-bool ScopeNode::hasCompletionValue() const
-{
- return m_statements ? m_statements->hasCompletionValue() : false;
-}
-
-bool ScopeNode::hasEarlyBreakOrContinue() const
-{
- return m_statements ? m_statements->hasEarlyBreakOrContinue() : false;
+ return m_statements ? m_statements->singleStatement() : 0;
}
// ------------------------------ ProgramNode -----------------------------
diff --git a/Source/JavaScriptCore/parser/Nodes.h b/Source/JavaScriptCore/parser/Nodes.h
index 99cdd1a..d71316f 100644
--- a/Source/JavaScriptCore/parser/Nodes.h
+++ b/Source/JavaScriptCore/parser/Nodes.h
@@ -209,12 +209,9 @@
void setLoc(unsigned firstLine, unsigned lastLine, int startOffset, int lineStartOffset);
unsigned lastLine() const { return m_lastLine; }
- StatementNode* next() const { return m_next; }
+ StatementNode* next() { return m_next; }
void setNext(StatementNode* next) { m_next = next; }
- virtual bool hasCompletionValue() const { return true; }
- virtual bool hasEarlyBreakOrContinue() const { return false; }
-
virtual bool isEmptyStatement() const { return false; }
virtual bool isDebuggerStatement() const { return false; }
virtual bool isFunctionNode() const { return false; }
@@ -1344,9 +1341,6 @@
StatementNode* singleStatement() const;
StatementNode* lastStatement() const;
- bool hasCompletionValue() const;
- bool hasEarlyBreakOrContinue() const;
-
void emitBytecode(BytecodeGenerator&, RegisterID* destination);
void analyzeModule(ModuleAnalyzer&);
@@ -1367,9 +1361,6 @@
private:
void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
- bool hasCompletionValue() const override;
- bool hasEarlyBreakOrContinue() const override;
-
bool isBlock() const override { return true; }
SourceElements* m_statements;
@@ -1382,7 +1373,6 @@
private:
void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
- bool hasCompletionValue() const override { return false; }
bool isEmptyStatement() const override { return true; }
};
@@ -1390,7 +1380,6 @@
public:
DebuggerStatementNode(const JSTokenLocation&);
- bool hasCompletionValue() const override { return false; }
bool isDebuggerStatement() const override { return true; }
private:
@@ -1417,8 +1406,6 @@
private:
void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
- bool hasCompletionValue() const override { return false; }
-
ExpressionNode* m_expr;
};
@@ -1536,7 +1523,6 @@
Label* trivialTarget(BytecodeGenerator&);
private:
- bool hasCompletionValue() const override { return false; }
bool isContinue() const override { return true; }
void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
@@ -1549,7 +1535,6 @@
Label* trivialTarget(BytecodeGenerator&);
private:
- bool hasCompletionValue() const override { return false; }
bool isBreak() const override { return true; }
void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
@@ -1590,7 +1575,6 @@
bool isLabel() const override { return true; }
private:
- bool hasCompletionValue() const override { return m_statement->hasCompletionValue(); }
void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
const Identifier& m_name;
@@ -1675,9 +1659,6 @@
StatementNode* singleStatement() const;
- bool hasCompletionValue() const override;
- bool hasEarlyBreakOrContinue() const override;
-
void emitStatementsBytecode(BytecodeGenerator&, RegisterID* destination);
void analyzeModule(ModuleAnalyzer&);
@@ -1787,7 +1768,6 @@
class ModuleDeclarationNode : public StatementNode {
public:
virtual void analyzeModule(ModuleAnalyzer&) = 0;
- bool hasCompletionValue() const override { return false; }
bool isModuleDeclarationNode() const override { return true; }
protected:
@@ -2285,7 +2265,6 @@
public:
FuncDeclNode(const JSTokenLocation&, const Identifier&, FunctionMetadataNode*, const SourceCode&);
- bool hasCompletionValue() const override { return false; }
bool isFuncDeclNode() const override { return true; }
FunctionMetadataNode* metadata() { return m_metadata; }
@@ -2302,8 +2281,6 @@
private:
void emitBytecode(BytecodeGenerator&, RegisterID* = 0) override;
- bool hasCompletionValue() const override { return false; }
-
ExpressionNode* m_classDeclaration;
};