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 20 matching lines...) Expand all Loading... | |
31 #include "func-name-inferrer.h" | 31 #include "func-name-inferrer.h" |
32 #include "hashmap.h" | 32 #include "hashmap.h" |
33 #include "scopes.h" | 33 #include "scopes.h" |
34 #include "token.h" | 34 #include "token.h" |
35 #include "scanner.h" | 35 #include "scanner.h" |
36 #include "v8.h" | 36 #include "v8.h" |
37 | 37 |
38 namespace v8 { | 38 namespace v8 { |
39 namespace internal { | 39 namespace internal { |
40 | 40 |
41 // Common base class shared between parser and pre-parser. | 41 // Common base class shared between parser and pre-parser. Traits encapsulate |
42 // the differences between Parser and PreParser: | |
43 | |
44 // - Return types: For example, Parser functions return Expression* and | |
45 // PreParser functions return PreParserExpression. | |
46 | |
47 // - Creating parse tree nodes: Parser generates an AST during the recursive | |
48 // descent. PreParser doesn't create a tree. Instead, it passes around minimal | |
49 // data objects (PreParserExpression, PreParserIdentifier etc.) which contain | |
50 // just enough data for the upper layer functions. PreParserFactory is | |
51 // responsible for creating these dummy objects. It provides a similar kind of | |
52 // interface as AstNodeFactory, so ParserBase doesn't need to care which one is | |
53 // used. | |
54 | |
55 // - Miscellanous other tasks interleaved with the recursive descent. For | |
56 // example, Parser keeps track of which function literals should be marked as | |
57 // pretenured, and PreParser doesn't care. | |
58 | |
59 // The traits are expected to contain the following typedefs: | |
rossberg
2014/03/12 17:29:11
Nit: For clarity, perhaps say "In particular, ..."
marja
2014/03/12 19:07:45
Done.
| |
60 // struct Traits { | |
61 // struct Type { | |
62 // // Used by FunctionState and BlockState. | |
63 // typedef Scope; | |
64 // typedef GeneratorVariable; | |
65 // typedef Zone; | |
66 // // Return types for traversing functions. | |
67 // typedef Identifier; | |
68 // typedef Expression; | |
69 // typedef FunctionLiteral; | |
70 // typedef ObjectLiteralProperty; | |
71 // typedef Literal; | |
72 // typedef ExpressionList; | |
73 // typedef PropertyList; | |
74 // // For constructing objects returned by the traversing functions. | |
75 // typedef Factory; | |
76 // }; | |
77 // }; | |
rossberg
2014/03/12 17:29:11
...and "// ..." here.
marja
2014/03/12 19:07:45
Done.
| |
78 | |
42 template <typename Traits> | 79 template <typename Traits> |
43 class ParserBase : public Traits { | 80 class ParserBase : public Traits { |
44 public: | 81 public: |
45 ParserBase(Scanner* scanner, uintptr_t stack_limit, | 82 ParserBase(Scanner* scanner, uintptr_t stack_limit, |
46 v8::Extension* extension, | 83 v8::Extension* extension, |
47 typename Traits::Type::Zone* zone, | 84 typename Traits::Type::Zone* zone, |
48 typename Traits::Type::Parser this_object) | 85 typename Traits::Type::Parser this_object) |
49 : Traits(this_object), | 86 : Traits(this_object), |
50 parenthesized_function_(false), | 87 parenthesized_function_(false), |
51 scope_(NULL), | 88 scope_(NULL), |
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
645 return PreParserExpression::Default(); | 682 return PreParserExpression::Default(); |
646 } | 683 } |
647 }; | 684 }; |
648 | 685 |
649 | 686 |
650 class PreParser; | 687 class PreParser; |
651 | 688 |
652 class PreParserTraits { | 689 class PreParserTraits { |
653 public: | 690 public: |
654 struct Type { | 691 struct Type { |
692 // TODO(marja): To be removed. The Traits object should contain all the data | |
693 // it needs. | |
655 typedef PreParser* Parser; | 694 typedef PreParser* Parser; |
656 | 695 |
657 // Types used by FunctionState and BlockState. | 696 // Used by FunctionState and BlockState. |
658 typedef PreParserScope Scope; | 697 typedef PreParserScope Scope; |
659 typedef PreParserFactory Factory; | |
660 // PreParser doesn't need to store generator variables. | 698 // PreParser doesn't need to store generator variables. |
661 typedef void GeneratorVariable; | 699 typedef void GeneratorVariable; |
662 // No interaction with Zones. | 700 // No interaction with Zones. |
663 typedef void Zone; | 701 typedef void Zone; |
664 | 702 |
665 // Return types for traversing functions. | 703 // Return types for traversing functions. |
666 typedef PreParserIdentifier Identifier; | 704 typedef PreParserIdentifier Identifier; |
667 typedef PreParserExpression Expression; | 705 typedef PreParserExpression Expression; |
668 typedef PreParserExpression FunctionLiteral; | 706 typedef PreParserExpression FunctionLiteral; |
669 typedef PreParserExpression ObjectLiteralProperty; | 707 typedef PreParserExpression ObjectLiteralProperty; |
670 typedef PreParserExpression Literal; | 708 typedef PreParserExpression Literal; |
671 typedef PreParserExpressionList ExpressionList; | 709 typedef PreParserExpressionList ExpressionList; |
672 typedef PreParserExpressionList PropertyList; | 710 typedef PreParserExpressionList PropertyList; |
711 | |
712 // For constructing objects returned by the traversing functions. | |
713 typedef PreParserFactory Factory; | |
673 }; | 714 }; |
674 | 715 |
675 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} | 716 explicit PreParserTraits(PreParser* pre_parser) : pre_parser_(pre_parser) {} |
676 | 717 |
677 // Custom operations executed when FunctionStates are created and | 718 // Custom operations executed when FunctionStates are created and |
678 // destructed. (The PreParser doesn't need to do anything.) | 719 // destructed. (The PreParser doesn't need to do anything.) |
679 template<typename FunctionState> | 720 template<typename FunctionState> |
680 static void SetUpFunctionState(FunctionState* function_state, void*) {} | 721 static void SetUpFunctionState(FunctionState* function_state, void*) {} |
681 template<typename FunctionState> | 722 template<typename FunctionState> |
682 static void TearDownFunctionState(FunctionState* function_state) {} | 723 static void TearDownFunctionState(FunctionState* function_state) {} |
(...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1536 "accessor_get_set"); | 1577 "accessor_get_set"); |
1537 } | 1578 } |
1538 *ok = false; | 1579 *ok = false; |
1539 } | 1580 } |
1540 } | 1581 } |
1541 | 1582 |
1542 | 1583 |
1543 } } // v8::internal | 1584 } } // v8::internal |
1544 | 1585 |
1545 #endif // V8_PREPARSER_H | 1586 #endif // V8_PREPARSER_H |
OLD | NEW |