Simplified bytecode generation by merging prefix and postfix nodes
https://bugs.webkit.org/show_bug.cgi?id=113925
Reviewed by Filip Pizlo.
PostfixNode now inherits from PrefixNode, so when we detect that we're
in a context where postifx and prefix are equivalent, PostFixNode can
just call through to PrefixNode codegen, instead of duplicating the
logic.
* bytecompiler/NodesCodegen.cpp:
(JSC::PostfixNode::emitResolve):
(JSC::PostfixNode::emitBracket):
(JSC::PostfixNode::emitDot):
* parser/NodeConstructors.h:
(JSC::PostfixNode::PostfixNode):
* parser/Nodes.h:
(JSC):
(PrefixNode):
(PostfixNode):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@147658 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog
index e09b038..6edef33 100644
--- a/Source/JavaScriptCore/ChangeLog
+++ b/Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,26 @@
+2013-04-04 Geoffrey Garen <ggaren@apple.com>
+
+ Simplified bytecode generation by merging prefix and postfix nodes
+ https://bugs.webkit.org/show_bug.cgi?id=113925
+
+ Reviewed by Filip Pizlo.
+
+ PostfixNode now inherits from PrefixNode, so when we detect that we're
+ in a context where postifx and prefix are equivalent, PostFixNode can
+ just call through to PrefixNode codegen, instead of duplicating the
+ logic.
+
+ * bytecompiler/NodesCodegen.cpp:
+ (JSC::PostfixNode::emitResolve):
+ (JSC::PostfixNode::emitBracket):
+ (JSC::PostfixNode::emitDot):
+ * parser/NodeConstructors.h:
+ (JSC::PostfixNode::PostfixNode):
+ * parser/Nodes.h:
+ (JSC):
+ (PrefixNode):
+ (PostfixNode):
+
2013-04-04 Andras Becsi <andras.becsi@digia.com>
Fix the build with GCC 4.8
diff --git a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
index 2d09e43..fb5811d 100644
--- a/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
+++ b/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
@@ -624,6 +624,9 @@
RegisterID* PostfixNode::emitResolve(BytecodeGenerator& generator, RegisterID* dst)
{
+ if (dst == generator.ignoredResult())
+ return PrefixNode::emitResolve(generator, dst);
+
ASSERT(m_expr->isResolveNode());
ResolveNode* resolve = static_cast<ResolveNode*>(m_expr);
const Identifier& ident = resolve->identifier();
@@ -635,39 +638,30 @@
generator.emitReadOnlyExceptionIfNeeded();
return generator.emitToJSNumber(generator.finalDestination(dst), local);
}
- if (dst == generator.ignoredResult())
- return emitPreIncOrDec(generator, local, m_operator);
return emitPostIncOrDec(generator, generator.finalDestination(dst), local, m_operator);
}
if (resolveResult.isStatic() && !resolveResult.isReadOnly()) {
RefPtr<RegisterID> value = generator.emitGetStaticVar(generator.newTemporary(), resolveResult, ident);
- RegisterID* oldValue;
- if (dst == generator.ignoredResult()) {
- oldValue = 0;
- emitPreIncOrDec(generator, value.get(), m_operator);
- } else
- oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
+ RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
generator.emitPutStaticVar(resolveResult, ident, value.get());
- return oldValue;
+ return oldValue.get();
}
generator.emitExpressionInfo(divot(), startOffset(), endOffset());
RefPtr<RegisterID> value = generator.newTemporary();
NonlocalResolveInfo resolveInfo;
RefPtr<RegisterID> base = generator.emitResolveWithBaseForPut(generator.newTemporary(), value.get(), resolveResult, ident, resolveInfo);
- RegisterID* oldValue;
- if (dst == generator.ignoredResult()) {
- oldValue = 0;
- emitPreIncOrDec(generator, value.get(), m_operator);
- } else
- oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
+ RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
generator.emitPutToBase(base.get(), ident, value.get(), resolveInfo);
- return oldValue;
+ return oldValue.get();
}
RegisterID* PostfixNode::emitBracket(BytecodeGenerator& generator, RegisterID* dst)
{
+ if (dst == generator.ignoredResult())
+ return PrefixNode::emitBracket(generator, dst);
+
ASSERT(m_expr->isBracketAccessorNode());
BracketAccessorNode* bracketAccessor = static_cast<BracketAccessorNode*>(m_expr);
ExpressionNode* baseNode = bracketAccessor->base();
@@ -678,12 +672,6 @@
generator.emitExpressionInfo(bracketAccessor->divot(), bracketAccessor->startOffset(), bracketAccessor->endOffset());
RefPtr<RegisterID> value = generator.emitGetByVal(generator.newTemporary(), base.get(), property.get());
- if (dst == generator.ignoredResult()) {
- emitPreIncOrDec(generator, value.get(), m_operator);
- generator.emitExpressionInfo(divot(), startOffset(), endOffset());
- generator.emitPutByVal(base.get(), property.get(), value.get());
- return 0;
- }
RegisterID* oldValue = emitPostIncOrDec(generator, generator.tempDestination(dst), value.get(), m_operator);
generator.emitExpressionInfo(divot(), startOffset(), endOffset());
generator.emitPutByVal(base.get(), property.get(), value.get());
@@ -692,6 +680,9 @@
RegisterID* PostfixNode::emitDot(BytecodeGenerator& generator, RegisterID* dst)
{
+ if (dst == generator.ignoredResult())
+ return PrefixNode::emitDot(generator, dst);
+
ASSERT(m_expr->isDotAccessorNode());
DotAccessorNode* dotAccessor = static_cast<DotAccessorNode*>(m_expr);
ExpressionNode* baseNode = dotAccessor->base();
@@ -701,12 +692,6 @@
generator.emitExpressionInfo(dotAccessor->divot(), dotAccessor->startOffset(), dotAccessor->endOffset());
RefPtr<RegisterID> value = generator.emitGetById(generator.newTemporary(), base.get(), ident);
- if (dst == generator.ignoredResult()) {
- emitPreIncOrDec(generator, value.get(), m_operator);
- generator.emitExpressionInfo(divot(), startOffset(), endOffset());
- generator.emitPutById(base.get(), ident, value.get());
- return 0;
- }
RegisterID* oldValue = emitPostIncOrDec(generator, generator.tempDestination(dst), value.get(), m_operator);
generator.emitExpressionInfo(divot(), startOffset(), endOffset());
generator.emitPutById(base.get(), ident, value.get());
diff --git a/Source/JavaScriptCore/parser/NodeConstructors.h b/Source/JavaScriptCore/parser/NodeConstructors.h
index dc704f1..e0ea858 100644
--- a/Source/JavaScriptCore/parser/NodeConstructors.h
+++ b/Source/JavaScriptCore/parser/NodeConstructors.h
@@ -288,10 +288,7 @@
}
inline PostfixNode::PostfixNode(const JSTokenLocation& location, ExpressionNode* expr, Operator oper, unsigned divot, unsigned startOffset, unsigned endOffset)
- : ExpressionNode(location)
- , ThrowableExpressionData(divot, startOffset, endOffset)
- , m_expr(expr)
- , m_operator(oper)
+ : PrefixNode(location, expr, oper, divot, startOffset, endOffset)
{
}
diff --git a/Source/JavaScriptCore/parser/Nodes.h b/Source/JavaScriptCore/parser/Nodes.h
index 3bdd81c..9b6e021 100644
--- a/Source/JavaScriptCore/parser/Nodes.h
+++ b/Source/JavaScriptCore/parser/Nodes.h
@@ -587,20 +587,6 @@
virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
};
- class PostfixNode : public ExpressionNode, public ThrowableExpressionData {
- public:
- PostfixNode(const JSTokenLocation&, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
-
- private:
- virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
- virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0);
- virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0);
- virtual RegisterID* emitDot(BytecodeGenerator&, RegisterID* = 0);
-
- ExpressionNode* m_expr;
- Operator m_operator;
- };
-
class DeleteResolveNode : public ExpressionNode, public ThrowableExpressionData {
public:
DeleteResolveNode(const JSTokenLocation&, const Identifier&, unsigned divot, unsigned startOffset, unsigned endOffset);
@@ -679,7 +665,7 @@
public:
PrefixNode(const JSTokenLocation&, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
- private:
+ protected:
virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0);
virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0);
@@ -689,6 +675,17 @@
Operator m_operator;
};
+ class PostfixNode : public PrefixNode {
+ public:
+ PostfixNode(const JSTokenLocation&, ExpressionNode*, Operator, unsigned divot, unsigned startOffset, unsigned endOffset);
+
+ private:
+ virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitResolve(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitBracket(BytecodeGenerator&, RegisterID* = 0);
+ virtual RegisterID* emitDot(BytecodeGenerator&, RegisterID* = 0);
+ };
+
class UnaryOpNode : public ExpressionNode {
public:
UnaryOpNode(const JSTokenLocation&, ResultType, ExpressionNode*, OpcodeID);