Revision: 24481
Author: [email protected]
Date: Thu Oct 9 08:16:13 2014 UTC
Log: Simplify AST ID generation.
Every CompilationInfo has an ID generator now, and it is never
reset/copied/assigned. Simplified FunctionState.
[email protected]
Review URL: https://codereview.chromium.org/633373003
https://code.google.com/p/v8/source/detail?r=24481
Modified:
/branches/bleeding_edge/src/ast.h
/branches/bleeding_edge/src/parser.cc
/branches/bleeding_edge/src/parser.h
/branches/bleeding_edge/src/preparser.cc
/branches/bleeding_edge/src/preparser.h
=======================================
--- /branches/bleeding_edge/src/ast.h Wed Oct 8 14:48:48 2014 UTC
+++ /branches/bleeding_edge/src/ast.h Thu Oct 9 08:16:13 2014 UTC
@@ -184,7 +184,7 @@
// For generating IDs for AstNodes.
class IdGen {
public:
- explicit IdGen(int id = 0) : id_(id) {}
+ IdGen() : id_(BailoutId::FirstUsable().ToInt()) {}
int GetNextId() { return ReserveIdRange(1); }
int ReserveIdRange(int n) {
@@ -195,6 +195,8 @@
private:
int id_;
+
+ DISALLOW_COPY_AND_ASSIGN(IdGen);
};
#define DECLARE_TYPE_ENUM(type) k##type,
=======================================
--- /branches/bleeding_edge/src/parser.cc Wed Oct 8 14:48:48 2014 UTC
+++ /branches/bleeding_edge/src/parser.cc Thu Oct 9 08:16:13 2014 UTC
@@ -878,8 +878,10 @@
ParsingModeScope parsing_mode(this, mode);
// Enters 'scope'.
- FunctionState function_state(&function_state_, &scope_, *scope, zone(),
- ast_value_factory(),
info->ast_node_id_gen());
+ AstNodeFactory<AstConstructionVisitor> function_factory(
+ zone(), ast_value_factory(), info->ast_node_id_gen());
+ FunctionState function_state(&function_state_, &scope_, *scope,
+ &function_factory);
scope_->SetStrictMode(info->strict_mode());
ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16,
zone());
@@ -991,9 +993,10 @@
zone());
}
original_scope_ = scope;
- FunctionState function_state(&function_state_, &scope_, scope, zone(),
- ast_value_factory(),
- info()->ast_node_id_gen());
+ AstNodeFactory<AstConstructionVisitor> function_factory(
+ zone(), ast_value_factory(), info()->ast_node_id_gen());
+ FunctionState function_state(&function_state_, &scope_, scope,
+ &function_factory);
DCHECK(scope->strict_mode() == SLOPPY || info()->strict_mode() ==
STRICT);
DCHECK(info()->strict_mode() == shared_info->strict_mode());
scope->SetStrictMode(shared_info->strict_mode());
@@ -3492,9 +3495,10 @@
BailoutReason dont_optimize_reason = kNoReason;
// Parse function body.
{
- FunctionState function_state(&function_state_, &scope_, scope, zone(),
- ast_value_factory(),
- info()->ast_node_id_gen());
+ AstNodeFactory<AstConstructionVisitor> function_factory(
+ zone(), ast_value_factory(), info()->ast_node_id_gen());
+ FunctionState function_state(&function_state_, &scope_, scope,
+ &function_factory);
scope_->SetScopeName(function_name);
if (is_generator) {
=======================================
--- /branches/bleeding_edge/src/parser.h Wed Oct 8 14:48:48 2014 UTC
+++ /branches/bleeding_edge/src/parser.h Thu Oct 9 08:16:13 2014 UTC
@@ -375,21 +375,6 @@
};
explicit ParserTraits(Parser* parser) : parser_(parser) {}
-
- // Custom operations executed when FunctionStates are created and
destructed.
- template <typename FunctionState>
- static void SetUpFunctionState(FunctionState* function_state) {
- function_state->saved_id_gen_ = *function_state->ast_node_id_gen_;
- *function_state->ast_node_id_gen_ =
- AstNode::IdGen(BailoutId::FirstUsable().ToInt());
- }
-
- template <typename FunctionState>
- static void TearDownFunctionState(FunctionState* function_state) {
- if (function_state->outer_function_state_ != NULL) {
- *function_state->ast_node_id_gen_ = function_state->saved_id_gen_;
- }
- }
// Helper functions for recursive descent.
bool IsEvalOrArguments(const AstRawString* identifier) const;
=======================================
--- /branches/bleeding_edge/src/preparser.cc Tue Oct 7 12:16:28 2014 UTC
+++ /branches/bleeding_edge/src/preparser.cc Thu Oct 9 08:16:13 2014 UTC
@@ -116,12 +116,13 @@
log_ = log;
// Lazy functions always have trivial outer scopes (no with/catch
scopes).
PreParserScope top_scope(scope_, GLOBAL_SCOPE);
- FunctionState top_state(&function_state_, &scope_, &top_scope, NULL,
- this->ast_value_factory());
+ PreParserFactory top_factory(NULL, NULL, NULL);
+ FunctionState top_state(&function_state_, &scope_, &top_scope,
&top_factory);
scope_->SetStrictMode(strict_mode);
PreParserScope function_scope(scope_, FUNCTION_SCOPE);
- FunctionState function_state(&function_state_, &scope_, &function_scope,
NULL,
- this->ast_value_factory());
+ PreParserFactory function_factory(NULL, NULL, NULL);
+ FunctionState function_state(&function_state_, &scope_, &function_scope,
+ &function_factory);
function_state.set_is_generator(is_generator);
DCHECK_EQ(Token::LBRACE, scanner()->current_token());
bool ok = true;
@@ -824,8 +825,9 @@
// Parse function body.
ScopeType outer_scope_type = scope_->type();
PreParserScope function_scope(scope_, FUNCTION_SCOPE);
- FunctionState function_state(&function_state_, &scope_, &function_scope,
NULL,
- this->ast_value_factory());
+ PreParserFactory factory(NULL, NULL, NULL);
+ FunctionState function_state(&function_state_, &scope_, &function_scope,
+ &factory);
function_state.set_is_generator(IsGeneratorFunction(kind));
// FormalParameterList ::
// '(' (Identifier)*[','] ')'
=======================================
--- /branches/bleeding_edge/src/preparser.h Wed Oct 8 14:48:48 2014 UTC
+++ /branches/bleeding_edge/src/preparser.h Thu Oct 9 08:16:13 2014 UTC
@@ -170,15 +170,11 @@
FunctionState(FunctionState** function_state_stack,
typename Traits::Type::Scope** scope_stack,
typename Traits::Type::Scope* scope,
- typename Traits::Type::Zone* zone = NULL,
- AstValueFactory* ast_value_factory = NULL,
- AstNode::IdGen* ast_node_id_gen = NULL);
+ typename Traits::Type::Factory* factory);
FunctionState(FunctionState** function_state_stack,
typename Traits::Type::Scope** scope_stack,
typename Traits::Type::Scope** scope,
- typename Traits::Type::Zone* zone = NULL,
- AstValueFactory* ast_value_factory = NULL,
- AstNode::IdGen* ast_node_id_gen = NULL);
+ typename Traits::Type::Factory* factory);
~FunctionState();
int NextMaterializedLiteralIndex() {
@@ -209,7 +205,7 @@
return generator_object_variable_;
}
- typename Traits::Type::Factory* factory() { return &factory_; }
+ typename Traits::Type::Factory* factory() { return factory_; }
private:
// Used to assign an index to each literal that needs materialization
in
@@ -234,10 +230,8 @@
FunctionState* outer_function_state_;
typename Traits::Type::Scope** scope_stack_;
typename Traits::Type::Scope* outer_scope_;
- AstNode::IdGen* ast_node_id_gen_; // Only used by ParserTraits.
- AstNode::IdGen saved_id_gen_; // Ditto.
typename Traits::Type::Zone* extra_param_;
- typename Traits::Type::Factory factory_;
+ typename Traits::Type::Factory* factory_;
friend class ParserTraits;
friend class Checkpoint;
@@ -1155,13 +1149,6 @@
};
explicit PreParserTraits(PreParser* pre_parser) :
pre_parser_(pre_parser) {}
-
- // Custom operations executed when FunctionStates are created and
- // destructed. (The PreParser doesn't need to do anything.)
- template <typename FunctionState>
- static void SetUpFunctionState(FunctionState* function_state) {}
- template <typename FunctionState>
- static void TearDownFunctionState(FunctionState* function_state) {}
// Helper functions for recursive descent.
static bool IsEvalOrArguments(PreParserIdentifier identifier) {
@@ -1445,7 +1432,8 @@
// during parsing.
PreParseResult PreParseProgram() {
PreParserScope scope(scope_, GLOBAL_SCOPE);
- FunctionState top_scope(&function_state_, &scope_, &scope);
+ PreParserFactory factory(NULL, NULL, NULL);
+ FunctionState top_scope(&function_state_, &scope_, &scope, &factory);
bool ok = true;
int start_position = scanner()->peek_location().beg_pos;
ParseSourceElements(Token::EOS, &ok);
@@ -1572,8 +1560,8 @@
ParserBase<Traits>::FunctionState::FunctionState(
FunctionState** function_state_stack,
typename Traits::Type::Scope** scope_stack,
- typename Traits::Type::Scope* scope, typename Traits::Type::Zone* zone,
- AstValueFactory* ast_value_factory, AstNode::IdGen* ast_node_id_gen)
+ typename Traits::Type::Scope* scope,
+ typename Traits::Type::Factory* factory)
: next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize),
next_handler_index_(0),
expected_property_count_(0),
@@ -1583,11 +1571,9 @@
outer_function_state_(*function_state_stack),
scope_stack_(scope_stack),
outer_scope_(*scope_stack),
- ast_node_id_gen_(ast_node_id_gen),
- factory_(zone, ast_value_factory, ast_node_id_gen) {
+ factory_(factory) {
*scope_stack_ = scope;
*function_state_stack = this;
- Traits::SetUpFunctionState(this);
}
@@ -1595,8 +1581,8 @@
ParserBase<Traits>::FunctionState::FunctionState(
FunctionState** function_state_stack,
typename Traits::Type::Scope** scope_stack,
- typename Traits::Type::Scope** scope, typename Traits::Type::Zone*
zone,
- AstValueFactory* ast_value_factory, AstNode::IdGen* ast_node_id_gen)
+ typename Traits::Type::Scope** scope,
+ typename Traits::Type::Factory* factory)
: next_materialized_literal_index_(JSFunction::kLiteralsPrefixSize),
next_handler_index_(0),
expected_property_count_(0),
@@ -1606,11 +1592,9 @@
outer_function_state_(*function_state_stack),
scope_stack_(scope_stack),
outer_scope_(*scope_stack),
- ast_node_id_gen_(ast_node_id_gen),
- factory_(zone, ast_value_factory, ast_node_id_gen) {
+ factory_(factory) {
*scope_stack_ = *scope;
*function_state_stack = this;
- Traits::SetUpFunctionState(this);
}
@@ -1618,7 +1602,6 @@
ParserBase<Traits>::FunctionState::~FunctionState() {
*scope_stack_ = outer_scope_;
*function_state_stack_ = outer_function_state_;
- Traits::TearDownFunctionState(this);
}
@@ -2651,8 +2634,10 @@
int handler_count = 0;
{
- FunctionState function_state(&function_state_, &scope_, &scope, zone(),
- this->ast_value_factory(),
ast_node_id_gen_);
+ typename Traits::Type::Factory function_factory(
+ zone(), this->ast_value_factory(), ast_node_id_gen_);
+ FunctionState function_state(&function_state_, &scope_, &scope,
+ &function_factory);
Scanner::Location dupe_error_loc = Scanner::Location::invalid();
num_parameters = Traits::DeclareArrowParametersFromExpression(
params_ast, scope_, &dupe_error_loc, ok);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.