Modified: trunk/Source/_javascript_Core/parser/Nodes.h (227691 => 227692)
--- trunk/Source/_javascript_Core/parser/Nodes.h 2018-01-26 20:55:36 UTC (rev 227691)
+++ trunk/Source/_javascript_Core/parser/Nodes.h 2018-01-26 21:14:17 UTC (rev 227692)
@@ -113,9 +113,21 @@
// ParserArenaDeletable objects are deleted when the arena is deleted.
// Clients must not call delete directly on such objects.
- void* operator new(size_t, ParserArena&);
+ template<typename T> void* operator new(size_t, ParserArena&);
};
+#define JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED_IMPL(__classToNew) \
+ void* operator new(size_t size, ParserArena& parserArena) \
+ { \
+ return ParserArenaDeletable::operator new<__classToNew>(size, parserArena); \
+ }
+
+#define JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(__classToNew) \
+ public: \
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED_IMPL(__classToNew) \
+ private: \
+ typedef int __thisIsHereToForceASemicolonAfterThisMacro
+
class ParserArenaRoot {
WTF_MAKE_FAST_ALLOCATED;
protected:
@@ -238,6 +250,7 @@
};
class VariableEnvironmentNode : public ParserArenaDeletable {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(VariableEnvironmentNode);
public:
typedef DeclarationStacks::FunctionStack FunctionStack;
@@ -1413,9 +1426,8 @@
};
class BlockNode : public StatementNode, public VariableEnvironmentNode {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(BlockNode);
public:
- using ParserArenaDeletable::operator new;
-
BlockNode(const JSTokenLocation&, SourceElements*, VariableEnvironment&, FunctionStack&&);
StatementNode* singleStatement() const;
@@ -1536,9 +1548,8 @@
};
class ForNode : public StatementNode, public VariableEnvironmentNode {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ForNode);
public:
- using ParserArenaDeletable::operator new;
-
ForNode(const JSTokenLocation&, ExpressionNode* expr1, ExpressionNode* expr2, ExpressionNode* expr3, StatementNode*, VariableEnvironment&);
private:
@@ -1553,9 +1564,8 @@
class DestructuringPatternNode;
class EnumerationNode : public StatementNode, public ThrowableExpressionData, public VariableEnvironmentNode {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(EnumerationNode);
public:
- using ParserArenaDeletable::operator new;
-
EnumerationNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
ExpressionNode* lexpr() const { return m_lexpr; }
@@ -1568,6 +1578,7 @@
};
class ForInNode : public EnumerationNode {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ForInNode);
public:
ForInNode(const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
@@ -1579,6 +1590,7 @@
};
class ForOfNode : public EnumerationNode {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ForOfNode);
public:
ForOfNode(bool, const JSTokenLocation&, ExpressionNode*, ExpressionNode*, StatementNode*, VariableEnvironment&);
bool isForOfNode() const override { return true; }
@@ -1668,9 +1680,8 @@
};
class TryNode : public StatementNode, public VariableEnvironmentNode {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(TryNode);
public:
- using ParserArenaDeletable::operator new;
-
TryNode(const JSTokenLocation&, StatementNode* tryBlock, DestructuringPatternNode* catchPattern, StatementNode* catchBlock, VariableEnvironment& catchEnvironment, StatementNode* finallyBlock);
private:
@@ -1684,12 +1695,15 @@
class ScopeNode : public StatementNode, public ParserArenaRoot, public VariableEnvironmentNode {
public:
+ // ScopeNode is never directly instantiate. The life-cycle of its derived classes are
+ // managed using std::unique_ptr. Hence, though ScopeNode extends VariableEnvironmentNode,
+ // which in turn extends ParserArenaDeletable, we don't want to use ParserArenaDeletable's
+ // new for allocation.
+ using ParserArenaRoot::operator new;
ScopeNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, bool inStrictContext);
ScopeNode(ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end, const SourceCode&, SourceElements*, VariableEnvironment&, FunctionStack&&, VariableEnvironment&, UniquedStringImplPtrSet&&, CodeFeatures, InnerArrowFunctionCodeFeatures, int numConstants);
- using ParserArenaRoot::operator new;
-
const SourceCode& source() const { return m_source; }
const String& sourceURL() const { return m_source.provider()->url(); }
intptr_t sourceID() const { return m_source.providerID(); }
@@ -1831,6 +1845,7 @@
};
class ImportSpecifierListNode : public ParserArenaDeletable {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ImportSpecifierListNode);
public:
typedef Vector<ImportSpecifierNode*, 3> Specifiers;
@@ -1921,6 +1936,7 @@
};
class ExportSpecifierListNode : public ParserArenaDeletable {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ExportSpecifierListNode);
public:
typedef Vector<ExportSpecifierNode*, 3> Specifiers;
@@ -1949,9 +1965,8 @@
};
class FunctionMetadataNode final : public Node, public ParserArenaDeletable {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(FunctionMetadataNode);
public:
- using ParserArenaDeletable::operator new;
-
FunctionMetadataNode(
ParserArena&, const JSTokenLocation& start, const JSTokenLocation& end,
unsigned startColumn, unsigned endColumn, int functionKeywordStart,
@@ -2120,9 +2135,8 @@
};
class ClassExprNode final : public ExpressionNode, public VariableEnvironmentNode {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ClassExprNode);
public:
- using ParserArenaDeletable::operator new;
-
ClassExprNode(const JSTokenLocation&, const Identifier&, const SourceCode& classSource,
VariableEnvironment& classEnvironment, ExpressionNode* constructorExpresssion,
ExpressionNode* parentClass, PropertyListNode* instanceMethods, PropertyListNode* staticMethods);
@@ -2164,9 +2178,8 @@
};
class ArrayPatternNode : public DestructuringPatternNode, public ThrowableExpressionData, public ParserArenaDeletable {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ArrayPatternNode);
public:
- using ParserArenaDeletable::operator new;
-
ArrayPatternNode();
enum class BindingType {
Elision,
@@ -2194,9 +2207,8 @@
};
class ObjectPatternNode : public DestructuringPatternNode, public ThrowableExpressionData, public ParserArenaDeletable {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(ObjectPatternNode);
public:
- using ParserArenaDeletable::operator new;
-
ObjectPatternNode();
enum class BindingType {
Element,
@@ -2312,6 +2324,7 @@
};
class FunctionParameters : public ParserArenaDeletable {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(FunctionParameters);
public:
FunctionParameters();
ALWAYS_INLINE unsigned size() const { return m_patterns.size(); }
@@ -2410,9 +2423,8 @@
};
class SwitchNode : public StatementNode, public VariableEnvironmentNode {
+ JSC_MAKE_PARSER_ARENA_DELETABLE_ALLOCATED(SwitchNode);
public:
- using ParserArenaDeletable::operator new;
-
SwitchNode(const JSTokenLocation&, ExpressionNode*, CaseBlockNode*, VariableEnvironment&, FunctionStack&&);
private: