OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 23 matching lines...) Expand all Loading... | |
34 #include "factory.h" | 34 #include "factory.h" |
35 #include "isolate.h" | 35 #include "isolate.h" |
36 #include "jsregexp.h" | 36 #include "jsregexp.h" |
37 #include "list-inl.h" | 37 #include "list-inl.h" |
38 #include "runtime.h" | 38 #include "runtime.h" |
39 #include "small-pointer-list.h" | 39 #include "small-pointer-list.h" |
40 #include "smart-array-pointer.h" | 40 #include "smart-array-pointer.h" |
41 #include "token.h" | 41 #include "token.h" |
42 #include "utils.h" | 42 #include "utils.h" |
43 #include "variables.h" | 43 #include "variables.h" |
44 #include "interface.h" | |
44 #include "zone-inl.h" | 45 #include "zone-inl.h" |
45 | 46 |
46 namespace v8 { | 47 namespace v8 { |
47 namespace internal { | 48 namespace internal { |
48 | 49 |
49 // The abstract syntax tree is an intermediate, light-weight | 50 // The abstract syntax tree is an intermediate, light-weight |
50 // representation of the parsed JavaScript code suitable for | 51 // representation of the parsed JavaScript code suitable for |
51 // compilation to native code. | 52 // compilation to native code. |
52 | 53 |
53 // Nodes are allocated in a separate zone, which allows faster | 54 // Nodes are allocated in a separate zone, which allows faster |
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
582 template<class> friend class AstNodeFactory; | 583 template<class> friend class AstNodeFactory; |
583 | 584 |
584 ExportDeclaration(VariableProxy* proxy, | 585 ExportDeclaration(VariableProxy* proxy, |
585 Scope* scope) | 586 Scope* scope) |
586 : Declaration(proxy, LET, scope) { | 587 : Declaration(proxy, LET, scope) { |
587 } | 588 } |
588 }; | 589 }; |
589 | 590 |
590 | 591 |
591 class Module: public AstNode { | 592 class Module: public AstNode { |
592 // TODO(rossberg): stuff to come... | 593 public: |
594 Interface* interface() const { return interface_; } | |
595 | |
593 protected: | 596 protected: |
594 Module() {} | 597 Module() : interface_(Interface::NewModule()) {} |
598 explicit Module(Interface* interface) : interface_(interface) {} | |
599 | |
600 private: | |
601 Interface* interface_; | |
595 }; | 602 }; |
596 | 603 |
597 | 604 |
598 class ModuleLiteral: public Module { | 605 class ModuleLiteral: public Module { |
599 public: | 606 public: |
600 DECLARE_NODE_TYPE(ModuleLiteral) | 607 DECLARE_NODE_TYPE(ModuleLiteral) |
601 | 608 |
602 Block* body() const { return body_; } | 609 Block* body() const { return body_; } |
603 | 610 |
604 protected: | 611 protected: |
605 template<class> friend class AstNodeFactory; | 612 template<class> friend class AstNodeFactory; |
606 | 613 |
607 explicit ModuleLiteral(Block* body) | 614 explicit ModuleLiteral(Block* body, Interface* interface) |
Sven Panne
2012/03/08 08:55:00
Remove "explicit".
rossberg
2012/03/08 10:47:06
Done.
| |
608 : body_(body) { | 615 : Module(interface), |
616 body_(body) { | |
609 } | 617 } |
610 | 618 |
611 private: | 619 private: |
612 Block* body_; | 620 Block* body_; |
613 }; | 621 }; |
614 | 622 |
615 | 623 |
616 class ModuleVariable: public Module { | 624 class ModuleVariable: public Module { |
617 public: | 625 public: |
618 DECLARE_NODE_TYPE(ModuleVariable) | 626 DECLARE_NODE_TYPE(ModuleVariable) |
619 | 627 |
620 VariableProxy* proxy() const { return proxy_; } | 628 VariableProxy* proxy() const { return proxy_; } |
621 | 629 |
622 protected: | 630 protected: |
623 template<class> friend class AstNodeFactory; | 631 template<class> friend class AstNodeFactory; |
624 | 632 |
625 explicit ModuleVariable(VariableProxy* proxy) | 633 inline explicit ModuleVariable(VariableProxy* proxy); |
626 : proxy_(proxy) { | |
627 } | |
628 | 634 |
629 private: | 635 private: |
630 VariableProxy* proxy_; | 636 VariableProxy* proxy_; |
631 }; | 637 }; |
632 | 638 |
633 | 639 |
634 class ModulePath: public Module { | 640 class ModulePath: public Module { |
635 public: | 641 public: |
636 DECLARE_NODE_TYPE(ModulePath) | 642 DECLARE_NODE_TYPE(ModulePath) |
637 | 643 |
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1444 bool IsArguments() { return var_ != NULL && var_->is_arguments(); } | 1450 bool IsArguments() { return var_ != NULL && var_->is_arguments(); } |
1445 | 1451 |
1446 bool IsLValue() { | 1452 bool IsLValue() { |
1447 return is_lvalue_; | 1453 return is_lvalue_; |
1448 } | 1454 } |
1449 | 1455 |
1450 Handle<String> name() const { return name_; } | 1456 Handle<String> name() const { return name_; } |
1451 Variable* var() const { return var_; } | 1457 Variable* var() const { return var_; } |
1452 bool is_this() const { return is_this_; } | 1458 bool is_this() const { return is_this_; } |
1453 int position() const { return position_; } | 1459 int position() const { return position_; } |
1460 Interface* interface() const { return interface_; } | |
1461 | |
1454 | 1462 |
1455 void MarkAsTrivial() { is_trivial_ = true; } | 1463 void MarkAsTrivial() { is_trivial_ = true; } |
1456 void MarkAsLValue() { is_lvalue_ = true; } | 1464 void MarkAsLValue() { is_lvalue_ = true; } |
1457 | 1465 |
1458 // Bind this proxy to the variable var. | 1466 // Bind this proxy to the variable var. |
1459 void BindTo(Variable* var); | 1467 void BindTo(Variable* var); |
1460 | 1468 |
1461 protected: | 1469 protected: |
1462 template<class> friend class AstNodeFactory; | 1470 template<class> friend class AstNodeFactory; |
1463 | 1471 |
1464 VariableProxy(Isolate* isolate, Variable* var); | 1472 VariableProxy(Isolate* isolate, Variable* var); |
1465 | 1473 |
1466 VariableProxy(Isolate* isolate, | 1474 VariableProxy(Isolate* isolate, |
1467 Handle<String> name, | 1475 Handle<String> name, |
1468 bool is_this, | 1476 bool is_this, |
1469 int position); | 1477 int position, |
1478 Interface* interface); | |
1470 | 1479 |
1471 Handle<String> name_; | 1480 Handle<String> name_; |
1472 Variable* var_; // resolved variable, or NULL | 1481 Variable* var_; // resolved variable, or NULL |
1473 bool is_this_; | 1482 bool is_this_; |
1474 bool is_trivial_; | 1483 bool is_trivial_; |
1475 // True if this variable proxy is being used in an assignment | 1484 // True if this variable proxy is being used in an assignment |
1476 // or with a increment/decrement operator. | 1485 // or with a increment/decrement operator. |
1477 bool is_lvalue_; | 1486 bool is_lvalue_; |
1478 int position_; | 1487 int position_; |
1488 Interface* interface_; | |
1479 }; | 1489 }; |
1480 | 1490 |
1481 | 1491 |
1482 class Property: public Expression { | 1492 class Property: public Expression { |
1483 public: | 1493 public: |
1484 DECLARE_NODE_TYPE(Property) | 1494 DECLARE_NODE_TYPE(Property) |
1485 | 1495 |
1486 virtual bool IsValidLeftHandSide() { return true; } | 1496 virtual bool IsValidLeftHandSide() { return true; } |
1487 | 1497 |
1488 Expression* obj() const { return obj_; } | 1498 Expression* obj() const { return obj_; } |
(...skipping 1010 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2499 virtual int min_match() { return 0; } | 2509 virtual int min_match() { return 0; } |
2500 virtual int max_match() { return 0; } | 2510 virtual int max_match() { return 0; } |
2501 static RegExpEmpty* GetInstance() { | 2511 static RegExpEmpty* GetInstance() { |
2502 static RegExpEmpty* instance = ::new RegExpEmpty(); | 2512 static RegExpEmpty* instance = ::new RegExpEmpty(); |
2503 return instance; | 2513 return instance; |
2504 } | 2514 } |
2505 }; | 2515 }; |
2506 | 2516 |
2507 | 2517 |
2508 // ---------------------------------------------------------------------------- | 2518 // ---------------------------------------------------------------------------- |
2519 // Out-of-line inline constructors. | |
Sven Panne
2012/03/08 08:55:00
I guess this here for cyclic dependencies reasons,
rossberg
2012/03/08 10:47:06
Done.
| |
2520 | |
2521 inline ModuleVariable::ModuleVariable(VariableProxy* proxy) | |
2522 : Module(proxy->interface()), | |
2523 proxy_(proxy) { | |
2524 } | |
2525 | |
2526 | |
2527 // ---------------------------------------------------------------------------- | |
2509 // Basic visitor | 2528 // Basic visitor |
2510 // - leaf node visitors are abstract. | 2529 // - leaf node visitors are abstract. |
2511 | 2530 |
2512 class AstVisitor BASE_EMBEDDED { | 2531 class AstVisitor BASE_EMBEDDED { |
2513 public: | 2532 public: |
2514 AstVisitor() : isolate_(Isolate::Current()), stack_overflow_(false) { } | 2533 AstVisitor() : isolate_(Isolate::Current()), stack_overflow_(false) { } |
2515 virtual ~AstVisitor() { } | 2534 virtual ~AstVisitor() { } |
2516 | 2535 |
2517 // Stack overflow check and dynamic dispatch. | 2536 // Stack overflow check and dynamic dispatch. |
2518 void Visit(AstNode* node) { if (!CheckStackOverflow()) node->Accept(this); } | 2537 void Visit(AstNode* node) { if (!CheckStackOverflow()) node->Accept(this); } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2632 VISIT_AND_RETURN(ImportDeclaration, decl) | 2651 VISIT_AND_RETURN(ImportDeclaration, decl) |
2633 } | 2652 } |
2634 | 2653 |
2635 ExportDeclaration* NewExportDeclaration(VariableProxy* proxy, | 2654 ExportDeclaration* NewExportDeclaration(VariableProxy* proxy, |
2636 Scope* scope) { | 2655 Scope* scope) { |
2637 ExportDeclaration* decl = | 2656 ExportDeclaration* decl = |
2638 new(zone_) ExportDeclaration(proxy, scope); | 2657 new(zone_) ExportDeclaration(proxy, scope); |
2639 VISIT_AND_RETURN(ExportDeclaration, decl) | 2658 VISIT_AND_RETURN(ExportDeclaration, decl) |
2640 } | 2659 } |
2641 | 2660 |
2642 ModuleLiteral* NewModuleLiteral(Block* body) { | 2661 ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface) { |
2643 ModuleLiteral* module = new(zone_) ModuleLiteral(body); | 2662 ModuleLiteral* module = new(zone_) ModuleLiteral(body, interface); |
2644 VISIT_AND_RETURN(ModuleLiteral, module) | 2663 VISIT_AND_RETURN(ModuleLiteral, module) |
2645 } | 2664 } |
2646 | 2665 |
2647 ModuleVariable* NewModuleVariable(VariableProxy* proxy) { | 2666 ModuleVariable* NewModuleVariable(VariableProxy* proxy) { |
2648 ModuleVariable* module = new(zone_) ModuleVariable(proxy); | 2667 ModuleVariable* module = new(zone_) ModuleVariable(proxy); |
2649 VISIT_AND_RETURN(ModuleVariable, module) | 2668 VISIT_AND_RETURN(ModuleVariable, module) |
2650 } | 2669 } |
2651 | 2670 |
2652 ModulePath* NewModulePath(Module* origin, Handle<String> name) { | 2671 ModulePath* NewModulePath(Module* origin, Handle<String> name) { |
2653 ModulePath* module = new(zone_) ModulePath(origin, name); | 2672 ModulePath* module = new(zone_) ModulePath(origin, name); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2789 VISIT_AND_RETURN(ArrayLiteral, lit) | 2808 VISIT_AND_RETURN(ArrayLiteral, lit) |
2790 } | 2809 } |
2791 | 2810 |
2792 VariableProxy* NewVariableProxy(Variable* var) { | 2811 VariableProxy* NewVariableProxy(Variable* var) { |
2793 VariableProxy* proxy = new(zone_) VariableProxy(isolate_, var); | 2812 VariableProxy* proxy = new(zone_) VariableProxy(isolate_, var); |
2794 VISIT_AND_RETURN(VariableProxy, proxy) | 2813 VISIT_AND_RETURN(VariableProxy, proxy) |
2795 } | 2814 } |
2796 | 2815 |
2797 VariableProxy* NewVariableProxy(Handle<String> name, | 2816 VariableProxy* NewVariableProxy(Handle<String> name, |
2798 bool is_this, | 2817 bool is_this, |
2799 int position = RelocInfo::kNoPosition) { | 2818 int position = RelocInfo::kNoPosition, |
2819 Interface* interface = | |
2820 Interface::NewValue()) { | |
2800 VariableProxy* proxy = | 2821 VariableProxy* proxy = |
2801 new(zone_) VariableProxy(isolate_, name, is_this, position); | 2822 new(zone_) VariableProxy(isolate_, name, is_this, position, interface); |
2802 VISIT_AND_RETURN(VariableProxy, proxy) | 2823 VISIT_AND_RETURN(VariableProxy, proxy) |
2803 } | 2824 } |
2804 | 2825 |
2805 Property* NewProperty(Expression* obj, Expression* key, int pos) { | 2826 Property* NewProperty(Expression* obj, Expression* key, int pos) { |
2806 Property* prop = new(zone_) Property(isolate_, obj, key, pos); | 2827 Property* prop = new(zone_) Property(isolate_, obj, key, pos); |
2807 VISIT_AND_RETURN(Property, prop) | 2828 VISIT_AND_RETURN(Property, prop) |
2808 } | 2829 } |
2809 | 2830 |
2810 Call* NewCall(Expression* expression, | 2831 Call* NewCall(Expression* expression, |
2811 ZoneList<Expression*>* arguments, | 2832 ZoneList<Expression*>* arguments, |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2932 private: | 2953 private: |
2933 Isolate* isolate_; | 2954 Isolate* isolate_; |
2934 Zone* zone_; | 2955 Zone* zone_; |
2935 Visitor visitor_; | 2956 Visitor visitor_; |
2936 }; | 2957 }; |
2937 | 2958 |
2938 | 2959 |
2939 } } // namespace v8::internal | 2960 } } // namespace v8::internal |
2940 | 2961 |
2941 #endif // V8_AST_H_ | 2962 #endif // V8_AST_H_ |
OLD | NEW |