⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ast.h.svn-base

📁 Google浏览器V8内核代码
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
  // 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 + -