📄 ast.h.svn-base
字号:
// Generate code to store into an expression evaluated as the left-hand // side of an assignment. The code will expect the stored value on top of // the expression stack, and a reference containing the expression // immediately below that. virtual void GenerateStoreCode(MacroAssembler* masm, Scope* scope, Reference* ref, InitState init_state); private: Variable* var_; Type type_; int index_;};class Property: public Expression { public: Property(Expression* obj, Expression* key, int pos) : obj_(obj), key_(key), pos_(pos) { } virtual void Accept(Visitor* v); // Type testing & conversion virtual Property* AsProperty() { return this; } virtual bool IsValidLeftHandSide() { return true; } Expression* obj() const { return obj_; } Expression* key() const { return key_; } int position() const { return pos_; } // Returns a property singleton property access on 'this'. Used // during preparsing. static Property* this_property() { return &this_property_; } // Generate code to store into an expression evaluated as the left-hand // side of an assignment. The code will expect the stored value on top of // the expression stack, and a reference containing the expression // immediately below that. virtual void GenerateStoreCode(MacroAssembler* masm, Scope* scope, Reference* ref, InitState init_state); private: Expression* obj_; Expression* key_; int pos_; // Dummy property used during preparsing static Property this_property_;};class Call: public Expression { public: Call(Expression* expression, ZoneList<Expression*>* arguments, bool is_eval, int pos) : expression_(expression), arguments_(arguments), is_eval_(is_eval), pos_(pos) { } virtual void Accept(Visitor* v); // Type testing and conversion. virtual Call* AsCall() { return this; } Expression* expression() const { return expression_; } ZoneList<Expression*>* arguments() const { return arguments_; } bool is_eval() { return is_eval_; } int position() { return pos_; } static Call* sentinel() { return &sentinel_; } private: Expression* expression_; ZoneList<Expression*>* arguments_; bool is_eval_; int pos_; static Call sentinel_;};class CallNew: public Call { public: CallNew(Expression* expression, ZoneList<Expression*>* arguments, int pos) : Call(expression, arguments, false, pos) { } virtual void Accept(Visitor* v);};// 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: CallRuntime(Handle<String> name, Runtime::Function* function, ZoneList<Expression*>* arguments) : name_(name), function_(function), arguments_(arguments) { } virtual void Accept(Visitor* v); Handle<String> name() const { return name_; } Runtime::Function* function() const { return function_; } ZoneList<Expression*>* arguments() const { return arguments_; } private: Handle<String> name_; Runtime::Function* function_; ZoneList<Expression*>* arguments_;};class UnaryOperation: public Expression { public: UnaryOperation(Token::Value op, Expression* expression) : op_(op), expression_(expression) { ASSERT(Token::IsUnaryOp(op)); } virtual void Accept(Visitor* v); // Type testing & conversion virtual UnaryOperation* AsUnaryOperation() { return this; } Token::Value op() const { return op_; } Expression* expression() const { return expression_; } private: Token::Value op_; Expression* expression_;};class BinaryOperation: public Expression { public: BinaryOperation(Token::Value op, Expression* left, Expression* right) : op_(op), left_(left), right_(right) { ASSERT(Token::IsBinaryOp(op)); } virtual void Accept(Visitor* v); // Type testing & conversion virtual BinaryOperation* AsBinaryOperation() { return this; } // True iff the result can be safely overwritten (to avoid allocation). // False for operations that can return one of their operands. bool ResultOverwriteAllowed() { switch (op_) { case Token::COMMA: case Token::OR: case Token::AND: return false; case Token::BIT_OR: case Token::BIT_XOR: case Token::BIT_AND: case Token::SHL: case Token::SAR: case Token::SHR: case Token::ADD: case Token::SUB: case Token::MUL: case Token::DIV: case Token::MOD: return true; default: UNREACHABLE(); } return false; } Token::Value op() const { return op_; } Expression* left() const { return left_; } Expression* right() const { return right_; } private: Token::Value op_; Expression* left_; Expression* right_;};class CountOperation: public Expression { public: CountOperation(bool is_prefix, Token::Value op, Expression* expression) : is_prefix_(is_prefix), op_(op), expression_(expression) { ASSERT(Token::IsCountOp(op)); } virtual void Accept(Visitor* v); bool is_prefix() const { return is_prefix_; } bool is_postfix() const { return !is_prefix_; } Token::Value op() const { return op_; } Expression* expression() const { return expression_; } virtual void MarkAsStatement() { is_prefix_ = true; } private: bool is_prefix_; Token::Value op_; Expression* expression_;};class CompareOperation: public Expression { public: CompareOperation(Token::Value op, Expression* left, Expression* right) : op_(op), left_(left), right_(right) { ASSERT(Token::IsCompareOp(op)); } virtual void Accept(Visitor* v); Token::Value op() const { return op_; } Expression* left() const { return left_; } Expression* right() const { return right_; } private: Token::Value op_; Expression* left_; Expression* right_;};class Conditional: public Expression { public: Conditional(Expression* condition, Expression* then_expression, Expression* else_expression) : condition_(condition), then_expression_(then_expression), else_expression_(else_expression) { } virtual void Accept(Visitor* v); Expression* condition() const { return condition_; } Expression* then_expression() const { return then_expression_; } Expression* else_expression() const { return else_expression_; } private: Expression* condition_; Expression* then_expression_; Expression* else_expression_;};class Assignment: public Expression { public: Assignment(Token::Value op, Expression* target, Expression* value, int pos) : op_(op), target_(target), value_(value), pos_(pos) { ASSERT(Token::IsAssignmentOp(op)); } virtual void Accept(Visitor* v); virtual Assignment* AsAssignment() { return this; } Token::Value binary_op() const; Token::Value op() const { return op_; } Expression* target() const { return target_; } Expression* value() const { return value_; } int position() { return pos_; } private: Token::Value op_; Expression* target_; Expression* value_; int pos_;};class Throw: public Expression { public: Throw(Expression* exception, int pos) : exception_(exception), pos_(pos) {} virtual void Accept(Visitor* v); Expression* exception() const { return exception_; } int position() const { return pos_; } private: Expression* exception_; int pos_;};class FunctionLiteral: public Expression { public: FunctionLiteral(Handle<String> name, Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count, bool contains_array_literal, int expected_property_count, int num_parameters, int start_position, int end_position, bool is_expression) : name_(name), scope_(scope), body_(body), materialized_literal_count_(materialized_literal_count), contains_array_literal_(contains_array_literal), expected_property_count_(expected_property_count), num_parameters_(num_parameters), start_position_(start_position), end_position_(end_position), is_expression_(is_expression), function_token_position_(RelocInfo::kNoPosition) { } virtual void Accept(Visitor* v); // Type testing & conversion virtual FunctionLiteral* AsFunctionLiteral() { return this; } 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 { return start_position_; } int end_position() const { return end_position_; } bool is_expression() const { return is_expression_; } int materialized_literal_count() { return materialized_literal_count_; } bool contains_array_literal() { return contains_array_literal_; } int expected_property_count() { return expected_property_count_; } int num_parameters() { return num_parameters_; } bool AllowsLazyCompilation(); private: Handle<String> name_; Scope* scope_; ZoneList<Statement*>* body_; int materialized_literal_count_; bool contains_array_literal_; int expected_property_count_; int num_parameters_; int start_position_; int end_position_; bool is_expression_; int function_token_position_;};class FunctionBoilerplateLiteral: public Expression { public: explicit FunctionBoilerplateLiteral(Handle<JSFunction> boilerplate) : boilerplate_(boilerplate) { ASSERT(boilerplate->IsBoilerplate()); } Handle<JSFunction> boilerplate() const { return boilerplate_; } virtual void Accept(Visitor* v); private: Handle<JSFunction> boilerplate_;};class ThisFunction: public Expression { public: virtual void Accept(Visitor* v);};// ----------------------------------------------------------------------------// Basic visitor// - leaf node visitors are abstract.class Visitor BASE_EMBEDDED { public: Visitor() : stack_overflow_(false) { } virtual ~Visitor() { } // Dispatch void Visit(Node* node) { node->Accept(this); } // Iteration virtual void VisitStatements(ZoneList<Statement*>* statements); virtual void VisitExpressions(ZoneList<Expression*>* expressions); // Stack overflow tracking support. bool HasStackOverflow() const { return stack_overflow_; } bool CheckStackOverflow() { if (stack_overflow_) return true; StackLimitCheck check; if (!check.HasOverflowed()) return false; return (stack_overflow_ = true); } // If a stack-overflow exception is encountered when visiting a // node, calling SetStackOverflow will make sure that the visitor // bails out without visiting more nodes. void SetStackOverflow() { stack_overflow_ = true; } // Individual nodes#define DEF_VISIT(type) \ virtual void Visit##type(type* node) = 0; NODE_LIST(DEF_VISIT)#undef DEF_VISIT private: bool stack_overflow_;};} } // namespace v8::internal#endif // V8_AST_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -