summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/v8/src/ast.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/v8/src/ast.h')
-rw-r--r--src/3rdparty/v8/src/ast.h2946
1 files changed, 0 insertions, 2946 deletions
diff --git a/src/3rdparty/v8/src/ast.h b/src/3rdparty/v8/src/ast.h
deleted file mode 100644
index f7e23e8..0000000
--- a/src/3rdparty/v8/src/ast.h
+++ /dev/null
@@ -1,2946 +0,0 @@
-// Copyright 2012 the V8 project authors. All rights reserved.
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-// * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following
-// disclaimer in the documentation and/or other materials provided
-// with the distribution.
-// * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived
-// from this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef V8_AST_H_
-#define V8_AST_H_
-
-#include "v8.h"
-
-#include "assembler.h"
-#include "factory.h"
-#include "isolate.h"
-#include "jsregexp.h"
-#include "list-inl.h"
-#include "runtime.h"
-#include "small-pointer-list.h"
-#include "smart-pointers.h"
-#include "token.h"
-#include "utils.h"
-#include "variables.h"
-#include "interface.h"
-#include "zone-inl.h"
-
-namespace v8 {
-namespace internal {
-
-// The abstract syntax tree is an intermediate, light-weight
-// representation of the parsed JavaScript code suitable for
-// compilation to native code.
-
-// Nodes are allocated in a separate zone, which allows faster
-// allocation and constant-time deallocation of the entire syntax
-// tree.
-
-
-// ----------------------------------------------------------------------------
-// Nodes of the abstract syntax tree. Only concrete classes are
-// enumerated here.
-
-#define DECLARATION_NODE_LIST(V) \
- V(VariableDeclaration) \
- V(FunctionDeclaration) \
- V(ModuleDeclaration) \
- V(ImportDeclaration) \
- V(ExportDeclaration) \
-
-#define MODULE_NODE_LIST(V) \
- V(ModuleLiteral) \
- V(ModuleVariable) \
- V(ModulePath) \
- V(ModuleUrl)
-
-#define STATEMENT_NODE_LIST(V) \
- V(Block) \
- V(ModuleStatement) \
- V(ExpressionStatement) \
- V(EmptyStatement) \
- V(IfStatement) \
- V(ContinueStatement) \
- V(BreakStatement) \
- V(ReturnStatement) \
- V(WithStatement) \
- V(SwitchStatement) \
- V(DoWhileStatement) \
- V(WhileStatement) \
- V(ForStatement) \
- V(ForInStatement) \
- V(TryCatchStatement) \
- V(TryFinallyStatement) \
- V(DebuggerStatement)
-
-#define EXPRESSION_NODE_LIST(V) \
- V(FunctionLiteral) \
- V(SharedFunctionInfoLiteral) \
- V(Conditional) \
- V(VariableProxy) \
- V(Literal) \
- V(RegExpLiteral) \
- V(ObjectLiteral) \
- V(ArrayLiteral) \
- V(Assignment) \
- V(Throw) \
- V(Property) \
- V(Call) \
- V(CallNew) \
- V(CallRuntime) \
- V(UnaryOperation) \
- V(CountOperation) \
- V(BinaryOperation) \
- V(CompareOperation) \
- V(ThisFunction)
-
-#define AST_NODE_LIST(V) \
- DECLARATION_NODE_LIST(V) \
- MODULE_NODE_LIST(V) \
- STATEMENT_NODE_LIST(V) \
- EXPRESSION_NODE_LIST(V)
-
-// Forward declarations
-class AstConstructionVisitor;
-template<class> class AstNodeFactory;
-class AstVisitor;
-class Declaration;
-class Module;
-class BreakableStatement;
-class Expression;
-class IterationStatement;
-class MaterializedLiteral;
-class Statement;
-class TargetCollector;
-class TypeFeedbackOracle;
-
-class RegExpAlternative;
-class RegExpAssertion;
-class RegExpAtom;
-class RegExpBackReference;
-class RegExpCapture;
-class RegExpCharacterClass;
-class RegExpCompiler;
-class RegExpDisjunction;
-class RegExpEmpty;
-class RegExpLookahead;
-class RegExpQuantifier;
-class RegExpText;
-
-#define DEF_FORWARD_DECLARATION(type) class type;
-AST_NODE_LIST(DEF_FORWARD_DECLARATION)
-#undef DEF_FORWARD_DECLARATION
-
-
-// Typedef only introduced to avoid unreadable code.
-// Please do appreciate the required space in "> >".
-typedef ZoneList<Handle<String> > ZoneStringList;
-typedef ZoneList<Handle<Object> > ZoneObjectList;
-
-
-#define DECLARE_NODE_TYPE(type) \
- virtual void Accept(AstVisitor* v); \
- virtual AstNode::Type node_type() const { return AstNode::k##type; } \
- template<class> friend class AstNodeFactory;
-
-
-enum AstPropertiesFlag {
- kDontInline,
- kDontOptimize,
- kDontSelfOptimize,
- kDontSoftInline,
- kDontCache
-};
-
-
-class AstProperties BASE_EMBEDDED {
- public:
- class Flags : public EnumSet<AstPropertiesFlag, int> {};
-
- AstProperties() : node_count_(0) { }
-
- Flags* flags() { return &flags_; }
- int node_count() { return node_count_; }
- void add_node_count(int count) { node_count_ += count; }
-
- private:
- Flags flags_;
- int node_count_;
-};
-
-
-class AstNode: public ZoneObject {
- public:
-#define DECLARE_TYPE_ENUM(type) k##type,
- enum Type {
- AST_NODE_LIST(DECLARE_TYPE_ENUM)
- kInvalid = -1
- };
-#undef DECLARE_TYPE_ENUM
-
- void* operator new(size_t size, Zone* zone) {
- return zone->New(static_cast<int>(size));
- }
-
- AstNode() { }
-
- virtual ~AstNode() { }
-
- virtual void Accept(AstVisitor* v) = 0;
- virtual Type node_type() const = 0;
-
- // Type testing & conversion functions overridden by concrete subclasses.
-#define DECLARE_NODE_FUNCTIONS(type) \
- bool Is##type() { return node_type() == AstNode::k##type; } \
- type* As##type() { return Is##type() ? reinterpret_cast<type*>(this) : NULL; }
- AST_NODE_LIST(DECLARE_NODE_FUNCTIONS)
-#undef DECLARE_NODE_FUNCTIONS
-
- virtual TargetCollector* AsTargetCollector() { return NULL; }
- virtual BreakableStatement* AsBreakableStatement() { return NULL; }
- virtual IterationStatement* AsIterationStatement() { return NULL; }
- virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; }
-
- protected:
- static int GetNextId(Isolate* isolate) {
- return ReserveIdRange(isolate, 1);
- }
-
- static int ReserveIdRange(Isolate* isolate, int n) {
- int tmp = isolate->ast_node_id();
- isolate->set_ast_node_id(tmp + n);
- return tmp;
- }
-
- // Some nodes re-use bailout IDs for type feedback.
- static TypeFeedbackId reuse(BailoutId id) {
- return TypeFeedbackId(id.ToInt());
- }
-
-
- private:
- // Hidden to prevent accidental usage. It would have to load the
- // current zone from the TLS.
- void* operator new(size_t size);
-
- friend class CaseClause; // Generates AST IDs.
-};
-
-
-class Statement: public AstNode {
- public:
- Statement() : statement_pos_(RelocInfo::kNoPosition) {}
-
- bool IsEmpty() { return AsEmptyStatement() != NULL; }
-
- void set_statement_pos(int statement_pos) { statement_pos_ = statement_pos; }
- int statement_pos() const { return statement_pos_; }
-
- private:
- int statement_pos_;
-};
-
-
-class SmallMapList {
- public:
- SmallMapList() {}
- SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {}
-
- void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); }
- void Clear() { list_.Clear(); }
- void Sort() { list_.Sort(); }
-
- bool is_empty() const { return list_.is_empty(); }
- int length() const { return list_.length(); }
-
- void Add(Handle<Map> handle, Zone* zone) {
- list_.Add(handle.location(), zone);
- }
-
- Handle<Map> at(int i) const {
- return Handle<Map>(list_.at(i));
- }
-
- Handle<Map> first() const { return at(0); }
- Handle<Map> last() const { return at(length() - 1); }
-
- private:
- // The list stores pointers to Map*, that is Map**, so it's GC safe.
- SmallPointerList<Map*> list_;
-
- DISALLOW_COPY_AND_ASSIGN(SmallMapList);
-};
-
-
-class Expression: public AstNode {
- public:
- enum Context {
- // Not assigned a context yet, or else will not be visited during
- // code generation.
- kUninitialized,
- // Evaluated for its side effects.
- kEffect,
- // Evaluated for its value (and side effects).
- kValue,
- // Evaluated for control flow (and side effects).
- kTest
- };
-
- virtual int position() const {
- UNREACHABLE();
- return 0;
- }
-
- virtual bool IsValidLeftHandSide() { return false; }
-
- // Helpers for ToBoolean conversion.
- virtual bool ToBooleanIsTrue() { return false; }
- virtual bool ToBooleanIsFalse() { return false; }
-
- // Symbols that cannot be parsed as array indices are considered property
- // names. We do not treat symbols that can be array indexes as property
- // names because [] for string objects is handled only by keyed ICs.
- virtual bool IsPropertyName() { return false; }
-
- // True iff the result can be safely overwritten (to avoid allocation).
- // False for operations that can return one of their operands.
- virtual bool ResultOverwriteAllowed() { return false; }
-
- // True iff the expression is a literal represented as a smi.
- bool IsSmiLiteral();
-
- // True iff the expression is a string literal.
- bool IsStringLiteral();
-
- // True iff the expression is the null literal.
- bool IsNullLiteral();
-
- // Type feedback information for assignments and properties.
- virtual bool IsMonomorphic() {
- UNREACHABLE();
- return false;
- }
- virtual SmallMapList* GetReceiverTypes() {
- UNREACHABLE();
- return NULL;
- }
- Handle<Map> GetMonomorphicReceiverType() {
- ASSERT(IsMonomorphic());
- SmallMapList* types = GetReceiverTypes();
- ASSERT(types != NULL && types->length() == 1);
- return types->at(0);
- }
-
- BailoutId id() const { return id_; }
- TypeFeedbackId test_id() const { return test_id_; }
-
- protected:
- explicit Expression(Isolate* isolate)
- : id_(GetNextId(isolate)),
- test_id_(GetNextId(isolate)) {}
-
- private:
- const BailoutId id_;
- const TypeFeedbackId test_id_;
-};
-
-
-class BreakableStatement: public Statement {
- public:
- enum Type {
- TARGET_FOR_ANONYMOUS,
- TARGET_FOR_NAMED_ONLY
- };
-
- // The labels associated with this statement. May be NULL;
- // if it is != NULL, guaranteed to contain at least one entry.
- ZoneStringList* labels() const { return labels_; }
-
- // Type testing & conversion.
- virtual BreakableStatement* AsBreakableStatement() { return this; }
-
- // Code generation
- Label* break_target() { return &break_target_; }
-
- // Testers.
- bool is_target_for_anonymous() const { return type_ == TARGET_FOR_ANONYMOUS; }
-
- BailoutId EntryId() const { return entry_id_; }
- BailoutId ExitId() const { return exit_id_; }
-
- protected:
- BreakableStatement(Isolate* isolate, ZoneStringList* labels, Type type)
- : labels_(labels),
- type_(type),
- entry_id_(GetNextId(isolate)),
- exit_id_(GetNextId(isolate)) {
- ASSERT(labels == NULL || labels->length() > 0);
- }
-
-
- private:
- ZoneStringList* labels_;
- Type type_;
- Label break_target_;
- const BailoutId entry_id_;
- const BailoutId exit_id_;
-};
-
-
-class Block: public BreakableStatement {
- public:
- DECLARE_NODE_TYPE(Block)
-
- void AddStatement(Statement* statement, Zone* zone) {
- statements_.Add(statement, zone);
- }
-
- ZoneList<Statement*>* statements() { return &statements_; }
- bool is_initializer_block() const { return is_initializer_block_; }
-
- Scope* scope() const { return scope_; }
- void set_scope(Scope* scope) { scope_ = scope; }
-
- protected:
- Block(Isolate* isolate,
- ZoneStringList* labels,
- int capacity,
- bool is_initializer_block,
- Zone* zone)
- : BreakableStatement(isolate, labels, TARGET_FOR_NAMED_ONLY),
- statements_(capacity, zone),
- is_initializer_block_(is_initializer_block),
- scope_(NULL) {
- }
-
- private:
- ZoneList<Statement*> statements_;
- bool is_initializer_block_;
- Scope* scope_;
-};
-
-
-class Declaration: public AstNode {
- public:
- VariableProxy* proxy() const { return proxy_; }
- VariableMode mode() const { return mode_; }
- Scope* scope() const { return scope_; }
- virtual InitializationFlag initialization() const = 0;
- virtual bool IsInlineable() const;
-
- protected:
- Declaration(VariableProxy* proxy,
- VariableMode mode,
- Scope* scope)
- : proxy_(proxy),
- mode_(mode),
- scope_(scope) {
- ASSERT(IsDeclaredVariableMode(mode));
- }
-
- private:
- VariableProxy* proxy_;
- VariableMode mode_;
-
- // Nested scope from which the declaration originated.
- Scope* scope_;
-};
-
-
-class VariableDeclaration: public Declaration {
- public:
- DECLARE_NODE_TYPE(VariableDeclaration)
-
- virtual InitializationFlag initialization() const {
- return mode() == VAR ? kCreatedInitialized : kNeedsInitialization;
- }
-
- protected:
- VariableDeclaration(VariableProxy* proxy,
- VariableMode mode,
- Scope* scope)
- : Declaration(proxy, mode, scope) {
- }
-};
-
-
-class FunctionDeclaration: public Declaration {
- public:
- DECLARE_NODE_TYPE(FunctionDeclaration)
-
- FunctionLiteral* fun() const { return fun_; }
- virtual InitializationFlag initialization() const {
- return kCreatedInitialized;
- }
- virtual bool IsInlineable() const;
-
- protected:
- FunctionDeclaration(VariableProxy* proxy,
- VariableMode mode,
- FunctionLiteral* fun,
- Scope* scope)
- : Declaration(proxy, mode, scope),
- fun_(fun) {
- // At the moment there are no "const functions" in JavaScript...
- ASSERT(mode == VAR || mode == LET);
- ASSERT(fun != NULL);
- }
-
- private:
- FunctionLiteral* fun_;
-};
-
-
-class ModuleDeclaration: public Declaration {
- public:
- DECLARE_NODE_TYPE(ModuleDeclaration)
-
- Module* module() const { return module_; }
- virtual InitializationFlag initialization() const {
- return kCreatedInitialized;
- }
-
- protected:
- ModuleDeclaration(VariableProxy* proxy,
- Module* module,
- Scope* scope)
- : Declaration(proxy, MODULE, scope),
- module_(module) {
- }
-
- private:
- Module* module_;
-};
-
-
-class ImportDeclaration: public Declaration {
- public:
- DECLARE_NODE_TYPE(ImportDeclaration)
-
- Module* module() const { return module_; }
- virtual InitializationFlag initialization() const {
- return kCreatedInitialized;
- }
-
- protected:
- ImportDeclaration(VariableProxy* proxy,
- Module* module,
- Scope* scope)
- : Declaration(proxy, LET, scope),
- module_(module) {
- }
-
- private:
- Module* module_;
-};
-
-
-class ExportDeclaration: public Declaration {
- public:
- DECLARE_NODE_TYPE(ExportDeclaration)
-
- virtual InitializationFlag initialization() const {
- return kCreatedInitialized;
- }
-
- protected:
- ExportDeclaration(VariableProxy* proxy, Scope* scope)
- : Declaration(proxy, LET, scope) {}
-};
-
-
-class Module: public AstNode {
- public:
- Interface* interface() const { return interface_; }
- Block* body() const { return body_; }
-
- protected:
- explicit Module(Zone* zone)
- : interface_(Interface::NewModule(zone)),
- body_(NULL) {}
- explicit Module(Interface* interface, Block* body = NULL)
- : interface_(interface),
- body_(body) {}
-
- private:
- Interface* interface_;
- Block* body_;
-};
-
-
-class ModuleLiteral: public Module {
- public:
- DECLARE_NODE_TYPE(ModuleLiteral)
-
- protected:
- ModuleLiteral(Block* body, Interface* interface) : Module(interface, body) {}
-};
-
-
-class ModuleVariable: public Module {
- public:
- DECLARE_NODE_TYPE(ModuleVariable)
-
- VariableProxy* proxy() const { return proxy_; }
-
- protected:
- inline explicit ModuleVariable(VariableProxy* proxy);
-
- private:
- VariableProxy* proxy_;
-};
-
-
-class ModulePath: public Module {
- public:
- DECLARE_NODE_TYPE(ModulePath)
-
- Module* module() const { return module_; }
- Handle<String> name() const { return name_; }
-
- protected:
- ModulePath(Module* module, Handle<String> name, Zone* zone)
- : Module(zone),
- module_(module),
- name_(name) {
- }
-
- private:
- Module* module_;
- Handle<String> name_;
-};
-
-
-class ModuleUrl: public Module {
- public:
- DECLARE_NODE_TYPE(ModuleUrl)
-
- Handle<String> url() const { return url_; }
-
- protected:
- ModuleUrl(Handle<String> url, Zone* zone)
- : Module(zone), url_(url) {
- }
-
- private:
- Handle<String> url_;
-};
-
-
-class ModuleStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(ModuleStatement)
-
- VariableProxy* proxy() const { return proxy_; }
- Block* body() const { return body_; }
-
- protected:
- ModuleStatement(VariableProxy* proxy, Block* body)
- : proxy_(proxy),
- body_(body) {
- }
-
- private:
- VariableProxy* proxy_;
- Block* body_;
-};
-
-
-class IterationStatement: public BreakableStatement {
- public:
- // Type testing & conversion.
- virtual IterationStatement* AsIterationStatement() { return this; }
-
- Statement* body() const { return body_; }
-
- BailoutId OsrEntryId() const { return osr_entry_id_; }
- virtual BailoutId ContinueId() const = 0;
- virtual BailoutId StackCheckId() const = 0;
-
- // Code generation
- Label* continue_target() { return &continue_target_; }
-
- protected:
- IterationStatement(Isolate* isolate, ZoneStringList* labels)
- : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS),
- body_(NULL),
- osr_entry_id_(GetNextId(isolate)) {
- }
-
- void Initialize(Statement* body) {
- body_ = body;
- }
-
- private:
- Statement* body_;
- Label continue_target_;
- const BailoutId osr_entry_id_;
-};
-
-
-class DoWhileStatement: public IterationStatement {
- public:
- DECLARE_NODE_TYPE(DoWhileStatement)
-
- void Initialize(Expression* cond, Statement* body) {
- IterationStatement::Initialize(body);
- cond_ = cond;
- }
-
- Expression* cond() const { return cond_; }
-
- // Position where condition expression starts. We need it to make
- // the loop's condition a breakable location.
- int condition_position() { return condition_position_; }
- void set_condition_position(int pos) { condition_position_ = pos; }
-
- virtual BailoutId ContinueId() const { return continue_id_; }
- virtual BailoutId StackCheckId() const { return back_edge_id_; }
- BailoutId BackEdgeId() const { return back_edge_id_; }
-
- protected:
- DoWhileStatement(Isolate* isolate, ZoneStringList* labels)
- : IterationStatement(isolate, labels),
- cond_(NULL),
- condition_position_(-1),
- continue_id_(GetNextId(isolate)),
- back_edge_id_(GetNextId(isolate)) {
- }
-
- private:
- Expression* cond_;
- int condition_position_;
- const BailoutId continue_id_;
- const BailoutId back_edge_id_;
-};
-
-
-class WhileStatement: public IterationStatement {
- public:
- DECLARE_NODE_TYPE(WhileStatement)
-
- void Initialize(Expression* cond, Statement* body) {
- IterationStatement::Initialize(body);
- cond_ = cond;
- }
-
- Expression* cond() const { return cond_; }
- bool may_have_function_literal() const {
- return may_have_function_literal_;
- }
- void set_may_have_function_literal(bool value) {
- may_have_function_literal_ = value;
- }
-
- virtual BailoutId ContinueId() const { return EntryId(); }
- virtual BailoutId StackCheckId() const { return body_id_; }
- BailoutId BodyId() const { return body_id_; }
-
- protected:
- WhileStatement(Isolate* isolate, ZoneStringList* labels)
- : IterationStatement(isolate, labels),
- cond_(NULL),
- may_have_function_literal_(true),
- body_id_(GetNextId(isolate)) {
- }
-
- private:
- Expression* cond_;
- // True if there is a function literal subexpression in the condition.
- bool may_have_function_literal_;
- const BailoutId body_id_;
-};
-
-
-class ForStatement: public IterationStatement {
- public:
- DECLARE_NODE_TYPE(ForStatement)
-
- void Initialize(Statement* init,
- Expression* cond,
- Statement* next,
- Statement* body) {
- IterationStatement::Initialize(body);
- init_ = init;
- cond_ = cond;
- next_ = next;
- }
-
- Statement* init() const { return init_; }
- Expression* cond() const { return cond_; }
- Statement* next() const { return next_; }
-
- bool may_have_function_literal() const {
- return may_have_function_literal_;
- }
- void set_may_have_function_literal(bool value) {
- may_have_function_literal_ = value;
- }
-
- virtual BailoutId ContinueId() const { return continue_id_; }
- virtual BailoutId StackCheckId() const { return body_id_; }
- BailoutId BodyId() const { return body_id_; }
-
- bool is_fast_smi_loop() { return loop_variable_ != NULL; }
- Variable* loop_variable() { return loop_variable_; }
- void set_loop_variable(Variable* var) { loop_variable_ = var; }
-
- protected:
- ForStatement(Isolate* isolate, ZoneStringList* labels)
- : IterationStatement(isolate, labels),
- init_(NULL),
- cond_(NULL),
- next_(NULL),
- may_have_function_literal_(true),
- loop_variable_(NULL),
- continue_id_(GetNextId(isolate)),
- body_id_(GetNextId(isolate)) {
- }
-
- private:
- Statement* init_;
- Expression* cond_;
- Statement* next_;
- // True if there is a function literal subexpression in the condition.
- bool may_have_function_literal_;
- Variable* loop_variable_;
- const BailoutId continue_id_;
- const BailoutId body_id_;
-};
-
-
-class ForInStatement: public IterationStatement {
- public:
- DECLARE_NODE_TYPE(ForInStatement)
-
- void Initialize(Expression* each, Expression* enumerable, Statement* body) {
- IterationStatement::Initialize(body);
- each_ = each;
- enumerable_ = enumerable;
- }
-
- Expression* each() const { return each_; }
- Expression* enumerable() const { return enumerable_; }
-
- virtual BailoutId ContinueId() const { return EntryId(); }
- virtual BailoutId StackCheckId() const { return body_id_; }
- BailoutId BodyId() const { return body_id_; }
- BailoutId PrepareId() const { return prepare_id_; }
-
- TypeFeedbackId ForInFeedbackId() const { return reuse(PrepareId()); }
-
- protected:
- ForInStatement(Isolate* isolate, ZoneStringList* labels)
- : IterationStatement(isolate, labels),
- each_(NULL),
- enumerable_(NULL),
- body_id_(GetNextId(isolate)),
- prepare_id_(GetNextId(isolate)) {
- }
-
- private:
- Expression* each_;
- Expression* enumerable_;
- const BailoutId body_id_;
- const BailoutId prepare_id_;
-};
-
-
-class ExpressionStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(ExpressionStatement)
-
- void set_expression(Expression* e) { expression_ = e; }
- Expression* expression() const { return expression_; }
-
- protected:
- explicit ExpressionStatement(Expression* expression)
- : expression_(expression) { }
-
- private:
- Expression* expression_;
-};
-
-
-class ContinueStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(ContinueStatement)
-
- IterationStatement* target() const { return target_; }
-
- protected:
- explicit ContinueStatement(IterationStatement* target)
- : target_(target) { }
-
- private:
- IterationStatement* target_;
-};
-
-
-class BreakStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(BreakStatement)
-
- BreakableStatement* target() const { return target_; }
-
- protected:
- explicit BreakStatement(BreakableStatement* target)
- : target_(target) { }
-
- private:
- BreakableStatement* target_;
-};
-
-
-class ReturnStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(ReturnStatement)
-
- Expression* expression() const { return expression_; }
-
- protected:
- explicit ReturnStatement(Expression* expression)
- : expression_(expression) { }
-
- private:
- Expression* expression_;
-};
-
-
-class WithStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(WithStatement)
-
- Expression* expression() const { return expression_; }
- Statement* statement() const { return statement_; }
-
- protected:
- WithStatement(Expression* expression, Statement* statement)
- : expression_(expression),
- statement_(statement) { }
-
- private:
- Expression* expression_;
- Statement* statement_;
-};
-
-
-class CaseClause: public ZoneObject {
- public:
- CaseClause(Isolate* isolate,
- Expression* label,
- ZoneList<Statement*>* statements,
- int pos);
-
- bool is_default() const { return label_ == NULL; }
- Expression* label() const {
- CHECK(!is_default());
- return label_;
- }
- Label* body_target() { return &body_target_; }
- ZoneList<Statement*>* statements() const { return statements_; }
-
- int position() const { return position_; }
- void set_position(int pos) { position_ = pos; }
-
- BailoutId EntryId() const { return entry_id_; }
-
- // Type feedback information.
- TypeFeedbackId CompareId() { return compare_id_; }
- void RecordTypeFeedback(TypeFeedbackOracle* oracle);
- bool IsSmiCompare() { return compare_type_ == SMI_ONLY; }
- bool IsNameCompare() { return compare_type_ == NAME_ONLY; }
- bool IsStringCompare() { return compare_type_ == STRING_ONLY; }
- bool IsObjectCompare() { return compare_type_ == OBJECT_ONLY; }
-
- private:
- Expression* label_;
- Label body_target_;
- ZoneList<Statement*>* statements_;
- int position_;
- enum CompareTypeFeedback {
- NONE,
- SMI_ONLY,
- NAME_ONLY,
- STRING_ONLY,
- OBJECT_ONLY
- };
- CompareTypeFeedback compare_type_;
- const TypeFeedbackId compare_id_;
- const BailoutId entry_id_;
-};
-
-
-class SwitchStatement: public BreakableStatement {
- public:
- DECLARE_NODE_TYPE(SwitchStatement)
-
- void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) {
- tag_ = tag;
- cases_ = cases;
- }
-
- Expression* tag() const { return tag_; }
- ZoneList<CaseClause*>* cases() const { return cases_; }
-
- protected:
- SwitchStatement(Isolate* isolate, ZoneStringList* labels)
- : BreakableStatement(isolate, labels, TARGET_FOR_ANONYMOUS),
- tag_(NULL),
- cases_(NULL) { }
-
- private:
- Expression* tag_;
- ZoneList<CaseClause*>* cases_;
-};
-
-
-// If-statements always have non-null references to their then- and
-// else-parts. When parsing if-statements with no explicit else-part,
-// the parser implicitly creates an empty statement. Use the
-// HasThenStatement() and HasElseStatement() functions to check if a
-// given if-statement has a then- or an else-part containing code.
-class IfStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(IfStatement)
-
- bool HasThenStatement() const { return !then_statement()->IsEmpty(); }
- bool HasElseStatement() const { return !else_statement()->IsEmpty(); }
-
- Expression* condition() const { return condition_; }
- Statement* then_statement() const { return then_statement_; }
- Statement* else_statement() const { return else_statement_; }
-
- BailoutId IfId() const { return if_id_; }
- BailoutId ThenId() const { return then_id_; }
- BailoutId ElseId() const { return else_id_; }
-
- protected:
- IfStatement(Isolate* isolate,
- Expression* condition,
- Statement* then_statement,
- Statement* else_statement)
- : condition_(condition),
- then_statement_(then_statement),
- else_statement_(else_statement),
- if_id_(GetNextId(isolate)),
- then_id_(GetNextId(isolate)),
- else_id_(GetNextId(isolate)) {
- }
-
- private:
- Expression* condition_;
- Statement* then_statement_;
- Statement* else_statement_;
- const BailoutId if_id_;
- const BailoutId then_id_;
- const BailoutId else_id_;
-};
-
-
-// NOTE: TargetCollectors are represented as nodes to fit in the target
-// stack in the compiler; this should probably be reworked.
-class TargetCollector: public AstNode {
- public:
- explicit TargetCollector(Zone* zone) : targets_(0, zone) { }
-
- // Adds a jump target to the collector. The collector stores a pointer not
- // a copy of the target to make binding work, so make sure not to pass in
- // references to something on the stack.
- void AddTarget(Label* target, Zone* zone);
-
- // Virtual behaviour. TargetCollectors are never part of the AST.
- virtual void Accept(AstVisitor* v) { UNREACHABLE(); }
- virtual Type node_type() const { return kInvalid; }
- virtual TargetCollector* AsTargetCollector() { return this; }
-
- ZoneList<Label*>* targets() { return &targets_; }
-
- private:
- ZoneList<Label*> targets_;
-};
-
-
-class TryStatement: public Statement {
- public:
- void set_escaping_targets(ZoneList<Label*>* targets) {
- escaping_targets_ = targets;
- }
-
- int index() const { return index_; }
- Block* try_block() const { return try_block_; }
- ZoneList<Label*>* escaping_targets() const { return escaping_targets_; }
-
- protected:
- TryStatement(int index, Block* try_block)
- : index_(index),
- try_block_(try_block),
- escaping_targets_(NULL) { }
-
- private:
- // Unique (per-function) index of this handler. This is not an AST ID.
- int index_;
-
- Block* try_block_;
- ZoneList<Label*>* escaping_targets_;
-};
-
-
-class TryCatchStatement: public TryStatement {
- public:
- DECLARE_NODE_TYPE(TryCatchStatement)
-
- Scope* scope() { return scope_; }
- Variable* variable() { return variable_; }
- Block* catch_block() const { return catch_block_; }
-
- protected:
- TryCatchStatement(int index,
- Block* try_block,
- Scope* scope,
- Variable* variable,
- Block* catch_block)
- : TryStatement(index, try_block),
- scope_(scope),
- variable_(variable),
- catch_block_(catch_block) {
- }
-
- private:
- Scope* scope_;
- Variable* variable_;
- Block* catch_block_;
-};
-
-
-class TryFinallyStatement: public TryStatement {
- public:
- DECLARE_NODE_TYPE(TryFinallyStatement)
-
- Block* finally_block() const { return finally_block_; }
-
- protected:
- TryFinallyStatement(int index, Block* try_block, Block* finally_block)
- : TryStatement(index, try_block),
- finally_block_(finally_block) { }
-
- private:
- Block* finally_block_;
-};
-
-
-class DebuggerStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(DebuggerStatement)
-
- protected:
- DebuggerStatement() {}
-};
-
-
-class EmptyStatement: public Statement {
- public:
- DECLARE_NODE_TYPE(EmptyStatement)
-
- protected:
- EmptyStatement() {}
-};
-
-
-class Literal: public Expression {
- public:
- DECLARE_NODE_TYPE(Literal)
-
- virtual bool IsPropertyName() {
- if (handle_->IsInternalizedString()) {
- uint32_t ignored;
- return !String::cast(*handle_)->AsArrayIndex(&ignored);
- }
- return false;
- }
-
- Handle<String> AsPropertyName() {
- ASSERT(IsPropertyName());
- return Handle<String>::cast(handle_);
- }
-
- virtual bool ToBooleanIsTrue() { return handle_->ToBoolean()->IsTrue(); }
- virtual bool ToBooleanIsFalse() { return handle_->ToBoolean()->IsFalse(); }
-
- // Identity testers.
- bool IsNull() const {
- ASSERT(!handle_.is_null());
- return handle_->IsNull();
- }
- bool IsTrue() const {
- ASSERT(!handle_.is_null());
- return handle_->IsTrue();
- }
- bool IsFalse() const {
- ASSERT(!handle_.is_null());
- return handle_->IsFalse();
- }
-
- Handle<Object> handle() const { return handle_; }
-
- // Support for using Literal as a HashMap key. NOTE: Currently, this works
- // only for string and number literals!
- uint32_t Hash() { return ToString()->Hash(); }
-
- static bool Match(void* literal1, void* literal2) {
- Handle<String> s1 = static_cast<Literal*>(literal1)->ToString();
- Handle<String> s2 = static_cast<Literal*>(literal2)->ToString();
- return s1->Equals(*s2);
- }
-
- TypeFeedbackId LiteralFeedbackId() const { return reuse(id()); }
-
- protected:
- Literal(Isolate* isolate, Handle<Object> handle)
- : Expression(isolate),
- handle_(handle) { }
-
- private:
- Handle<String> ToString();
-
- Handle<Object> handle_;
-};
-
-
-// Base class for literals that needs space in the corresponding JSFunction.
-class MaterializedLiteral: public Expression {
- public:
- virtual MaterializedLiteral* AsMaterializedLiteral() { return this; }
-
- int literal_index() { return literal_index_; }
-
- // A materialized literal is simple if the values consist of only
- // constants and simple object and array literals.
- bool is_simple() const { return is_simple_; }
-
- int depth() const { return depth_; }
-
- protected:
- MaterializedLiteral(Isolate* isolate,
- int literal_index,
- bool is_simple,
- int depth)
- : Expression(isolate),
- literal_index_(literal_index),
- is_simple_(is_simple),
- depth_(depth) {}
-
- private:
- int literal_index_;
- bool is_simple_;
- int depth_;
-};
-
-
-// An object literal has a boilerplate object that is used
-// for minimizing the work when constructing it at runtime.
-class ObjectLiteral: public MaterializedLiteral {
- public:
- // Property is used for passing information
- // about an object literal's properties from the parser
- // to the code generator.
- class Property: public ZoneObject {
- public:
- enum Kind {
- CONSTANT, // Property with constant value (compile time).
- COMPUTED, // Property with computed value (execution time).
- MATERIALIZED_LITERAL, // Property value is a materialized literal.
- GETTER, SETTER, // Property is an accessor function.
- PROTOTYPE // Property is __proto__.
- };
-
- Property(Literal* key, Expression* value, Isolate* isolate);
-
- Literal* key() { return key_; }
- Expression* value() { return value_; }
- Kind kind() { return kind_; }
-
- // Type feedback information.
- void RecordTypeFeedback(TypeFeedbackOracle* oracle);
- bool IsMonomorphic() { return !receiver_type_.is_null(); }
- Handle<Map> GetReceiverType() { return receiver_type_; }
-
- bool IsCompileTimeValue();
-
- void set_emit_store(bool emit_store);
- bool emit_store();
-
- protected:
- template<class> friend class AstNodeFactory;
-
- Property(bool is_getter, FunctionLiteral* value);
- void set_key(Literal* key) { key_ = key; }
-
- private:
- Literal* key_;
- Expression* value_;
- Kind kind_;
- bool emit_store_;
- Handle<Map> receiver_type_;
- };
-
- DECLARE_NODE_TYPE(ObjectLiteral)
-
- Handle<FixedArray> constant_properties() const {
- return constant_properties_;
- }
- ZoneList<Property*>* properties() const { return properties_; }
-
- bool fast_elements() const { return fast_elements_; }
-
- bool has_function() { return has_function_; }
-
- // Mark all computed expressions that are bound to a key that
- // is shadowed by a later occurrence of the same key. For the
- // marked expressions, no store code is emitted.
- void CalculateEmitStore(Zone* zone);
-
- enum Flags {
- kNoFlags = 0,
- kFastElements = 1,
- kHasFunction = 1 << 1
- };
-
- struct Accessors: public ZoneObject {
- Accessors() : getter(NULL), setter(NULL) { }
- Expression* getter;
- Expression* setter;
- };
-
- protected:
- ObjectLiteral(Isolate* isolate,
- Handle<FixedArray> constant_properties,
- ZoneList<Property*>* properties,
- int literal_index,
- bool is_simple,
- bool fast_elements,
- int depth,
- bool has_function)
- : MaterializedLiteral(isolate, literal_index, is_simple, depth),
- constant_properties_(constant_properties),
- properties_(properties),
- fast_elements_(fast_elements),
- has_function_(has_function) {}
-
- private:
- Handle<FixedArray> constant_properties_;
- ZoneList<Property*>* properties_;
- bool fast_elements_;
- bool has_function_;
-};
-
-
-// Node for capturing a regexp literal.
-class RegExpLiteral: public MaterializedLiteral {
- public:
- DECLARE_NODE_TYPE(RegExpLiteral)
-
- Handle<String> pattern() const { return pattern_; }
- Handle<String> flags() const { return flags_; }
-
- protected:
- RegExpLiteral(Isolate* isolate,
- Handle<String> pattern,
- Handle<String> flags,
- int literal_index)
- : MaterializedLiteral(isolate, literal_index, false, 1),
- pattern_(pattern),
- flags_(flags) {}
-
- private:
- Handle<String> pattern_;
- Handle<String> flags_;
-};
-
-// An array literal has a literals object that is used
-// for minimizing the work when constructing it at runtime.
-class ArrayLiteral: public MaterializedLiteral {
- public:
- DECLARE_NODE_TYPE(ArrayLiteral)
-
- Handle<FixedArray> constant_elements() const { return constant_elements_; }
- ZoneList<Expression*>* values() const { return values_; }
-
- // Return an AST id for an element that is used in simulate instructions.
- BailoutId GetIdForElement(int i) {
- return BailoutId(first_element_id_.ToInt() + i);
- }
-
- protected:
- ArrayLiteral(Isolate* isolate,
- Handle<FixedArray> constant_elements,
- ZoneList<Expression*>* values,
- int literal_index,
- bool is_simple,
- int depth)
- : MaterializedLiteral(isolate, literal_index, is_simple, depth),
- constant_elements_(constant_elements),
- values_(values),
- first_element_id_(ReserveIdRange(isolate, values->length())) {}
-
- private:
- Handle<FixedArray> constant_elements_;
- ZoneList<Expression*>* values_;
- const BailoutId first_element_id_;
-};
-
-
-class VariableProxy: public Expression {
- public:
- DECLARE_NODE_TYPE(VariableProxy)
-
- virtual bool IsValidLeftHandSide() {
- return var_ == NULL ? true : var_->IsValidLeftHandSide();
- }
-
- bool IsVariable(Handle<String> n) {
- return !is_this() && name().is_identical_to(n);
- }
-
- bool IsArguments() { return var_ != NULL && var_->is_arguments(); }
-
- bool IsLValue() {
- return is_lvalue_;
- }
-
- Handle<String> name() const { return name_; }
- Variable* var() const { return var_; }
- bool is_this() const { return is_this_; }
- int position() const { return position_; }
- Interface* interface() const { return interface_; }
-
-
- void MarkAsTrivial() { is_trivial_ = true; }
- void MarkAsLValue() { is_lvalue_ = true; }
-
- // Bind this proxy to the variable var. Interfaces must match.
- void BindTo(Variable* var);
-
- protected:
- VariableProxy(Isolate* isolate, Variable* var);
-
- VariableProxy(Isolate* isolate,
- Handle<String> name,
- bool is_this,
- Interface* interface,
- int position);
-
- Handle<String> name_;
- Variable* var_; // resolved variable, or NULL
- bool is_this_;
- bool is_trivial_;
- // True if this variable proxy is being used in an assignment
- // or with a increment/decrement operator.
- bool is_lvalue_;
- int position_;
- Interface* interface_;
-};
-
-
-class Property: public Expression {
- public:
- DECLARE_NODE_TYPE(Property)
-
- virtual bool IsValidLeftHandSide() { return true; }
-
- Expression* obj() const { return obj_; }
- Expression* key() const { return key_; }
- virtual int position() const { return pos_; }
-
- BailoutId LoadId() const { return load_id_; }
-
- bool IsStringLength() const { return is_string_length_; }
- bool IsStringAccess() const { return is_string_access_; }
- bool IsFunctionPrototype() const { return is_function_prototype_; }
-
- // Type feedback information.
- void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone);
- virtual bool IsMonomorphic() { return is_monomorphic_; }
- virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
- bool IsArrayLength() { return is_array_length_; }
- bool IsUninitialized() { return is_uninitialized_; }
- TypeFeedbackId PropertyFeedbackId() { return reuse(id()); }
-
- protected:
- Property(Isolate* isolate,
- Expression* obj,
- Expression* key,
- int pos)
- : Expression(isolate),
- obj_(obj),
- key_(key),
- pos_(pos),
- load_id_(GetNextId(isolate)),
- is_monomorphic_(false),
- is_uninitialized_(false),
- is_array_length_(false),
- is_string_length_(false),
- is_string_access_(false),
- is_function_prototype_(false) { }
-
- private:
- Expression* obj_;
- Expression* key_;
- int pos_;
- const BailoutId load_id_;
-
- SmallMapList receiver_types_;
- bool is_monomorphic_ : 1;
- bool is_uninitialized_ : 1;
- bool is_array_length_ : 1;
- bool is_string_length_ : 1;
- bool is_string_access_ : 1;
- bool is_function_prototype_ : 1;
-};
-
-
-class Call: public Expression {
- public:
- DECLARE_NODE_TYPE(Call)
-
- Expression* expression() const { return expression_; }
- ZoneList<Expression*>* arguments() const { return arguments_; }
- virtual int position() const { return pos_; }
-
- // Type feedback information.
- TypeFeedbackId CallFeedbackId() const { return reuse(id()); }
- void RecordTypeFeedback(TypeFeedbackOracle* oracle, CallKind call_kind);
- virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
- virtual bool IsMonomorphic() { return is_monomorphic_; }
- CheckType check_type() const { return check_type_; }
- Handle<JSFunction> target() { return target_; }
-
- // A cache for the holder, set as a side effect of computing the target of the
- // call. Note that it contains the null handle when the receiver is the same
- // as the holder!
- Handle<JSObject> holder() { return holder_; }
-
- Handle<JSGlobalPropertyCell> cell() { return cell_; }
-
- bool ComputeTarget(Handle<Map> type, Handle<String> name);
- bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupResult* lookup);
-
- BailoutId ReturnId() const { return return_id_; }
-
-#ifdef DEBUG
- // Used to assert that the FullCodeGenerator records the return site.
- bool return_is_recorded_;
-#endif
-
- protected:
- Call(Isolate* isolate,
- Expression* expression,
- ZoneList<Expression*>* arguments,
- int pos)
- : Expression(isolate),
- expression_(expression),
- arguments_(arguments),
- pos_(pos),
- is_monomorphic_(false),
- check_type_(RECEIVER_MAP_CHECK),
- return_id_(GetNextId(isolate)) { }
-
- private:
- Expression* expression_;
- ZoneList<Expression*>* arguments_;
- int pos_;
-
- bool is_monomorphic_;
- CheckType check_type_;
- SmallMapList receiver_types_;
- Handle<JSFunction> target_;
- Handle<JSObject> holder_;
- Handle<JSGlobalPropertyCell> cell_;
-
- const BailoutId return_id_;
-};
-
-
-class CallNew: public Expression {
- public:
- DECLARE_NODE_TYPE(CallNew)
-
- Expression* expression() const { return expression_; }
- ZoneList<Expression*>* arguments() const { return arguments_; }
- virtual int position() const { return pos_; }
-
- // Type feedback information.
- TypeFeedbackId CallNewFeedbackId() const { return reuse(id()); }
- void RecordTypeFeedback(TypeFeedbackOracle* oracle);
- virtual bool IsMonomorphic() { return is_monomorphic_; }
- Handle<JSFunction> target() { return target_; }
-
- BailoutId ReturnId() const { return return_id_; }
- ElementsKind elements_kind() const { return elements_kind_; }
-
- protected:
- CallNew(Isolate* isolate,
- Expression* expression,
- ZoneList<Expression*>* arguments,
- int pos)
- : Expression(isolate),
- expression_(expression),
- arguments_(arguments),
- pos_(pos),
- is_monomorphic_(false),
- return_id_(GetNextId(isolate)),
- elements_kind_(GetInitialFastElementsKind()) { }
-
- private:
- Expression* expression_;
- ZoneList<Expression*>* arguments_;
- int pos_;
-
- bool is_monomorphic_;
- Handle<JSFunction> target_;
-
- const BailoutId return_id_;
- ElementsKind elements_kind_;
-};
-
-
-// The CallRuntime class does not represent any official JavaScript
-// language construct. Instead it is used to call a C or JS function
-// with a set of arguments. This is used from the builtins that are
-// implemented in JavaScript (see "v8natives.js").
-class CallRuntime: public Expression {
- public:
- DECLARE_NODE_TYPE(CallRuntime)
-
- Handle<String> name() const { return name_; }
- const Runtime::Function* function() const { return function_; }
- ZoneList<Expression*>* arguments() const { return arguments_; }
- bool is_jsruntime() const { return function_ == NULL; }
-
- TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); }
-
- protected:
- CallRuntime(Isolate* isolate,
- Handle<String> name,
- const Runtime::Function* function,
- ZoneList<Expression*>* arguments)
- : Expression(isolate),
- name_(name),
- function_(function),
- arguments_(arguments) { }
-
- private:
- Handle<String> name_;
- const Runtime::Function* function_;
- ZoneList<Expression*>* arguments_;
-};
-
-
-class UnaryOperation: public Expression {
- public:
- DECLARE_NODE_TYPE(UnaryOperation)
-
- virtual bool ResultOverwriteAllowed();
-
- Token::Value op() const { return op_; }
- Expression* expression() const { return expression_; }
- virtual int position() const { return pos_; }
-
- BailoutId MaterializeTrueId() { return materialize_true_id_; }
- BailoutId MaterializeFalseId() { return materialize_false_id_; }
-
- TypeFeedbackId UnaryOperationFeedbackId() const { return reuse(id()); }
-
- protected:
- UnaryOperation(Isolate* isolate,
- Token::Value op,
- Expression* expression,
- int pos)
- : Expression(isolate),
- op_(op),
- expression_(expression),
- pos_(pos),
- materialize_true_id_(GetNextId(isolate)),
- materialize_false_id_(GetNextId(isolate)) {
- ASSERT(Token::IsUnaryOp(op));
- }
-
- private:
- Token::Value op_;
- Expression* expression_;
- int pos_;
-
- // For unary not (Token::NOT), the AST ids where true and false will
- // actually be materialized, respectively.
- const BailoutId materialize_true_id_;
- const BailoutId materialize_false_id_;
-};
-
-
-class BinaryOperation: public Expression {
- public:
- DECLARE_NODE_TYPE(BinaryOperation)
-
- virtual bool ResultOverwriteAllowed();
-
- Token::Value op() const { return op_; }
- Expression* left() const { return left_; }
- Expression* right() const { return right_; }
- virtual int position() const { return pos_; }
-
- BailoutId RightId() const { return right_id_; }
-
- TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); }
-
- protected:
- BinaryOperation(Isolate* isolate,
- Token::Value op,
- Expression* left,
- Expression* right,
- int pos)
- : Expression(isolate),
- op_(op),
- left_(left),
- right_(right),
- pos_(pos),
- right_id_(GetNextId(isolate)) {
- ASSERT(Token::IsBinaryOp(op));
- }
-
- private:
- Token::Value op_;
- Expression* left_;
- Expression* right_;
- int pos_;
- // The short-circuit logical operations need an AST ID for their
- // right-hand subexpression.
- const BailoutId right_id_;
-};
-
-
-class CountOperation: public Expression {
- public:
- DECLARE_NODE_TYPE(CountOperation)
-
- bool is_prefix() const { return is_prefix_; }
- bool is_postfix() const { return !is_prefix_; }
-
- Token::Value op() const { return op_; }
- Token::Value binary_op() {
- return (op() == Token::INC) ? Token::ADD : Token::SUB;
- }
-
- Expression* expression() const { return expression_; }
- virtual int position() const { return pos_; }
-
- virtual void MarkAsStatement() { is_prefix_ = true; }
-
- void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* znoe);
- virtual bool IsMonomorphic() { return is_monomorphic_; }
- virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
-
- BailoutId AssignmentId() const { return assignment_id_; }
-
- TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; }
- TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); }
-
- protected:
- CountOperation(Isolate* isolate,
- Token::Value op,
- bool is_prefix,
- Expression* expr,
- int pos)
- : Expression(isolate),
- op_(op),
- is_prefix_(is_prefix),
- expression_(expr),
- pos_(pos),
- assignment_id_(GetNextId(isolate)),
- count_id_(GetNextId(isolate)) {}
-
- private:
- Token::Value op_;
- bool is_prefix_;
- bool is_monomorphic_;
- Expression* expression_;
- int pos_;
- const BailoutId assignment_id_;
- const TypeFeedbackId count_id_;
- SmallMapList receiver_types_;
-};
-
-
-class CompareOperation: public Expression {
- public:
- DECLARE_NODE_TYPE(CompareOperation)
-
- Token::Value op() const { return op_; }
- Expression* left() const { return left_; }
- Expression* right() const { return right_; }
- virtual int position() const { return pos_; }
-
- // Type feedback information.
- TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); }
-
- // Match special cases.
- bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check);
- bool IsLiteralCompareUndefined(Expression** expr);
- bool IsLiteralCompareNull(Expression** expr);
-
- protected:
- CompareOperation(Isolate* isolate,
- Token::Value op,
- Expression* left,
- Expression* right,
- int pos)
- : Expression(isolate),
- op_(op),
- left_(left),
- right_(right),
- pos_(pos) {
- ASSERT(Token::IsCompareOp(op));
- }
-
- private:
- Token::Value op_;
- Expression* left_;
- Expression* right_;
- int pos_;
-};
-
-
-class Conditional: public Expression {
- public:
- DECLARE_NODE_TYPE(Conditional)
-
- Expression* condition() const { return condition_; }
- Expression* then_expression() const { return then_expression_; }
- Expression* else_expression() const { return else_expression_; }
-
- int then_expression_position() const { return then_expression_position_; }
- int else_expression_position() const { return else_expression_position_; }
-
- BailoutId ThenId() const { return then_id_; }
- BailoutId ElseId() const { return else_id_; }
-
- protected:
- Conditional(Isolate* isolate,
- Expression* condition,
- Expression* then_expression,
- Expression* else_expression,
- int then_expression_position,
- int else_expression_position)
- : Expression(isolate),
- condition_(condition),
- then_expression_(then_expression),
- else_expression_(else_expression),
- then_expression_position_(then_expression_position),
- else_expression_position_(else_expression_position),
- then_id_(GetNextId(isolate)),
- else_id_(GetNextId(isolate)) { }
-
- private:
- Expression* condition_;
- Expression* then_expression_;
- Expression* else_expression_;
- int then_expression_position_;
- int else_expression_position_;
- const BailoutId then_id_;
- const BailoutId else_id_;
-};
-
-
-class Assignment: public Expression {
- public:
- DECLARE_NODE_TYPE(Assignment)
-
- Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; }
-
- Token::Value binary_op() const;
-
- Token::Value op() const { return op_; }
- Expression* target() const { return target_; }
- Expression* value() const { return value_; }
- virtual int position() const { return pos_; }
- BinaryOperation* binary_operation() const { return binary_operation_; }
-
- // This check relies on the definition order of token in token.h.
- bool is_compound() const { return op() > Token::ASSIGN; }
-
- BailoutId AssignmentId() const { return assignment_id_; }
-
- // Type feedback information.
- TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); }
- void RecordTypeFeedback(TypeFeedbackOracle* oracle, Zone* zone);
- virtual bool IsMonomorphic() { return is_monomorphic_; }
- virtual SmallMapList* GetReceiverTypes() { return &receiver_types_; }
-
- protected:
- Assignment(Isolate* isolate,
- Token::Value op,
- Expression* target,
- Expression* value,
- int pos);
-
- template<class Visitor>
- void Init(Isolate* isolate, AstNodeFactory<Visitor>* factory) {
- ASSERT(Token::IsAssignmentOp(op_));
- if (is_compound()) {
- binary_operation_ =
- factory->NewBinaryOperation(binary_op(), target_, value_, pos_ + 1);
- }
- }
-
- private:
- Token::Value op_;
- Expression* target_;
- Expression* value_;
- int pos_;
- BinaryOperation* binary_operation_;
- const BailoutId assignment_id_;
-
- bool is_monomorphic_;
- SmallMapList receiver_types_;
-};
-
-
-class Throw: public Expression {
- public:
- DECLARE_NODE_TYPE(Throw)
-
- Expression* exception() const { return exception_; }
- virtual int position() const { return pos_; }
-
- protected:
- Throw(Isolate* isolate, Expression* exception, int pos)
- : Expression(isolate), exception_(exception), pos_(pos) {}
-
- private:
- Expression* exception_;
- int pos_;
-};
-
-
-class FunctionLiteral: public Expression {
- public:
- enum Type {
- ANONYMOUS_EXPRESSION,
- NAMED_EXPRESSION,
- DECLARATION
- };
-
- enum ParameterFlag {
- kNoDuplicateParameters = 0,
- kHasDuplicateParameters = 1
- };
-
- enum IsFunctionFlag {
- kGlobalOrEval,
- kIsFunction
- };
-
- enum IsParenthesizedFlag {
- kIsParenthesized,
- kNotParenthesized
- };
-
- DECLARE_NODE_TYPE(FunctionLiteral)
-
- Handle<String> name() const { return name_; }
- Scope* scope() const { return scope_; }
- ZoneList<Statement*>* body() const { return body_; }
- void set_function_token_position(int pos) { function_token_position_ = pos; }
- int function_token_position() const { return function_token_position_; }
- int start_position() const;
- int end_position() const;
- int SourceSize() const { return end_position() - start_position(); }
- bool is_expression() const { return IsExpression::decode(bitfield_); }
- bool is_anonymous() const { return IsAnonymous::decode(bitfield_); }
- bool is_classic_mode() const { return language_mode() == CLASSIC_MODE; }
- LanguageMode language_mode() const;
- bool qml_mode() const { return qml_mode_flag() == kQmlMode; }
- QmlModeFlag qml_mode_flag() const;
-
- int materialized_literal_count() { return materialized_literal_count_; }
- int expected_property_count() { return expected_property_count_; }
- int handler_count() { return handler_count_; }
- bool has_only_simple_this_property_assignments() {
- return HasOnlySimpleThisPropertyAssignments::decode(bitfield_);
- }
- Handle<FixedArray> this_property_assignments() {
- return this_property_assignments_;
- }
- int parameter_count() { return parameter_count_; }
-
- bool AllowsLazyCompilation();
- bool AllowsLazyCompilationWithoutContext();
-
- Handle<String> debug_name() const {
- if (name_->length() > 0) return name_;
- return inferred_name();
- }
-
- Handle<String> inferred_name() const { return inferred_name_; }
- void set_inferred_name(Handle<String> inferred_name) {
- inferred_name_ = inferred_name;
- }
-
- bool pretenure() { return Pretenure::decode(bitfield_); }
- void set_pretenure() { bitfield_ |= Pretenure::encode(true); }
-
- bool has_duplicate_parameters() {
- return HasDuplicateParameters::decode(bitfield_);
- }
-
- bool is_function() { return IsFunction::decode(bitfield_) == kIsFunction; }
-
- // This is used as a heuristic on when to eagerly compile a function
- // literal. We consider the following constructs as hints that the
- // function will be called immediately:
- // - (function() { ... })();
- // - var x = function() { ... }();
- bool is_parenthesized() {
- return IsParenthesized::decode(bitfield_) == kIsParenthesized;
- }
- void set_parenthesized() {
- bitfield_ = IsParenthesized::update(bitfield_, kIsParenthesized);
- }
-
- int ast_node_count() { return ast_properties_.node_count(); }
- AstProperties::Flags* flags() { return ast_properties_.flags(); }
- void set_ast_properties(AstProperties* ast_properties) {
- ast_properties_ = *ast_properties;
- }
-
- protected:
- FunctionLiteral(Isolate* isolate,
- Handle<String> name,
- Scope* scope,
- ZoneList<Statement*>* body,
- int materialized_literal_count,
- int expected_property_count,
- int handler_count,
- bool has_only_simple_this_property_assignments,
- Handle<FixedArray> this_property_assignments,
- int parameter_count,
- Type type,
- ParameterFlag has_duplicate_parameters,
- IsFunctionFlag is_function,
- IsParenthesizedFlag is_parenthesized)
- : Expression(isolate),
- name_(name),
- scope_(scope),
- body_(body),
- this_property_assignments_(this_property_assignments),
- inferred_name_(isolate->factory()->empty_string()),
- materialized_literal_count_(materialized_literal_count),
- expected_property_count_(expected_property_count),
- handler_count_(handler_count),
- parameter_count_(parameter_count),
- function_token_position_(RelocInfo::kNoPosition) {
- bitfield_ =
- HasOnlySimpleThisPropertyAssignments::encode(
- has_only_simple_this_property_assignments) |
- IsExpression::encode(type != DECLARATION) |
- IsAnonymous::encode(type == ANONYMOUS_EXPRESSION) |
- Pretenure::encode(false) |
- HasDuplicateParameters::encode(has_duplicate_parameters) |
- IsFunction::encode(is_function) |
- IsParenthesized::encode(is_parenthesized);
- }
-
- private:
- Handle<String> name_;
- Scope* scope_;
- ZoneList<Statement*>* body_;
- Handle<FixedArray> this_property_assignments_;
- Handle<String> inferred_name_;
- AstProperties ast_properties_;
-
- int materialized_literal_count_;
- int expected_property_count_;
- int handler_count_;
- int parameter_count_;
- int function_token_position_;
-
- unsigned bitfield_;
- class HasOnlySimpleThisPropertyAssignments: public BitField<bool, 0, 1> {};
- class IsExpression: public BitField<bool, 1, 1> {};
- class IsAnonymous: public BitField<bool, 2, 1> {};
- class Pretenure: public BitField<bool, 3, 1> {};
- class HasDuplicateParameters: public BitField<ParameterFlag, 4, 1> {};
- class IsFunction: public BitField<IsFunctionFlag, 5, 1> {};
- class IsParenthesized: public BitField<IsParenthesizedFlag, 6, 1> {};
-};
-
-
-class SharedFunctionInfoLiteral: public Expression {
- public:
- DECLARE_NODE_TYPE(SharedFunctionInfoLiteral)
-
- Handle<SharedFunctionInfo> shared_function_info() const {
- return shared_function_info_;
- }
-
- protected:
- SharedFunctionInfoLiteral(
- Isolate* isolate,
- Handle<SharedFunctionInfo> shared_function_info)
- : Expression(isolate),
- shared_function_info_(shared_function_info) { }
-
- private:
- Handle<SharedFunctionInfo> shared_function_info_;
-};
-
-
-class ThisFunction: public Expression {
- public:
- DECLARE_NODE_TYPE(ThisFunction)
-
- protected:
- explicit ThisFunction(Isolate* isolate): Expression(isolate) {}
-};
-
-#undef DECLARE_NODE_TYPE
-
-
-// ----------------------------------------------------------------------------
-// Regular expressions
-
-
-class RegExpVisitor BASE_EMBEDDED {
- public:
- virtual ~RegExpVisitor() { }
-#define MAKE_CASE(Name) \
- virtual void* Visit##Name(RegExp##Name*, void* data) = 0;
- FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
-#undef MAKE_CASE
-};
-
-
-class RegExpTree: public ZoneObject {
- public:
- static const int kInfinity = kMaxInt;
- virtual ~RegExpTree() { }
- virtual void* Accept(RegExpVisitor* visitor, void* data) = 0;
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success) = 0;
- virtual bool IsTextElement() { return false; }
- virtual bool IsAnchoredAtStart() { return false; }
- virtual bool IsAnchoredAtEnd() { return false; }
- virtual int min_match() = 0;
- virtual int max_match() = 0;
- // Returns the interval of registers used for captures within this
- // expression.
- virtual Interval CaptureRegisters() { return Interval::Empty(); }
- virtual void AppendToText(RegExpText* text, Zone* zone);
- SmartArrayPointer<const char> ToString(Zone* zone);
-#define MAKE_ASTYPE(Name) \
- virtual RegExp##Name* As##Name(); \
- virtual bool Is##Name();
- FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE)
-#undef MAKE_ASTYPE
-};
-
-
-class RegExpDisjunction: public RegExpTree {
- public:
- explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives);
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpDisjunction* AsDisjunction();
- virtual Interval CaptureRegisters();
- virtual bool IsDisjunction();
- virtual bool IsAnchoredAtStart();
- virtual bool IsAnchoredAtEnd();
- virtual int min_match() { return min_match_; }
- virtual int max_match() { return max_match_; }
- ZoneList<RegExpTree*>* alternatives() { return alternatives_; }
- private:
- ZoneList<RegExpTree*>* alternatives_;
- int min_match_;
- int max_match_;
-};
-
-
-class RegExpAlternative: public RegExpTree {
- public:
- explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes);
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpAlternative* AsAlternative();
- virtual Interval CaptureRegisters();
- virtual bool IsAlternative();
- virtual bool IsAnchoredAtStart();
- virtual bool IsAnchoredAtEnd();
- virtual int min_match() { return min_match_; }
- virtual int max_match() { return max_match_; }
- ZoneList<RegExpTree*>* nodes() { return nodes_; }
- private:
- ZoneList<RegExpTree*>* nodes_;
- int min_match_;
- int max_match_;
-};
-
-
-class RegExpAssertion: public RegExpTree {
- public:
- enum Type {
- START_OF_LINE,
- START_OF_INPUT,
- END_OF_LINE,
- END_OF_INPUT,
- BOUNDARY,
- NON_BOUNDARY
- };
- explicit RegExpAssertion(Type type) : type_(type) { }
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpAssertion* AsAssertion();
- virtual bool IsAssertion();
- virtual bool IsAnchoredAtStart();
- virtual bool IsAnchoredAtEnd();
- virtual int min_match() { return 0; }
- virtual int max_match() { return 0; }
- Type type() { return type_; }
- private:
- Type type_;
-};
-
-
-class CharacterSet BASE_EMBEDDED {
- public:
- explicit CharacterSet(uc16 standard_set_type)
- : ranges_(NULL),
- standard_set_type_(standard_set_type) {}
- explicit CharacterSet(ZoneList<CharacterRange>* ranges)
- : ranges_(ranges),
- standard_set_type_(0) {}
- ZoneList<CharacterRange>* ranges(Zone* zone);
- uc16 standard_set_type() { return standard_set_type_; }
- void set_standard_set_type(uc16 special_set_type) {
- standard_set_type_ = special_set_type;
- }
- bool is_standard() { return standard_set_type_ != 0; }
- void Canonicalize();
- private:
- ZoneList<CharacterRange>* ranges_;
- // If non-zero, the value represents a standard set (e.g., all whitespace
- // characters) without having to expand the ranges.
- uc16 standard_set_type_;
-};
-
-
-class RegExpCharacterClass: public RegExpTree {
- public:
- RegExpCharacterClass(ZoneList<CharacterRange>* ranges, bool is_negated)
- : set_(ranges),
- is_negated_(is_negated) { }
- explicit RegExpCharacterClass(uc16 type)
- : set_(type),
- is_negated_(false) { }
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpCharacterClass* AsCharacterClass();
- virtual bool IsCharacterClass();
- virtual bool IsTextElement() { return true; }
- virtual int min_match() { return 1; }
- virtual int max_match() { return 1; }
- virtual void AppendToText(RegExpText* text, Zone* zone);
- CharacterSet character_set() { return set_; }
- // TODO(lrn): Remove need for complex version if is_standard that
- // recognizes a mangled standard set and just do { return set_.is_special(); }
- bool is_standard(Zone* zone);
- // Returns a value representing the standard character set if is_standard()
- // returns true.
- // Currently used values are:
- // s : unicode whitespace
- // S : unicode non-whitespace
- // w : ASCII word character (digit, letter, underscore)
- // W : non-ASCII word character
- // d : ASCII digit
- // D : non-ASCII digit
- // . : non-unicode non-newline
- // * : All characters
- uc16 standard_type() { return set_.standard_set_type(); }
- ZoneList<CharacterRange>* ranges(Zone* zone) { return set_.ranges(zone); }
- bool is_negated() { return is_negated_; }
-
- private:
- CharacterSet set_;
- bool is_negated_;
-};
-
-
-class RegExpAtom: public RegExpTree {
- public:
- explicit RegExpAtom(Vector<const uc16> data) : data_(data) { }
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpAtom* AsAtom();
- virtual bool IsAtom();
- virtual bool IsTextElement() { return true; }
- virtual int min_match() { return data_.length(); }
- virtual int max_match() { return data_.length(); }
- virtual void AppendToText(RegExpText* text, Zone* zone);
- Vector<const uc16> data() { return data_; }
- int length() { return data_.length(); }
- private:
- Vector<const uc16> data_;
-};
-
-
-class RegExpText: public RegExpTree {
- public:
- explicit RegExpText(Zone* zone) : elements_(2, zone), length_(0) {}
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpText* AsText();
- virtual bool IsText();
- virtual bool IsTextElement() { return true; }
- virtual int min_match() { return length_; }
- virtual int max_match() { return length_; }
- virtual void AppendToText(RegExpText* text, Zone* zone);
- void AddElement(TextElement elm, Zone* zone) {
- elements_.Add(elm, zone);
- length_ += elm.length();
- }
- ZoneList<TextElement>* elements() { return &elements_; }
- private:
- ZoneList<TextElement> elements_;
- int length_;
-};
-
-
-class RegExpQuantifier: public RegExpTree {
- public:
- enum Type { GREEDY, NON_GREEDY, POSSESSIVE };
- RegExpQuantifier(int min, int max, Type type, RegExpTree* body)
- : body_(body),
- min_(min),
- max_(max),
- min_match_(min * body->min_match()),
- type_(type) {
- if (max > 0 && body->max_match() > kInfinity / max) {
- max_match_ = kInfinity;
- } else {
- max_match_ = max * body->max_match();
- }
- }
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- static RegExpNode* ToNode(int min,
- int max,
- bool is_greedy,
- RegExpTree* body,
- RegExpCompiler* compiler,
- RegExpNode* on_success,
- bool not_at_start = false);
- virtual RegExpQuantifier* AsQuantifier();
- virtual Interval CaptureRegisters();
- virtual bool IsQuantifier();
- virtual int min_match() { return min_match_; }
- virtual int max_match() { return max_match_; }
- int min() { return min_; }
- int max() { return max_; }
- bool is_possessive() { return type_ == POSSESSIVE; }
- bool is_non_greedy() { return type_ == NON_GREEDY; }
- bool is_greedy() { return type_ == GREEDY; }
- RegExpTree* body() { return body_; }
-
- private:
- RegExpTree* body_;
- int min_;
- int max_;
- int min_match_;
- int max_match_;
- Type type_;
-};
-
-
-class RegExpCapture: public RegExpTree {
- public:
- explicit RegExpCapture(RegExpTree* body, int index)
- : body_(body), index_(index) { }
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- static RegExpNode* ToNode(RegExpTree* body,
- int index,
- RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpCapture* AsCapture();
- virtual bool IsAnchoredAtStart();
- virtual bool IsAnchoredAtEnd();
- virtual Interval CaptureRegisters();
- virtual bool IsCapture();
- virtual int min_match() { return body_->min_match(); }
- virtual int max_match() { return body_->max_match(); }
- RegExpTree* body() { return body_; }
- int index() { return index_; }
- static int StartRegister(int index) { return index * 2; }
- static int EndRegister(int index) { return index * 2 + 1; }
-
- private:
- RegExpTree* body_;
- int index_;
-};
-
-
-class RegExpLookahead: public RegExpTree {
- public:
- RegExpLookahead(RegExpTree* body,
- bool is_positive,
- int capture_count,
- int capture_from)
- : body_(body),
- is_positive_(is_positive),
- capture_count_(capture_count),
- capture_from_(capture_from) { }
-
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpLookahead* AsLookahead();
- virtual Interval CaptureRegisters();
- virtual bool IsLookahead();
- virtual bool IsAnchoredAtStart();
- virtual int min_match() { return 0; }
- virtual int max_match() { return 0; }
- RegExpTree* body() { return body_; }
- bool is_positive() { return is_positive_; }
- int capture_count() { return capture_count_; }
- int capture_from() { return capture_from_; }
-
- private:
- RegExpTree* body_;
- bool is_positive_;
- int capture_count_;
- int capture_from_;
-};
-
-
-class RegExpBackReference: public RegExpTree {
- public:
- explicit RegExpBackReference(RegExpCapture* capture)
- : capture_(capture) { }
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpBackReference* AsBackReference();
- virtual bool IsBackReference();
- virtual int min_match() { return 0; }
- virtual int max_match() { return capture_->max_match(); }
- int index() { return capture_->index(); }
- RegExpCapture* capture() { return capture_; }
- private:
- RegExpCapture* capture_;
-};
-
-
-class RegExpEmpty: public RegExpTree {
- public:
- RegExpEmpty() { }
- virtual void* Accept(RegExpVisitor* visitor, void* data);
- virtual RegExpNode* ToNode(RegExpCompiler* compiler,
- RegExpNode* on_success);
- virtual RegExpEmpty* AsEmpty();
- virtual bool IsEmpty();
- virtual int min_match() { return 0; }
- virtual int max_match() { return 0; }
- static RegExpEmpty* GetInstance() {
- static RegExpEmpty* instance = ::new RegExpEmpty();
- return instance;
- }
-};
-
-
-// ----------------------------------------------------------------------------
-// Out-of-line inline constructors (to side-step cyclic dependencies).
-
-inline ModuleVariable::ModuleVariable(VariableProxy* proxy)
- : Module(proxy->interface()),
- proxy_(proxy) {
-}
-
-
-// ----------------------------------------------------------------------------
-// Basic visitor
-// - leaf node visitors are abstract.
-
-class AstVisitor BASE_EMBEDDED {
- public:
- AstVisitor() {}
- virtual ~AstVisitor() { }
-
- // Stack overflow check and dynamic dispatch.
- virtual void Visit(AstNode* node) = 0;
-
- // Iteration left-to-right.
- virtual void VisitDeclarations(ZoneList<Declaration*>* declarations);
- virtual void VisitStatements(ZoneList<Statement*>* statements);
- virtual void VisitExpressions(ZoneList<Expression*>* expressions);
-
- // Individual AST nodes.
-#define DEF_VISIT(type) \
- virtual void Visit##type(type* node) = 0;
- AST_NODE_LIST(DEF_VISIT)
-#undef DEF_VISIT
-};
-
-
-#define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS() \
-public: \
- virtual void Visit(AstNode* node) { \
- if (!CheckStackOverflow()) node->Accept(this); \
- } \
- \
- void SetStackOverflow() { stack_overflow_ = true; } \
- void ClearStackOverflow() { stack_overflow_ = false; } \
- bool HasStackOverflow() const { return stack_overflow_; } \
- \
- bool CheckStackOverflow() { \
- if (stack_overflow_) return true; \
- StackLimitCheck check(isolate_); \
- if (!check.HasOverflowed()) return false; \
- return (stack_overflow_ = true); \
- } \
- \
-private: \
- void InitializeAstVisitor() { \
- isolate_ = Isolate::Current(); \
- stack_overflow_ = false; \
- } \
- Isolate* isolate() { return isolate_; } \
- \
- Isolate* isolate_; \
- bool stack_overflow_
-
-
-// ----------------------------------------------------------------------------
-// Construction time visitor.
-
-class AstConstructionVisitor BASE_EMBEDDED {
- public:
- AstConstructionVisitor() { }
-
- AstProperties* ast_properties() { return &properties_; }
-
- private:
- template<class> friend class AstNodeFactory;
-
- // Node visitors.
-#define DEF_VISIT(type) \
- void Visit##type(type* node);
- AST_NODE_LIST(DEF_VISIT)
-#undef DEF_VISIT
-
- void increase_node_count() { properties_.add_node_count(1); }
- void add_flag(AstPropertiesFlag flag) { properties_.flags()->Add(flag); }
-
- AstProperties properties_;
-};
-
-
-class AstNullVisitor BASE_EMBEDDED {
- public:
- // Node visitors.
-#define DEF_VISIT(type) \
- void Visit##type(type* node) {}
- AST_NODE_LIST(DEF_VISIT)
-#undef DEF_VISIT
-};
-
-
-
-// ----------------------------------------------------------------------------
-// AstNode factory
-
-template<class Visitor>
-class AstNodeFactory BASE_EMBEDDED {
- public:
- AstNodeFactory(Isolate* isolate, Zone* zone)
- : isolate_(isolate),
- zone_(zone) { }
-
- Visitor* visitor() { return &visitor_; }
-
-#define VISIT_AND_RETURN(NodeType, node) \
- visitor_.Visit##NodeType((node)); \
- return node;
-
- VariableDeclaration* NewVariableDeclaration(VariableProxy* proxy,
- VariableMode mode,
- Scope* scope) {
- VariableDeclaration* decl =
- new(zone_) VariableDeclaration(proxy, mode, scope);
- VISIT_AND_RETURN(VariableDeclaration, decl)
- }
-
- FunctionDeclaration* NewFunctionDeclaration(VariableProxy* proxy,
- VariableMode mode,
- FunctionLiteral* fun,
- Scope* scope) {
- FunctionDeclaration* decl =
- new(zone_) FunctionDeclaration(proxy, mode, fun, scope);
- VISIT_AND_RETURN(FunctionDeclaration, decl)
- }
-
- ModuleDeclaration* NewModuleDeclaration(VariableProxy* proxy,
- Module* module,
- Scope* scope) {
- ModuleDeclaration* decl =
- new(zone_) ModuleDeclaration(proxy, module, scope);
- VISIT_AND_RETURN(ModuleDeclaration, decl)
- }
-
- ImportDeclaration* NewImportDeclaration(VariableProxy* proxy,
- Module* module,
- Scope* scope) {
- ImportDeclaration* decl =
- new(zone_) ImportDeclaration(proxy, module, scope);
- VISIT_AND_RETURN(ImportDeclaration, decl)
- }
-
- ExportDeclaration* NewExportDeclaration(VariableProxy* proxy,
- Scope* scope) {
- ExportDeclaration* decl =
- new(zone_) ExportDeclaration(proxy, scope);
- VISIT_AND_RETURN(ExportDeclaration, decl)
- }
-
- ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface) {
- ModuleLiteral* module = new(zone_) ModuleLiteral(body, interface);
- VISIT_AND_RETURN(ModuleLiteral, module)
- }
-
- ModuleVariable* NewModuleVariable(VariableProxy* proxy) {
- ModuleVariable* module = new(zone_) ModuleVariable(proxy);
- VISIT_AND_RETURN(ModuleVariable, module)
- }
-
- ModulePath* NewModulePath(Module* origin, Handle<String> name) {
- ModulePath* module = new(zone_) ModulePath(origin, name, zone_);
- VISIT_AND_RETURN(ModulePath, module)
- }
-
- ModuleUrl* NewModuleUrl(Handle<String> url) {
- ModuleUrl* module = new(zone_) ModuleUrl(url, zone_);
- VISIT_AND_RETURN(ModuleUrl, module)
- }
-
- Block* NewBlock(ZoneStringList* labels,
- int capacity,
- bool is_initializer_block) {
- Block* block = new(zone_) Block(
- isolate_, labels, capacity, is_initializer_block, zone_);
- VISIT_AND_RETURN(Block, block)
- }
-
-#define STATEMENT_WITH_LABELS(NodeType) \
- NodeType* New##NodeType(ZoneStringList* labels) { \
- NodeType* stmt = new(zone_) NodeType(isolate_, labels); \
- VISIT_AND_RETURN(NodeType, stmt); \
- }
- STATEMENT_WITH_LABELS(DoWhileStatement)
- STATEMENT_WITH_LABELS(WhileStatement)
- STATEMENT_WITH_LABELS(ForStatement)
- STATEMENT_WITH_LABELS(ForInStatement)
- STATEMENT_WITH_LABELS(SwitchStatement)
-#undef STATEMENT_WITH_LABELS
-
- ModuleStatement* NewModuleStatement(VariableProxy* proxy, Block* body) {
- ModuleStatement* stmt = new(zone_) ModuleStatement(proxy, body);
- VISIT_AND_RETURN(ModuleStatement, stmt)
- }
-
- ExpressionStatement* NewExpressionStatement(Expression* expression) {
- ExpressionStatement* stmt = new(zone_) ExpressionStatement(expression);
- VISIT_AND_RETURN(ExpressionStatement, stmt)
- }
-
- ContinueStatement* NewContinueStatement(IterationStatement* target) {
- ContinueStatement* stmt = new(zone_) ContinueStatement(target);
- VISIT_AND_RETURN(ContinueStatement, stmt)
- }
-
- BreakStatement* NewBreakStatement(BreakableStatement* target) {
- BreakStatement* stmt = new(zone_) BreakStatement(target);
- VISIT_AND_RETURN(BreakStatement, stmt)
- }
-
- ReturnStatement* NewReturnStatement(Expression* expression) {
- ReturnStatement* stmt = new(zone_) ReturnStatement(expression);
- VISIT_AND_RETURN(ReturnStatement, stmt)
- }
-
- WithStatement* NewWithStatement(Expression* expression,
- Statement* statement) {
- WithStatement* stmt = new(zone_) WithStatement(expression, statement);
- VISIT_AND_RETURN(WithStatement, stmt)
- }
-
- IfStatement* NewIfStatement(Expression* condition,
- Statement* then_statement,
- Statement* else_statement) {
- IfStatement* stmt = new(zone_) IfStatement(
- isolate_, condition, then_statement, else_statement);
- VISIT_AND_RETURN(IfStatement, stmt)
- }
-
- TryCatchStatement* NewTryCatchStatement(int index,
- Block* try_block,
- Scope* scope,
- Variable* variable,
- Block* catch_block) {
- TryCatchStatement* stmt = new(zone_) TryCatchStatement(
- index, try_block, scope, variable, catch_block);
- VISIT_AND_RETURN(TryCatchStatement, stmt)
- }
-
- TryFinallyStatement* NewTryFinallyStatement(int index,
- Block* try_block,
- Block* finally_block) {
- TryFinallyStatement* stmt =
- new(zone_) TryFinallyStatement(index, try_block, finally_block);
- VISIT_AND_RETURN(TryFinallyStatement, stmt)
- }
-
- DebuggerStatement* NewDebuggerStatement() {
- DebuggerStatement* stmt = new(zone_) DebuggerStatement();
- VISIT_AND_RETURN(DebuggerStatement, stmt)
- }
-
- EmptyStatement* NewEmptyStatement() {
- return new(zone_) EmptyStatement();
- }
-
- Literal* NewLiteral(Handle<Object> handle) {
- Literal* lit = new(zone_) Literal(isolate_, handle);
- VISIT_AND_RETURN(Literal, lit)
- }
-
- Literal* NewNumberLiteral(double number) {
- return NewLiteral(isolate_->factory()->NewNumber(number, TENURED));
- }
-
- ObjectLiteral* NewObjectLiteral(
- Handle<FixedArray> constant_properties,
- ZoneList<ObjectLiteral::Property*>* properties,
- int literal_index,
- bool is_simple,
- bool fast_elements,
- int depth,
- bool has_function) {
- ObjectLiteral* lit = new(zone_) ObjectLiteral(
- isolate_, constant_properties, properties, literal_index,
- is_simple, fast_elements, depth, has_function);
- VISIT_AND_RETURN(ObjectLiteral, lit)
- }
-
- ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter,
- FunctionLiteral* value) {
- ObjectLiteral::Property* prop =
- new(zone_) ObjectLiteral::Property(is_getter, value);
- prop->set_key(NewLiteral(value->name()));
- return prop; // Not an AST node, will not be visited.
- }
-
- RegExpLiteral* NewRegExpLiteral(Handle<String> pattern,
- Handle<String> flags,
- int literal_index) {
- RegExpLiteral* lit =
- new(zone_) RegExpLiteral(isolate_, pattern, flags, literal_index);
- VISIT_AND_RETURN(RegExpLiteral, lit);
- }
-
- ArrayLiteral* NewArrayLiteral(Handle<FixedArray> constant_elements,
- ZoneList<Expression*>* values,
- int literal_index,
- bool is_simple,
- int depth) {
- ArrayLiteral* lit = new(zone_) ArrayLiteral(
- isolate_, constant_elements, values, literal_index, is_simple, depth);
- VISIT_AND_RETURN(ArrayLiteral, lit)
- }
-
- VariableProxy* NewVariableProxy(Variable* var) {
- VariableProxy* proxy = new(zone_) VariableProxy(isolate_, var);
- VISIT_AND_RETURN(VariableProxy, proxy)
- }
-
- VariableProxy* NewVariableProxy(Handle<String> name,
- bool is_this,
- Interface* interface = Interface::NewValue(),
- int position = RelocInfo::kNoPosition) {
- VariableProxy* proxy =
- new(zone_) VariableProxy(isolate_, name, is_this, interface, position);
- VISIT_AND_RETURN(VariableProxy, proxy)
- }
-
- Property* NewProperty(Expression* obj, Expression* key, int pos) {
- Property* prop = new(zone_) Property(isolate_, obj, key, pos);
- VISIT_AND_RETURN(Property, prop)
- }
-
- Call* NewCall(Expression* expression,
- ZoneList<Expression*>* arguments,
- int pos) {
- Call* call = new(zone_) Call(isolate_, expression, arguments, pos);
- VISIT_AND_RETURN(Call, call)
- }
-
- CallNew* NewCallNew(Expression* expression,
- ZoneList<Expression*>* arguments,
- int pos) {
- CallNew* call = new(zone_) CallNew(isolate_, expression, arguments, pos);
- VISIT_AND_RETURN(CallNew, call)
- }
-
- CallRuntime* NewCallRuntime(Handle<String> name,
- const Runtime::Function* function,
- ZoneList<Expression*>* arguments) {
- CallRuntime* call =
- new(zone_) CallRuntime(isolate_, name, function, arguments);
- VISIT_AND_RETURN(CallRuntime, call)
- }
-
- UnaryOperation* NewUnaryOperation(Token::Value op,
- Expression* expression,
- int pos) {
- UnaryOperation* node =
- new(zone_) UnaryOperation(isolate_, op, expression, pos);
- VISIT_AND_RETURN(UnaryOperation, node)
- }
-
- BinaryOperation* NewBinaryOperation(Token::Value op,
- Expression* left,
- Expression* right,
- int pos) {
- BinaryOperation* node =
- new(zone_) BinaryOperation(isolate_, op, left, right, pos);
- VISIT_AND_RETURN(BinaryOperation, node)
- }
-
- CountOperation* NewCountOperation(Token::Value op,
- bool is_prefix,
- Expression* expr,
- int pos) {
- CountOperation* node =
- new(zone_) CountOperation(isolate_, op, is_prefix, expr, pos);
- VISIT_AND_RETURN(CountOperation, node)
- }
-
- CompareOperation* NewCompareOperation(Token::Value op,
- Expression* left,
- Expression* right,
- int pos) {
- CompareOperation* node =
- new(zone_) CompareOperation(isolate_, op, left, right, pos);
- VISIT_AND_RETURN(CompareOperation, node)
- }
-
- Conditional* NewConditional(Expression* condition,
- Expression* then_expression,
- Expression* else_expression,
- int then_expression_position,
- int else_expression_position) {
- Conditional* cond = new(zone_) Conditional(
- isolate_, condition, then_expression, else_expression,
- then_expression_position, else_expression_position);
- VISIT_AND_RETURN(Conditional, cond)
- }
-
- Assignment* NewAssignment(Token::Value op,
- Expression* target,
- Expression* value,
- int pos) {
- Assignment* assign =
- new(zone_) Assignment(isolate_, op, target, value, pos);
- assign->Init(isolate_, this);
- VISIT_AND_RETURN(Assignment, assign)
- }
-
- Throw* NewThrow(Expression* exception, int pos) {
- Throw* t = new(zone_) Throw(isolate_, exception, pos);
- VISIT_AND_RETURN(Throw, t)
- }
-
- FunctionLiteral* NewFunctionLiteral(
- Handle<String> name,
- Scope* scope,
- ZoneList<Statement*>* body,
- int materialized_literal_count,
- int expected_property_count,
- int handler_count,
- bool has_only_simple_this_property_assignments,
- Handle<FixedArray> this_property_assignments,
- int parameter_count,
- FunctionLiteral::ParameterFlag has_duplicate_parameters,
- FunctionLiteral::Type type,
- FunctionLiteral::IsFunctionFlag is_function,
- FunctionLiteral::IsParenthesizedFlag is_parenthesized) {
- FunctionLiteral* lit = new(zone_) FunctionLiteral(
- isolate_, name, scope, body,
- materialized_literal_count, expected_property_count, handler_count,
- has_only_simple_this_property_assignments, this_property_assignments,
- parameter_count, type, has_duplicate_parameters, is_function,
- is_parenthesized);
- // Top-level literal doesn't count for the AST's properties.
- if (is_function == FunctionLiteral::kIsFunction) {
- visitor_.VisitFunctionLiteral(lit);
- }
- return lit;
- }
-
- SharedFunctionInfoLiteral* NewSharedFunctionInfoLiteral(
- Handle<SharedFunctionInfo> shared_function_info) {
- SharedFunctionInfoLiteral* lit =
- new(zone_) SharedFunctionInfoLiteral(isolate_, shared_function_info);
- VISIT_AND_RETURN(SharedFunctionInfoLiteral, lit)
- }
-
- ThisFunction* NewThisFunction() {
- ThisFunction* fun = new(zone_) ThisFunction(isolate_);
- VISIT_AND_RETURN(ThisFunction, fun)
- }
-
-#undef VISIT_AND_RETURN
-
- private:
- Isolate* isolate_;
- Zone* zone_;
- Visitor visitor_;
-};
-
-
-} } // namespace v8::internal
-
-#endif // V8_AST_H_