1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_AST_H_ 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_AST_H_ 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/assembler.h" 1108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#include "src/ast-value-factory.h" 12b4ef18e93b120b995e067ba72707b62a448eeed6machenbach@chromium.org#include "src/bailout-reason.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h" 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/feedback-slots.h" 154b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/interface.h" 16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/isolate.h" 17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/jsregexp.h" 18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/list-inl.h" 19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime.h" 20196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/small-pointer-list.h" 21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/smart-pointers.h" 22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/token.h" 23196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/types.h" 24196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h" 25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/variables.h" 26196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/zone-inl.h" 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 2971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The abstract syntax tree is an intermediate, light-weight 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// representation of the parsed JavaScript code suitable for 3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// compilation to native code. 3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Nodes are allocated in a separate zone, which allows faster 3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// allocation and constant-time deallocation of the entire syntax 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// tree. 3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Nodes of the abstract syntax tree. Only concrete classes are 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// enumerated here. 4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#define DECLARATION_NODE_LIST(V) \ 45a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(VariableDeclaration) \ 46a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(FunctionDeclaration) \ 47a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(ModuleDeclaration) \ 48a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(ImportDeclaration) \ 49a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(ExportDeclaration) 5078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 5178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org#define MODULE_NODE_LIST(V) \ 5278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org V(ModuleLiteral) \ 5378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org V(ModuleVariable) \ 5478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org V(ModulePath) \ 5578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org V(ModuleUrl) 5678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 570b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org#define STATEMENT_NODE_LIST(V) \ 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(Block) \ 598e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org V(ModuleStatement) \ 6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(ExpressionStatement) \ 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(EmptyStatement) \ 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(IfStatement) \ 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(ContinueStatement) \ 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(BreakStatement) \ 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(ReturnStatement) \ 664acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org V(WithStatement) \ 6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(SwitchStatement) \ 689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com V(DoWhileStatement) \ 699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com V(WhileStatement) \ 709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com V(ForStatement) \ 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen V(ForInStatement) \ 721fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org V(ForOfStatement) \ 739d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com V(TryCatchStatement) \ 749d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com V(TryFinallyStatement) \ 750b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org V(DebuggerStatement) 760b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org 77a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org#define EXPRESSION_NODE_LIST(V) \ 78a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(FunctionLiteral) \ 79a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(ClassLiteral) \ 80a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(NativeFunctionLiteral) \ 81a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(Conditional) \ 82a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(VariableProxy) \ 83a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(Literal) \ 84a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(RegExpLiteral) \ 85a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(ObjectLiteral) \ 86a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(ArrayLiteral) \ 87a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(Assignment) \ 88a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(Yield) \ 89a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(Throw) \ 90a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(Property) \ 91a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(Call) \ 92a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(CallNew) \ 93a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(CallRuntime) \ 94a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(UnaryOperation) \ 95a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(CountOperation) \ 96a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(BinaryOperation) \ 97a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(CompareOperation) \ 98a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(ThisFunction) \ 99a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org V(SuperReference) \ 100a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org V(CaseClause) 101a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 1020b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org#define AST_NODE_LIST(V) \ 10378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org DECLARATION_NODE_LIST(V) \ 10478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org MODULE_NODE_LIST(V) \ 1050b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org STATEMENT_NODE_LIST(V) \ 1064f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org EXPRESSION_NODE_LIST(V) 10743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1087be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// Forward declarations 109b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgclass AstConstructionVisitor; 110b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgtemplate<class> class AstNodeFactory; 111659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass AstVisitor; 11278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgclass Declaration; 11378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgclass Module; 114659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass BreakableStatement; 115659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass Expression; 116659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass IterationStatement; 117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass MaterializedLiteral; 1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass OStream; 119659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass Statement; 120a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass TargetCollector; 121a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgclass TypeFeedbackOracle; 1227be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 123659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpAlternative; 124659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpAssertion; 125659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpAtom; 126659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpBackReference; 127659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpCapture; 128659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpCharacterClass; 129659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpCompiler; 130659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpDisjunction; 131659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpEmpty; 132659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpLookahead; 133659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpQuantifier; 134659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgclass RegExpText; 135659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DEF_FORWARD_DECLARATION(type) class type; 1370b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgAST_NODE_LIST(DEF_FORWARD_DECLARATION) 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DEF_FORWARD_DECLARATION 13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Typedef only introduced to avoid unreadable code. 14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Please do appreciate the required space in "> >". 14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansentypedef ZoneList<Handle<String> > ZoneStringList; 144911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgtypedef ZoneList<Handle<Object> > ZoneObjectList; 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org#define DECLARE_NODE_TYPE(type) \ 148ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void Accept(AstVisitor* v) OVERRIDE; \ 149ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual AstNode::NodeType node_type() const FINAL OVERRIDE { \ 15032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org return AstNode::k##type; \ 15132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } \ 152355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org template<class> friend class AstNodeFactory; 153b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 154b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 155b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgenum AstPropertiesFlag { 156b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org kDontSelfOptimize, 15781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kDontSoftInline, 15881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org kDontCache 159b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org}; 160b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 161b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 162ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass AstProperties FINAL BASE_EMBEDDED { 163b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public: 164b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org class Flags : public EnumSet<AstPropertiesFlag, int> {}; 165b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 166a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgAstProperties() : node_count_(0), feedback_slots_(0) {} 167b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 168b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Flags* flags() { return &flags_; } 169b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int node_count() { return node_count_; } 170b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org void add_node_count(int count) { node_count_ += count; } 171b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 172a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org int feedback_slots() const { return feedback_slots_; } 173a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org void increase_feedback_slots(int count) { 174a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org feedback_slots_ += count; 175a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org } 176a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org 177b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org private: 178b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Flags flags_; 179b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int node_count_; 180a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org int feedback_slots_; 181b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org}; 182b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 183b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1840b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgclass AstNode: public ZoneObject { 18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 186a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org // For generating IDs for AstNodes. 187a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org class IdGen { 188a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org public: 189a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org explicit IdGen(int id = 0) : id_(id) {} 190a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 191a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int GetNextId() { return ReserveIdRange(1); } 192a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int ReserveIdRange(int n) { 193a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int tmp = id_; 194a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org id_ += n; 195a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return tmp; 196a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org } 197a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 198a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org private: 199a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int id_; 200a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org }; 201a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 202f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org#define DECLARE_TYPE_ENUM(type) k##type, 203dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org enum NodeType { 204f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org AST_NODE_LIST(DECLARE_TYPE_ENUM) 205f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org kInvalid = -1 206f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org }; 207f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org#undef DECLARE_TYPE_ENUM 208f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 20984bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org void* operator new(size_t size, Zone* zone) { 21084bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org return zone->New(static_cast<int>(size)); 211ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 212a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 213a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org explicit AstNode(int position): position_(position) {} 21432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org virtual ~AstNode() {} 215f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 216a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual void Accept(AstVisitor* v) = 0; 217dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org virtual NodeType node_type() const = 0; 218a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int position() const { return position_; } 219f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 220f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org // Type testing & conversion functions overridden by concrete subclasses. 2214edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org#define DECLARE_NODE_FUNCTIONS(type) \ 2224edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org bool Is##type() const { return node_type() == AstNode::k##type; } \ 2234edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org type* As##type() { \ 2244edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return Is##type() ? reinterpret_cast<type*>(this) : NULL; \ 2254edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org } \ 2264edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org const type* As##type() const { \ 2274edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return Is##type() ? reinterpret_cast<const type*>(this) : NULL; \ 2284edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org } 229f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org AST_NODE_LIST(DECLARE_NODE_FUNCTIONS) 230f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org#undef DECLARE_NODE_FUNCTIONS 23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org virtual TargetCollector* AsTargetCollector() { return NULL; } 23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual BreakableStatement* AsBreakableStatement() { return NULL; } 23443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual IterationStatement* AsIterationStatement() { return NULL; } 235bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org virtual MaterializedLiteral* AsMaterializedLiteral() { return NULL; } 236a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 237a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org protected: 238471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org // Some nodes re-use bailout IDs for type feedback. 239471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org static TypeFeedbackId reuse(BailoutId id) { 240471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return TypeFeedbackId(id.ToInt()); 241471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 242471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 243471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 24484bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org private: 24584bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org // Hidden to prevent accidental usage. It would have to load the 24684bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org // current zone from the TLS. 24784bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org void* operator new(size_t size); 24884bcc559ac20fb04f806e97d28a314b20b58fd60svenpanne@chromium.org 2494d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org friend class CaseClause; // Generates AST IDs. 250a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 251a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int position_; 25243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 25343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 25532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass Statement : public AstNode { 25643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2576d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org explicit Statement(Zone* zone, int position) : AstNode(position) {} 258c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org 25943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool IsEmpty() { return AsEmptyStatement() != NULL; } 260594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org virtual bool IsJump() const { return false; } 26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 264ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SmallMapList FINAL { 265ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org public: 266ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org SmallMapList() {} 2677028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org SmallMapList(int capacity, Zone* zone) : list_(capacity, zone) {} 268ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 2697028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org void Reserve(int capacity, Zone* zone) { list_.Reserve(capacity, zone); } 270ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org void Clear() { list_.Clear(); } 2711456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org void Sort() { list_.Sort(); } 272ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 273ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org bool is_empty() const { return list_.is_empty(); } 274ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org int length() const { return list_.length(); } 275ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 27657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org void AddMapIfMissing(Handle<Map> map, Zone* zone) { 2779d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org if (!Map::TryUpdate(map).ToHandle(&map)) return; 27857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org for (int i = 0; i < length(); ++i) { 27957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org if (at(i).is_identical_to(map)) return; 28057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 28157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org Add(map, zone); 28257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 28357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org 284639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org void FilterForPossibleTransitions(Map* root_map) { 285639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org for (int i = list_.length() - 1; i >= 0; i--) { 286639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (at(i)->FindRootMap() != root_map) { 287639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org list_.RemoveElement(list_.at(i)); 288639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 289639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 290639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 291639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org 2927028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org void Add(Handle<Map> handle, Zone* zone) { 2937028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org list_.Add(handle.location(), zone); 294ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org } 295ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 296ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org Handle<Map> at(int i) const { 297ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org return Handle<Map>(list_.at(i)); 298ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org } 299ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 300ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org Handle<Map> first() const { return at(0); } 301ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org Handle<Map> last() const { return at(length() - 1); } 302ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 303ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org private: 304ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org // The list stores pointers to Map*, that is Map**, so it's GC safe. 305ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org SmallPointerList<Map*> list_; 306ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 307ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org DISALLOW_COPY_AND_ASSIGN(SmallMapList); 308ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org}; 309ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 310ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org 31132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass Expression : public AstNode { 31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 313a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org enum Context { 314a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Not assigned a context yet, or else will not be visited during 315a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // code generation. 316a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org kUninitialized, 317a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Evaluated for its side effects. 318a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org kEffect, 319a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Evaluated for its value (and side effects). 320a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org kValue, 321a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Evaluated for control flow (and side effects). 322a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org kTest 323a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org }; 324a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3254edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org virtual bool IsValidReferenceExpression() const { return false; } 32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 327a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Helpers for ToBoolean conversion. 3284edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org virtual bool ToBooleanIsTrue() const { return false; } 3294edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org virtual bool ToBooleanIsFalse() const { return false; } 330a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 3310c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // Symbols that cannot be parsed as array indices are considered property 3320c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // names. We do not treat symbols that can be array indexes as property 3330c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org // names because [] for string objects is handled only by keyed ICs. 3344edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org virtual bool IsPropertyName() const { return false; } 3350c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 33665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org // True iff the result can be safely overwritten (to avoid allocation). 33765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org // False for operations that can return one of their operands. 3384edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org virtual bool ResultOverwriteAllowed() const { return false; } 33965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 340d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org // True iff the expression is a literal represented as a smi. 3414edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org bool IsSmiLiteral() const; 342d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org 343c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // True iff the expression is a string literal. 3444edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org bool IsStringLiteral() const; 345c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 346c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // True iff the expression is the null literal. 3474edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org bool IsNullLiteral() const; 348c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 34996a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org // True if we can prove that the expression is the undefined literal. 3504edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org bool IsUndefinedLiteral(Isolate* isolate) const; 351ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 3521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // Expression type bounds 3534edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org Bounds bounds() const { return bounds_; } 354169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void set_bounds(Bounds bounds) { bounds_ = bounds; } 355dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org 3569bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org // Whether the expression is parenthesized 3579bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org unsigned parenthesization_level() const { return parenthesization_level_; } 3589bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org bool is_parenthesized() const { return parenthesization_level_ > 0; } 3599bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org void increase_parenthesization_level() { ++parenthesization_level_; } 3609bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org 361a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Type feedback information for assignments and properties. 362a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org virtual bool IsMonomorphic() { 363a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org UNREACHABLE(); 364a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return false; 365a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 366ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org virtual SmallMapList* GetReceiverTypes() { 367a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org UNREACHABLE(); 368a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return NULL; 369a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 3707bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org virtual KeyedAccessStoreMode GetStoreMode() { 3717bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org UNREACHABLE(); 3727bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org return STANDARD_STORE; 3737bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org } 374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 375c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // TODO(rossberg): this should move to its own AST node eventually. 3761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org virtual void RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle); 377c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org byte to_boolean_types() const { return to_boolean_types_; } 378c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 379471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId id() const { return id_; } 380471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId test_id() const { return test_id_; } 381d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org 38278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 383a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Expression(Zone* zone, int pos, IdGen* id_gen) 384a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : AstNode(pos), 3856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org bounds_(Bounds::Unbounded(zone)), 3869bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org parenthesization_level_(0), 387a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org id_(id_gen->GetNextId()), 388a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org test_id_(id_gen->GetNextId()) {} 3891510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void set_to_boolean_types(byte types) { to_boolean_types_ = types; } 39078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 3919bbf968a649030335309265ba2c98fcc36aeb762kasperl@chromium.org private: 392169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Bounds bounds_; 393c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org byte to_boolean_types_; 3949bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org unsigned parenthesization_level_; 395c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 396471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId id_; 397471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const TypeFeedbackId test_id_; 39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass BreakableStatement : public Statement { 40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 403dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org enum BreakableType { 40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TARGET_FOR_ANONYMOUS, 40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen TARGET_FOR_NAMED_ONLY 40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The labels associated with this statement. May be NULL; 40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // if it is != NULL, guaranteed to contain at least one entry. 41008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ZoneList<const AstRawString*>* labels() const { return labels_; } 41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Type testing & conversion. 413ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BreakableStatement* AsBreakableStatement() FINAL OVERRIDE { 41432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org return this; 41532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Code generation 41844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Label* break_target() { return &break_target_; } 41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Testers. 421dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org bool is_target_for_anonymous() const { 422dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org return breakable_type_ == TARGET_FOR_ANONYMOUS; 423dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org } 42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 425471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId EntryId() const { return entry_id_; } 426471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId ExitId() const { return exit_id_; } 427a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected: 429a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org BreakableStatement(Zone* zone, ZoneList<const AstRawString*>* labels, 430a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org BreakableType breakable_type, int position, IdGen* id_gen) 4316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Statement(zone, position), 432a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org labels_(labels), 433dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org breakable_type_(breakable_type), 434a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org entry_id_(id_gen->GetNextId()), 435a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org exit_id_(id_gen->GetNextId()) { 436e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(labels == NULL || labels->length() > 0); 437c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 438c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 44108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ZoneList<const AstRawString*>* labels_; 442dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org BreakableType breakable_type_; 44344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Label break_target_; 444471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId entry_id_; 445471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId exit_id_; 44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 449ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Block FINAL : public BreakableStatement { 45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 451f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(Block) 4525d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 453400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org void AddStatement(Statement* statement, Zone* zone) { 454400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org statements_.Add(statement, zone); 455400388edd471bd4d4a97b21c52c1024cd1cc5708rossberg@chromium.org } 45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Statement*>* statements() { return &statements_; } 4584a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org bool is_initializer_block() const { return is_initializer_block_; } 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4601e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org BailoutId DeclsId() const { return decls_id_; } 4611e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org 462ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsJump() const OVERRIDE { 463594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return !statements_.is_empty() && statements_.last()->IsJump() 464594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org && labels() == NULL; // Good enough as an approximation... 465594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 466594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 467ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Scope* scope() const { return scope_; } 468ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com void set_scope(Scope* scope) { scope_ = scope; } 4694acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org 470b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 471a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Block(Zone* zone, ZoneList<const AstRawString*>* labels, int capacity, 472a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org bool is_initializer_block, int pos, IdGen* id_gen) 473a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : BreakableStatement(zone, labels, TARGET_FOR_NAMED_ONLY, pos, id_gen), 4747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org statements_(capacity, zone), 475b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org is_initializer_block_(is_initializer_block), 476a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org decls_id_(id_gen->GetNextId()), 477a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org scope_(NULL) {} 478b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Statement*> statements_; 48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool is_initializer_block_; 4821e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org const BailoutId decls_id_; 483ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com Scope* scope_; 48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 48732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass Declaration : public AstNode { 48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 489b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VariableProxy* proxy() const { return proxy_; } 490b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VariableMode mode() const { return mode_; } 491b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Scope* scope() const { return scope_; } 492812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org virtual InitializationFlag initialization() const = 0; 49378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org virtual bool IsInlineable() const; 494b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 49578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 4966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Declaration(Zone* zone, 4976d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org VariableProxy* proxy, 498b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org VariableMode mode, 499a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 500a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) 501a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : AstNode(pos), 502a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org proxy_(proxy), 503a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org mode_(mode), 5041805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org scope_(scope) { 505e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsDeclaredVariableMode(mode)); 50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen VariableProxy* proxy_; 510b4b2aa69a9f12525fca190287f47a66d7bdcb3aerossberg@chromium.org VariableMode mode_; 5111805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org 5121805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org // Nested scope from which the declaration originated. 5131805e21b0aece8c05f4960a5c0751c4463557891fschneider@chromium.org Scope* scope_; 51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 517ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass VariableDeclaration FINAL : public Declaration { 51878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public: 51978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org DECLARE_NODE_TYPE(VariableDeclaration) 52078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 521ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual InitializationFlag initialization() const OVERRIDE { 522812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return mode() == VAR ? kCreatedInitialized : kNeedsInitialization; 523812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 524812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 525812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org protected: 5266d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org VariableDeclaration(Zone* zone, 5276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org VariableProxy* proxy, 528812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org VariableMode mode, 529a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 530a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) 5316d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Declaration(zone, proxy, mode, scope, pos) { 532812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 533812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}; 534812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 535812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 536ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass FunctionDeclaration FINAL : public Declaration { 537812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public: 538812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org DECLARE_NODE_TYPE(FunctionDeclaration) 539812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 540812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org FunctionLiteral* fun() const { return fun_; } 541ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual InitializationFlag initialization() const OVERRIDE { 542812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return kCreatedInitialized; 543812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 544ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsInlineable() const OVERRIDE; 54578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 54678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 5476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org FunctionDeclaration(Zone* zone, 5486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org VariableProxy* proxy, 54978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org VariableMode mode, 55078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org FunctionLiteral* fun, 551a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 552a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) 5536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Declaration(zone, proxy, mode, scope, pos), 55478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org fun_(fun) { 555812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org // At the moment there are no "const functions" in JavaScript... 556e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(mode == VAR || mode == LET); 557e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(fun != NULL); 55878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 55978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 56078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private: 56178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org FunctionLiteral* fun_; 56278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}; 56378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 56478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 565ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleDeclaration FINAL : public Declaration { 56678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public: 56778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org DECLARE_NODE_TYPE(ModuleDeclaration) 56878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 56978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Module* module() const { return module_; } 570ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual InitializationFlag initialization() const OVERRIDE { 571812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return kCreatedInitialized; 572812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 57378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 57478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 5756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ModuleDeclaration(Zone* zone, 5766d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org VariableProxy* proxy, 57778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Module* module, 578a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 579a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) 5806d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Declaration(zone, proxy, MODULE, scope, pos), 58178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org module_(module) { 58278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 58378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 58478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private: 58578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Module* module_; 58678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}; 58778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 58878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 589ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ImportDeclaration FINAL : public Declaration { 590812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public: 591812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org DECLARE_NODE_TYPE(ImportDeclaration) 592812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 593812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org Module* module() const { return module_; } 594ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual InitializationFlag initialization() const OVERRIDE { 595812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return kCreatedInitialized; 596812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 597812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 598812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org protected: 5996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ImportDeclaration(Zone* zone, 6006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org VariableProxy* proxy, 601812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org Module* module, 602a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 603a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) 6046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Declaration(zone, proxy, LET, scope, pos), 605812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org module_(module) { 606812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 607812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 608812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org private: 609812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org Module* module_; 610812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}; 611812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 612812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 613ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ExportDeclaration FINAL : public Declaration { 614812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org public: 615812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org DECLARE_NODE_TYPE(ExportDeclaration) 616812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 617ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual InitializationFlag initialization() const OVERRIDE { 618812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return kCreatedInitialized; 619812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 620812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 621812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org protected: 6226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ExportDeclaration(Zone* zone, VariableProxy* proxy, Scope* scope, int pos) 6236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Declaration(zone, proxy, LET, scope, pos) {} 624812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}; 625812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 626812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 62732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass Module : public AstNode { 628bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com public: 629bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Interface* interface() const { return interface_; } 63081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org Block* body() const { return body_; } 631bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 63278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 633a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Module(Zone* zone, int pos) 634a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : AstNode(pos), 635a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org interface_(Interface::NewModule(zone)), 63681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org body_(NULL) {} 6376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Module(Zone* zone, Interface* interface, int pos, Block* body = NULL) 638a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : AstNode(pos), 639a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org interface_(interface), 64081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org body_(body) {} 641bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 642bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com private: 643bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Interface* interface_; 64481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org Block* body_; 64578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}; 64678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 64778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 648ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleLiteral FINAL : public Module { 64978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public: 65078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org DECLARE_NODE_TYPE(ModuleLiteral) 65178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 65278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 6536d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ModuleLiteral(Zone* zone, Block* body, Interface* interface, int pos) 6546d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Module(zone, interface, pos, body) {} 65578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}; 65678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 65778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 658ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleVariable FINAL : public Module { 65978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public: 66078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org DECLARE_NODE_TYPE(ModuleVariable) 66178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 662f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org VariableProxy* proxy() const { return proxy_; } 66378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 66478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 6656d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org inline ModuleVariable(Zone* zone, VariableProxy* proxy, int pos); 66678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 66778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private: 668f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org VariableProxy* proxy_; 66978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}; 67078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 67178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 672ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModulePath FINAL : public Module { 67378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public: 67478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org DECLARE_NODE_TYPE(ModulePath) 67578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 67678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Module* module() const { return module_; } 67708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<String> name() const { return name_->string(); } 67878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 67978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 68008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ModulePath(Zone* zone, Module* module, const AstRawString* name, int pos) 68108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org : Module(zone, pos), module_(module), name_(name) {} 68278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 68378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private: 68478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Module* module_; 68508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* name_; 68678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}; 68778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 68878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 689ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleUrl FINAL : public Module { 69078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org public: 69178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org DECLARE_NODE_TYPE(ModuleUrl) 69278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 69378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Handle<String> url() const { return url_; } 69478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 69578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org protected: 6966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ModuleUrl(Zone* zone, Handle<String> url, int pos) 697a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : Module(zone, pos), url_(url) { 69878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 69978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 70078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org private: 70178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Handle<String> url_; 70278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}; 70378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 70478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 705ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ModuleStatement FINAL : public Statement { 7068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org public: 7078e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org DECLARE_NODE_TYPE(ModuleStatement) 7088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 7098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org VariableProxy* proxy() const { return proxy_; } 7108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Block* body() const { return body_; } 7118e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 7128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org protected: 7136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ModuleStatement(Zone* zone, VariableProxy* proxy, Block* body, int pos) 7146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Statement(zone, pos), 715a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org proxy_(proxy), 7168e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org body_(body) { 7178e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 7188e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 7198e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org private: 7208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org VariableProxy* proxy_; 7218e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org Block* body_; 7228e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}; 7238e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 7248e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 72532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass IterationStatement : public BreakableStatement { 72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Type testing & conversion. 728ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual IterationStatement* AsIterationStatement() FINAL OVERRIDE { 72932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org return this; 73032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* body() const { return body_; } 73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 734471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId OsrEntryId() const { return osr_entry_id_; } 735471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org virtual BailoutId ContinueId() const = 0; 736471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org virtual BailoutId StackCheckId() const = 0; 737a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Code generation 73944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Label* continue_target() { return &continue_target_; } 74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected: 742a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IterationStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 743a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 744a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, id_gen), 745c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org body_(NULL), 746a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org osr_entry_id_(id_gen->GetNextId()) {} 74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Initialize(Statement* body) { 74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen body_ = body; 75043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 75243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* body_; 75444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Label continue_target_; 755c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 756471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId osr_entry_id_; 75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 760ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass DoWhileStatement FINAL : public IterationStatement { 76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 762f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(DoWhileStatement) 763f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 7649d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com void Initialize(Expression* cond, Statement* body) { 7659d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com IterationStatement::Initialize(body); 7669d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com cond_ = cond; 7679d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 7689d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 7699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com Expression* cond() const { return cond_; } 7709d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 771ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId ContinueId() const OVERRIDE { return continue_id_; } 772ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId StackCheckId() const OVERRIDE { return back_edge_id_; } 773471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId BackEdgeId() const { return back_edge_id_; } 774a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 775b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 776a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org DoWhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 777a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 778a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : IterationStatement(zone, labels, pos, id_gen), 779b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org cond_(NULL), 780a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org continue_id_(id_gen->GetNextId()), 781a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org back_edge_id_(id_gen->GetNextId()) {} 782a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 7839d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com private: 7849d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com Expression* cond_; 785c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 786471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId continue_id_; 787471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId back_edge_id_; 7889d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}; 7899d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 7909d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 791ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass WhileStatement FINAL : public IterationStatement { 7929d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com public: 793f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(WhileStatement) 794f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 7959d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com void Initialize(Expression* cond, Statement* body) { 7969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com IterationStatement::Initialize(body); 7979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com cond_ = cond; 7989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 7999d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 8009d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com Expression* cond() const { return cond_; } 8019d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com bool may_have_function_literal() const { 8029d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com return may_have_function_literal_; 8039d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 80465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org void set_may_have_function_literal(bool value) { 80565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org may_have_function_literal_ = value; 80665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org } 8079d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 808ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } 809ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } 810471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId BodyId() const { return body_id_; } 811a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 812b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 813a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org WhileStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 814a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 815a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : IterationStatement(zone, labels, pos, id_gen), 816b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org cond_(NULL), 817b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org may_have_function_literal_(true), 818a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org body_id_(id_gen->GetNextId()) {} 819b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 8209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com private: 8219d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com Expression* cond_; 822c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 8239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com // True if there is a function literal subexpression in the condition. 8249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com bool may_have_function_literal_; 825c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 826471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId body_id_; 8279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}; 8289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 8299d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 830ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ForStatement FINAL : public IterationStatement { 8319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com public: 832f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(ForStatement) 83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Initialize(Statement* init, 83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* cond, 83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* next, 83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* body) { 83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IterationStatement::Initialize(body); 83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen init_ = init; 84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cond_ = cond; 84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen next_ = next; 84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 84343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 8444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Statement* init() const { return init_; } 8454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Expression* cond() const { return cond_; } 8464a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Statement* next() const { return next_; } 84765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 848f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org bool may_have_function_literal() const { 849f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org return may_have_function_literal_; 850f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org } 85165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org void set_may_have_function_literal(bool value) { 85265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org may_have_function_literal_ = value; 85365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org } 85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 855ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId ContinueId() const OVERRIDE { return continue_id_; } 856ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } 857471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId BodyId() const { return body_id_; } 858a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 859f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org bool is_fast_smi_loop() { return loop_variable_ != NULL; } 860f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org Variable* loop_variable() { return loop_variable_; } 861f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org void set_loop_variable(Variable* var) { loop_variable_ = var; } 862b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 863b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 864a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ForStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 865a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 866a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : IterationStatement(zone, labels, pos, id_gen), 867b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org init_(NULL), 868b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org cond_(NULL), 869b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org next_(NULL), 870b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org may_have_function_literal_(true), 871b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org loop_variable_(NULL), 872a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org continue_id_(id_gen->GetNextId()), 873a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org body_id_(id_gen->GetNextId()) {} 874f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* init_; 87743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* cond_; 87843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* next_; 879c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 880bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org // True if there is a function literal subexpression in the condition. 881f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org bool may_have_function_literal_; 882f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org Variable* loop_variable_; 883c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 884471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId continue_id_; 885471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId body_id_; 88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 88932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass ForEachStatement : public IterationStatement { 89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 8911fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org enum VisitMode { 8921fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org ENUMERATE, // for (each in subject) body; 8931fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org ITERATE // for (each of subject) body; 8941fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org }; 895f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 8961fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org void Initialize(Expression* each, Expression* subject, Statement* body) { 89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IterationStatement::Initialize(body); 89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen each_ = each; 8991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org subject_ = subject; 90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 90143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 90243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* each() const { return each_; } 9031fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* subject() const { return subject_; } 90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 9051fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org protected: 906a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ForEachStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 907a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 908a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : IterationStatement(zone, labels, pos, id_gen), 909a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org each_(NULL), 910a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org subject_(NULL) {} 9111fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9121fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org private: 9131fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* each_; 9141fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* subject_; 9151fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}; 9161fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9171fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 918ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ForInStatement FINAL : public ForEachStatement, 919f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org public FeedbackSlotInterface { 9201fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org public: 9211fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org DECLARE_NODE_TYPE(ForInStatement) 9221fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9231fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* enumerable() const { 9241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return subject(); 9251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 926471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 927f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org // Type feedback information. 928a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org virtual int ComputeFeedbackSlotCount() { return 1; } 929f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org virtual void SetFirstFeedbackSlot(int slot) { for_in_feedback_slot_ = slot; } 930f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 931f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int ForInFeedbackSlot() { 932e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(for_in_feedback_slot_ != kInvalidFeedbackSlot); 933f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return for_in_feedback_slot_; 934f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 935f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 936c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org enum ForInType { FAST_FOR_IN, SLOW_FOR_IN }; 937c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ForInType for_in_type() const { return for_in_type_; } 9389f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org void set_for_in_type(ForInType type) { for_in_type_ = type; } 939a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 9401fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org BailoutId BodyId() const { return body_id_; } 9411fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org BailoutId PrepareId() const { return prepare_id_; } 942ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } 943ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId StackCheckId() const OVERRIDE { return body_id_; } 9441fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 945b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 946a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ForInStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 947a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 948a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : ForEachStatement(zone, labels, pos, id_gen), 9491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org for_in_type_(SLOW_FOR_IN), 950f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org for_in_feedback_slot_(kInvalidFeedbackSlot), 951a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org body_id_(id_gen->GetNextId()), 952a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org prepare_id_(id_gen->GetNextId()) {} 953b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 954c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ForInType for_in_type_; 955f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int for_in_feedback_slot_; 956471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId body_id_; 957471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId prepare_id_; 95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 961ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ForOfStatement FINAL : public ForEachStatement { 9621fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org public: 9631fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org DECLARE_NODE_TYPE(ForOfStatement) 9641fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9651fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org void Initialize(Expression* each, 9661fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* subject, 9671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Statement* body, 9681fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* assign_iterator, 9691fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* next_result, 9701fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* result_done, 9711fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* assign_each) { 9721fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org ForEachStatement::Initialize(each, subject, body); 9731fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org assign_iterator_ = assign_iterator; 9741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org next_result_ = next_result; 9751fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org result_done_ = result_done; 9761fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org assign_each_ = assign_each; 9771fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 9781fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9791fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* iterable() const { 9801fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return subject(); 9811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 9821fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 983f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org // var iterator = subject[Symbol.iterator](); 9841fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* assign_iterator() const { 9851fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return assign_iterator_; 9861fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 9871fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9881fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // var result = iterator.next(); 9891fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* next_result() const { 9901fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return next_result_; 9911fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 9921fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9931fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // result.done 9941fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* result_done() const { 9951fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return result_done_; 9961fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 9971fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 9981fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org // each = result.value 9991fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* assign_each() const { 10001fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return assign_each_; 10011fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 10021fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 1003ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId ContinueId() const OVERRIDE { return EntryId(); } 1004ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual BailoutId StackCheckId() const OVERRIDE { return BackEdgeId(); } 10051fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 10061fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org BailoutId BackEdgeId() const { return back_edge_id_; } 10071fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 10081fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org protected: 1009a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ForOfStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 1010a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 1011a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : ForEachStatement(zone, labels, pos, id_gen), 10121fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org assign_iterator_(NULL), 10131fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org next_result_(NULL), 10141fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org result_done_(NULL), 10151fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org assign_each_(NULL), 1016a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org back_edge_id_(id_gen->GetNextId()) {} 10171fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 10181fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* assign_iterator_; 10191fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* next_result_; 10201fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* result_done_; 10211fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Expression* assign_each_; 10221fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org const BailoutId back_edge_id_; 10231fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}; 10241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 10251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 1026ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ExpressionStatement FINAL : public Statement { 102743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1028f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(ExpressionStatement) 102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void set_expression(Expression* e) { expression_ = e; } 1031a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Expression* expression() const { return expression_; } 1032ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsJump() const OVERRIDE { return expression_->IsThrow(); } 103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1034b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 10356d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ExpressionStatement(Zone* zone, Expression* expression, int pos) 10366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Statement(zone, pos), expression_(expression) { } 1037b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 103843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 103943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* expression_; 104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 104332cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass JumpStatement : public Statement { 1044594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org public: 1045ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsJump() const FINAL OVERRIDE { return true; } 1046594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1047594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org protected: 10486d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org explicit JumpStatement(Zone* zone, int pos) : Statement(zone, pos) {} 1049594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}; 1050594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1051594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1052ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ContinueStatement FINAL : public JumpStatement { 105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1054f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(ContinueStatement) 105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10564a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org IterationStatement* target() const { return target_; } 1057b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1058b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 10596d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org explicit ContinueStatement(Zone* zone, IterationStatement* target, int pos) 10606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : JumpStatement(zone, pos), target_(target) { } 106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen IterationStatement* target_; 106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1067ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass BreakStatement FINAL : public JumpStatement { 106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1069f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(BreakStatement) 107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 10714a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org BreakableStatement* target() const { return target_; } 1072b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1073b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 10746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org explicit BreakStatement(Zone* zone, BreakableStatement* target, int pos) 10756d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : JumpStatement(zone, pos), target_(target) { } 107643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 107743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 107843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen BreakableStatement* target_; 107943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 108043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1082ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ReturnStatement FINAL : public JumpStatement { 108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1084f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(ReturnStatement) 108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1086a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Expression* expression() const { return expression_; } 1087b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1088b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 10896d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org explicit ReturnStatement(Zone* zone, Expression* expression, int pos) 10906d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : JumpStatement(zone, pos), expression_(expression) { } 109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* expression_; 109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1097ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass WithStatement FINAL : public Statement { 109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 10994acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org DECLARE_NODE_TYPE(WithStatement) 110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1101ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org Scope* scope() { return scope_; } 11024a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Expression* expression() const { return expression_; } 11034acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org Statement* statement() const { return statement_; } 110443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1105b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1106a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org WithStatement( 11076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Zone* zone, Scope* scope, 11086d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Expression* expression, Statement* statement, int pos) 11096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Statement(zone, pos), 1110a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org scope_(scope), 1111ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org expression_(expression), 1112b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org statement_(statement) { } 111337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1115ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org Scope* scope_; 111643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* expression_; 11174acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org Statement* statement_; 111843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 111943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1121ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CaseClause FINAL : public Expression { 112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1123a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org DECLARE_NODE_TYPE(CaseClause) 112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11254a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org bool is_default() const { return label_ == NULL; } 11264a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Expression* label() const { 112743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen CHECK(!is_default()); 112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return label_; 112943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 113044bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Label* body_target() { return &body_target_; } 11314a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org ZoneList<Statement*>* statements() const { return statements_; } 113243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1133471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId EntryId() const { return entry_id_; } 11344d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org 1135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Type feedback information. 1136471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId CompareId() { return compare_id_; } 11376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* compare_type() { return compare_type_; } 11386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void set_compare_type(Type* type) { compare_type_ = type; } 1139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1141a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CaseClause(Zone* zone, Expression* label, ZoneList<Statement*>* statements, 1142a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int pos, IdGen* id_gen); 1143a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 114443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* label_; 114544bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Label body_target_; 114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Statement*>* statements_; 11476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* compare_type_; 114841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org 1149471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const TypeFeedbackId compare_id_; 1150471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId entry_id_; 115143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 115243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 115343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1154ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SwitchStatement FINAL : public BreakableStatement { 115543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1156f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(SwitchStatement) 1157f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 115843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Initialize(Expression* tag, ZoneList<CaseClause*>* cases) { 115943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen tag_ = tag; 116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cases_ = cases; 116143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 116243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11634a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Expression* tag() const { return tag_; } 11644a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org ZoneList<CaseClause*>* cases() const { return cases_; } 1165b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1166b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1167a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org SwitchStatement(Zone* zone, ZoneList<const AstRawString*>* labels, int pos, 1168a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 1169a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : BreakableStatement(zone, labels, TARGET_FOR_ANONYMOUS, pos, id_gen), 1170b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org tag_(NULL), 1171a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org cases_(NULL) {} 117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 117343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 117443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* tag_; 117543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<CaseClause*>* cases_; 117643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 117743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 117843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 117943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// If-statements always have non-null references to their then- and 118043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// else-parts. When parsing if-statements with no explicit else-part, 118143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the parser implicitly creates an empty statement. Use the 118243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// HasThenStatement() and HasElseStatement() functions to check if a 118343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// given if-statement has a then- or an else-part containing code. 1184ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass IfStatement FINAL : public Statement { 118543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1186f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(IfStatement) 118743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 118843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool HasThenStatement() const { return !then_statement()->IsEmpty(); } 118943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool HasElseStatement() const { return !else_statement()->IsEmpty(); } 119043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 119143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* condition() const { return condition_; } 119243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* then_statement() const { return then_statement_; } 119343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* else_statement() const { return else_statement_; } 11945f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 1195ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsJump() const OVERRIDE { 1196594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org return HasThenStatement() && then_statement()->IsJump() 1197594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org && HasElseStatement() && else_statement()->IsJump(); 1198594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org } 1199594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org 1200471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId IfId() const { return if_id_; } 1201471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId ThenId() const { return then_id_; } 1202471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId ElseId() const { return else_id_; } 120343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1204b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1205a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IfStatement(Zone* zone, Expression* condition, Statement* then_statement, 1206a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Statement* else_statement, int pos, IdGen* id_gen) 12076d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Statement(zone, pos), 1208a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org condition_(condition), 1209b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org then_statement_(then_statement), 1210b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org else_statement_(else_statement), 1211a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org if_id_(id_gen->GetNextId()), 1212a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org then_id_(id_gen->GetNextId()), 1213a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org else_id_(id_gen->GetNextId()) {} 1214b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 121543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 121643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* condition_; 121743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* then_statement_; 121843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Statement* else_statement_; 1219471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId if_id_; 1220471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId then_id_; 1221471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId else_id_; 122243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 122343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 122443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12257be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org// NOTE: TargetCollectors are represented as nodes to fit in the target 122643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// stack in the compiler; this should probably be reworked. 1227ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass TargetCollector FINAL : public AstNode { 122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1229a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org explicit TargetCollector(Zone* zone) 1230a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : AstNode(RelocInfo::kNoPosition), targets_(0, zone) { } 123143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12327be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Adds a jump target to the collector. The collector stores a pointer not 12337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // a copy of the target to make binding work, so make sure not to pass in 12347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // references to something on the stack. 12357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org void AddTarget(Label* target, Zone* zone); 123643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org // Virtual behaviour. TargetCollectors are never part of the AST. 1238ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void Accept(AstVisitor* v) OVERRIDE { UNREACHABLE(); } 1239ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual NodeType node_type() const OVERRIDE { return kInvalid; } 1240ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual TargetCollector* AsTargetCollector() OVERRIDE { return this; } 124143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12426d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org ZoneList<Label*>* targets() { return &targets_; } 124343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 12456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org ZoneList<Label*> targets_; 124643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 124743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 124932cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass TryStatement : public Statement { 125043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 125144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org void set_escaping_targets(ZoneList<Label*>* targets) { 12527be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org escaping_targets_ = targets; 125343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 125504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org int index() const { return index_; } 125643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Block* try_block() const { return try_block_; } 125744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org ZoneList<Label*>* escaping_targets() const { return escaping_targets_; } 1258b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1259b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 12606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TryStatement(Zone* zone, int index, Block* try_block, int pos) 12616d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Statement(zone, pos), 1262a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org index_(index), 1263b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org try_block_(try_block), 1264b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org escaping_targets_(NULL) { } 126543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 126643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 126704e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org // Unique (per-function) index of this handler. This is not an AST ID. 126804e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org int index_; 126904e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org 127043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Block* try_block_; 127144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org ZoneList<Label*>* escaping_targets_; 127243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 127343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 127443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1275ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass TryCatchStatement FINAL : public TryStatement { 127643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1277b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org DECLARE_NODE_TYPE(TryCatchStatement) 1278b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1279b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Scope* scope() { return scope_; } 1280b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Variable* variable() { return variable_; } 1281b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Block* catch_block() const { return catch_block_; } 1282b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1283b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 12846d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TryCatchStatement(Zone* zone, 12856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org int index, 128604e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org Block* try_block, 12874f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org Scope* scope, 12884f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org Variable* variable, 1289a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Block* catch_block, 1290a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) 12916d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : TryStatement(zone, index, try_block, pos), 12924f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org scope_(scope), 12934f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org variable_(variable), 129443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen catch_block_(catch_block) { 129543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 129643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 129743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 12984f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org Scope* scope_; 12994f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org Variable* variable_; 130043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Block* catch_block_; 130143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 130243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 130343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1304ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass TryFinallyStatement FINAL : public TryStatement { 130543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1306f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(TryFinallyStatement) 130743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Block* finally_block() const { return finally_block_; } 1309b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1310b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1311a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org TryFinallyStatement( 13126d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Zone* zone, int index, Block* try_block, Block* finally_block, int pos) 13136d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : TryStatement(zone, index, try_block, pos), 1314b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org finally_block_(finally_block) { } 131543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 131643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 131743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Block* finally_block_; 131843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 131943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 132043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1321ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass DebuggerStatement FINAL : public Statement { 132243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1323f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(DebuggerStatement) 1324b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1325a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org BailoutId DebugBreakId() const { return debugger_id_; } 1326a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 1327b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1328a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org explicit DebuggerStatement(Zone* zone, int pos, IdGen* id_gen) 1329a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Statement(zone, pos), debugger_id_(id_gen->GetNextId()) {} 1330a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org 1331a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org private: 1332a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org const BailoutId debugger_id_; 133343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 133443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 133543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1336ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass EmptyStatement FINAL : public Statement { 133743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1338f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(EmptyStatement) 1339a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1340b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 13416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org explicit EmptyStatement(Zone* zone, int pos): Statement(zone, pos) {} 134243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 134343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 134443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1345ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Literal FINAL : public Expression { 134643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1347f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(Literal) 1348f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 1349ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsPropertyName() const OVERRIDE { 135008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value_->IsPropertyName(); 13510c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 13520c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 1353a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Handle<String> AsPropertyName() { 1354e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsPropertyName()); 135508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return Handle<String>::cast(value()); 135608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 135708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 135808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* AsRawPropertyName() { 1359e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(IsPropertyName()); 136008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value_->AsString(); 1361a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1362a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1363ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool ToBooleanIsTrue() const OVERRIDE { 136408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value()->BooleanValue(); 136532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 1366ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool ToBooleanIsFalse() const OVERRIDE { 136708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return !value()->BooleanValue(); 136832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 1369a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 137008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<Object> value() const { return value_->value(); } 137108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstValue* raw_value() const { return value_; } 1372b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1373bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Support for using Literal as a HashMap key. NOTE: Currently, this works 1374bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // only for string and number literals! 1375bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com uint32_t Hash() { return ToString()->Hash(); } 1376bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 1377bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com static bool Match(void* literal1, void* literal2) { 1378bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Handle<String> s1 = static_cast<Literal*>(literal1)->ToString(); 1379bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Handle<String> s2 = static_cast<Literal*>(literal2)->ToString(); 13802ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org return String::Equals(s1, s2); 1381bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 1382bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 1383471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId LiteralFeedbackId() const { return reuse(id()); } 1384471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1385b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1386a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal(Zone* zone, const AstValue* value, int position, IdGen* id_gen) 1387a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, position, id_gen), 13888fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org value_(value), 1389a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org isolate_(zone->isolate()) {} 139043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 139143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 1392bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Handle<String> ToString(); 1393bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 139408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstValue* value_; 13958fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org // TODO(dcarney): remove. this is only needed for Match and Hash. 13968fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org Isolate* isolate_; 139743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 139843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 139943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 140043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Base class for literals that needs space in the corresponding JSFunction. 140132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass MaterializedLiteral : public Expression { 140243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1403bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org virtual MaterializedLiteral* AsMaterializedLiteral() { return this; } 1404bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 140543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int literal_index() { return literal_index_; } 1406bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 14077ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org int depth() const { 14087ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org // only callable after initialization. 1409e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(depth_ >= 1); 14107ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org return depth_; 14117ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org } 14127ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org 1413b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1414a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org MaterializedLiteral(Zone* zone, int literal_index, int pos, IdGen* id_gen) 1415a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 1416b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org literal_index_(literal_index), 14177ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org is_simple_(false), 14187ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org depth_(0) {} 1419e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1420e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // A materialized literal is simple if the values consist of only 1421e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // constants and simple object and array literals. 1422e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org bool is_simple() const { return is_simple_; } 1423e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org void set_is_simple(bool is_simple) { is_simple_ = is_simple; } 1424e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org friend class CompileTimeValue; 1425e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 14267ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org void set_depth(int depth) { 1427e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(depth >= 1); 14287ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org depth_ = depth; 14297ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org } 14307ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org 1431e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Populate the constant properties/elements fixed array. 14327ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org void BuildConstants(Isolate* isolate); 1433e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org friend class ArrayLiteral; 1434e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org friend class ObjectLiteral; 1435e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1436e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // If the expression is a literal, return the literal value; 1437e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // if the expression is a materialized literal and is simple return a 1438e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // compile time value as encoded by CompileTimeValue::GetValue(). 1439e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Otherwise, return undefined literal as the placeholder 1440e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // in the object literal boilerplate. 1441e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<Object> GetBoilerplateValue(Expression* expression, Isolate* isolate); 1442bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org 144343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 144443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int literal_index_; 1445bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org bool is_simple_; 14467ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org int depth_; 144743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 144843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 144943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1450c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// Property is used for passing information 1451c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// about an object literal's properties from the parser 1452c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org// to the code generator. 1453ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ObjectLiteralProperty FINAL : public ZoneObject { 1454c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org public: 1455c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org enum Kind { 1456c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CONSTANT, // Property with constant value (compile time). 1457c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org COMPUTED, // Property with computed value (execution time). 1458c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org MATERIALIZED_LITERAL, // Property value is a materialized literal. 1459c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org GETTER, SETTER, // Property is an accessor function. 1460c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org PROTOTYPE // Property is __proto__. 1461c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org }; 1462c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 146308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ObjectLiteralProperty(Zone* zone, AstValueFactory* ast_value_factory, 1464a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Literal* key, Expression* value, bool is_static); 1465c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1466c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Literal* key() { return key_; } 1467c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Expression* value() { return value_; } 1468c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Kind kind() { return kind_; } 1469c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1470c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org // Type feedback information. 1471c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1472c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org bool IsMonomorphic() { return !receiver_type_.is_null(); } 1473c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Handle<Map> GetReceiverType() { return receiver_type_; } 1474c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1475c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org bool IsCompileTimeValue(); 1476c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1477c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void set_emit_store(bool emit_store); 1478c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org bool emit_store(); 1479c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1480c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org protected: 1481c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org template<class> friend class AstNodeFactory; 1482c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1483a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ObjectLiteralProperty(Zone* zone, bool is_getter, FunctionLiteral* value, 1484a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org bool is_static); 1485c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org void set_key(Literal* key) { key_ = key; } 1486c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1487c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org private: 1488c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Literal* key_; 1489c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Expression* value_; 1490c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Kind kind_; 1491c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org bool emit_store_; 1492a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org bool is_static_; 1493c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Handle<Map> receiver_type_; 1494c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org}; 1495c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 1496c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 149743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// An object literal has a boilerplate object that is used 149843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// for minimizing the work when constructing it at runtime. 1499ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ObjectLiteral FINAL : public MaterializedLiteral { 150043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1501c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org typedef ObjectLiteralProperty Property; 150243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1503f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(ObjectLiteral) 150443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 150543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<FixedArray> constant_properties() const { 150643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return constant_properties_; 150743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 150843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Property*>* properties() const { return properties_; } 1509f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org bool fast_elements() const { return fast_elements_; } 151057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org bool may_store_doubles() const { return may_store_doubles_; } 151157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org bool has_function() const { return has_function_; } 1512e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 1513e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Decide if a property should be in the object boilerplate. 1514e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org static bool IsBoilerplateProperty(Property* property); 1515e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1516e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Populate the constant properties fixed array. 15177ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org void BuildConstantProperties(Isolate* isolate); 1518e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 1519e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // Mark all computed expressions that are bound to a key that 1520e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // is shadowed by a later occurrence of the same key. For the 1521e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // marked expressions, no store code is emitted. 15227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org void CalculateEmitStore(Zone* zone); 1523e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 15247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Assemble bitfield of flags for the CreateObjectLiteral helper. 15257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int ComputeFlags() const { 15267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int flags = fast_elements() ? kFastElements : kNoFlags; 15277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org flags |= has_function() ? kHasFunction : kNoFlags; 15287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return flags; 15297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 15307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 1531ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org enum Flags { 1532ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org kNoFlags = 0, 1533ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org kFastElements = 1, 1534ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org kHasFunction = 1 << 1 1535ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org }; 1536ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 15372c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org struct Accessors: public ZoneObject { 15382c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org Accessors() : getter(NULL), setter(NULL) { } 15392c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org Expression* getter; 15402c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org Expression* setter; 15412c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org }; 15422c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org 1543b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1544a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ObjectLiteral(Zone* zone, ZoneList<Property*>* properties, int literal_index, 1545a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int boilerplate_properties, bool has_function, int pos, 1546a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 1547a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : MaterializedLiteral(zone, literal_index, pos, id_gen), 1548b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org properties_(properties), 1549e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org boilerplate_properties_(boilerplate_properties), 1550e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org fast_elements_(false), 1551e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org may_store_doubles_(false), 1552b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org has_function_(has_function) {} 1553b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 155443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 155543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<FixedArray> constant_properties_; 155643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Property*>* properties_; 1557e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org int boilerplate_properties_; 1558f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org bool fast_elements_; 155957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org bool may_store_doubles_; 1560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org bool has_function_; 156143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 156243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 156343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 156443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Node for capturing a regexp literal. 1565ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpLiteral FINAL : public MaterializedLiteral { 156643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1567b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org DECLARE_NODE_TYPE(RegExpLiteral) 1568b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 156908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<String> pattern() const { return pattern_->string(); } 157008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<String> flags() const { return flags_->string(); } 1571b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1572b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1573a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org RegExpLiteral(Zone* zone, const AstRawString* pattern, 1574a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org const AstRawString* flags, int literal_index, int pos, 1575a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 1576a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : MaterializedLiteral(zone, literal_index, pos, id_gen), 157743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pattern_(pattern), 15787ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org flags_(flags) { 15797ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org set_depth(1); 15807ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org } 158143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 158243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 158308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* pattern_; 158408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* flags_; 158543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 158643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1587a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 158843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// An array literal has a literals object that is used 158937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com// for minimizing the work when constructing it at runtime. 1590ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ArrayLiteral FINAL : public MaterializedLiteral { 159143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1592b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org DECLARE_NODE_TYPE(ArrayLiteral) 1593b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1594b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Handle<FixedArray> constant_elements() const { return constant_elements_; } 1595b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ZoneList<Expression*>* values() const { return values_; } 1596b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1597b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org // Return an AST id for an element that is used in simulate instructions. 1598471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId GetIdForElement(int i) { 1599471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return BailoutId(first_element_id_.ToInt() + i); 1600471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 1601b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1602e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Populate the constant elements fixed array. 16037ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org void BuildConstantElements(Isolate* isolate); 1604e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 16057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // Assemble bitfield of flags for the CreateArrayLiteral helper. 16067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int ComputeFlags() const { 16077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org int flags = depth() == 1 ? kShallowElements : kNoFlags; 16087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org flags |= ArrayLiteral::kDisableMementos; 16097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org return flags; 16107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } 16117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 161237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org enum Flags { 161337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org kNoFlags = 0, 161437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org kShallowElements = 1, 161537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org kDisableMementos = 1 << 1 161637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org }; 161737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org 1618b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1619a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ArrayLiteral(Zone* zone, ZoneList<Expression*>* values, int literal_index, 1620a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int pos, IdGen* id_gen) 1621a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : MaterializedLiteral(zone, literal_index, pos, id_gen), 1622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org values_(values), 1623a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org first_element_id_(id_gen->ReserveIdRange(values->length())) {} 162443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 162543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 16260c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org Handle<FixedArray> constant_elements_; 162743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Expression*>* values_; 1628471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId first_element_id_; 162943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 163043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 163143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1632ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass VariableProxy FINAL : public Expression, public FeedbackSlotInterface { 163343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1634f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(VariableProxy) 163543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1636ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsValidReferenceExpression() const OVERRIDE { 16374edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org return var_ == NULL ? true : var_->IsValidReference(); 163843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 16393e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 16404edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org bool IsArguments() const { return var_ != NULL && var_->is_arguments(); } 16413e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org 164208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<String> name() const { return name_->string(); } 164308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* raw_name() const { return name_; } 16444a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Variable* var() const { return var_; } 16454a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org bool is_this() const { return is_this_; } 1646bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Interface* interface() const { return interface_; } 1647bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 1648248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org bool is_assigned() const { return is_assigned_; } 1649248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org void set_is_assigned() { is_assigned_ = true; } 1650086aac6d6268988582d3b5b0aa8d24f61ddc1f1ffschneider@chromium.org 16518e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org // Bind this proxy to the variable var. Interfaces must match. 165243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void BindTo(Variable* var); 165343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16549d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; } 16559d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org virtual void SetFirstFeedbackSlot(int slot) { 16569d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org variable_feedback_slot_ = slot; 16579d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 16589d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 16599d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int VariableFeedbackSlot() { return variable_feedback_slot_; } 16609d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 166143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen protected: 1662a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org VariableProxy(Zone* zone, Variable* var, int position, IdGen* id_gen); 1663b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1664a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org VariableProxy(Zone* zone, const AstRawString* name, bool is_this, 1665a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Interface* interface, int position, IdGen* id_gen); 1666b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 166708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* name_; 166843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Variable* var_; // resolved variable, or NULL 166943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool is_this_; 1670248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org bool is_assigned_; 1671bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Interface* interface_; 16729d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int variable_feedback_slot_; 167343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 167443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 167543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1676ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Property FINAL : public Expression, public FeedbackSlotInterface { 167743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1678f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(Property) 167943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1680ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsValidReferenceExpression() const OVERRIDE { return true; } 168143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 168243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* obj() const { return obj_; } 168343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* key() const { return key_; } 168443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1685471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId LoadId() const { return load_id_; } 1686ea52b5f5c87edc97dc0632eec996ca2af071317culan@chromium.org 1687b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org bool IsStringAccess() const { return is_string_access_; } 16889e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 1689a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Type feedback information. 1690ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsMonomorphic() OVERRIDE { 1691113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org return receiver_types_.length() == 1; 1692113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org } 1693ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual SmallMapList* GetReceiverTypes() OVERRIDE { 169432cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org return &receiver_types_; 169532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 1696ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { 16977bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org return STANDARD_STORE; 16987bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org } 16998297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org bool IsUninitialized() { return !is_for_call_ && is_uninitialized_; } 1700c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org bool HasNoTypeInformation() { 1701a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return is_uninitialized_; 1702c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } 1703cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org void set_is_uninitialized(bool b) { is_uninitialized_ = b; } 1704cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org void set_is_string_access(bool b) { is_string_access_ = b; } 1705a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org void mark_for_call() { is_for_call_ = true; } 1706a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org bool IsForCall() { return is_for_call_; } 1707cc536058448cdb26fedf76ce62f2ce91480f2ae3yangguo@chromium.org 17085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org bool IsSuperAccess() { 17095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org return obj()->IsSuperReference(); 17105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 17115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 1712471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId PropertyFeedbackId() { return reuse(id()); } 1713a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 17149d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org virtual int ComputeFeedbackSlotCount() { return FLAG_vector_ics ? 1 : 0; } 17159d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org virtual void SetFirstFeedbackSlot(int slot) { 17169d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org property_feedback_slot_ = slot; 17179d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 17189d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 17199d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int PropertyFeedbackSlot() const { return property_feedback_slot_; } 17209d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 1721b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1722a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Property(Zone* zone, Expression* obj, Expression* key, int pos, IdGen* id_gen) 1723a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 1724b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org obj_(obj), 1725b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org key_(key), 1726a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org load_id_(id_gen->GetNextId()), 17279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org property_feedback_slot_(kInvalidFeedbackSlot), 1728a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org is_for_call_(false), 1729531dfe85209e15c3e292569c285a5be54910da7cjkummerow@chromium.org is_uninitialized_(false), 173051e852008f9f67dbdbae7a40b8aa07fe5c76b45fmachenbach@chromium.org is_string_access_(false) {} 1731b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 173243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 173343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* obj_; 173443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* key_; 1735471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId load_id_; 17369d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int property_feedback_slot_; 173743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1738ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org SmallMapList receiver_types_; 1739a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org bool is_for_call_ : 1; 1740531dfe85209e15c3e292569c285a5be54910da7cjkummerow@chromium.org bool is_uninitialized_ : 1; 1741b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org bool is_string_access_ : 1; 174243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 174343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 174443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1745ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Call FINAL : public Expression, public FeedbackSlotInterface { 174643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1747f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(Call) 174843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 174943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* expression() const { return expression_; } 175043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Expression*>* arguments() const { return arguments_; } 175143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1752471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org // Type feedback information. 1753a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org virtual int ComputeFeedbackSlotCount() { return 1; } 1754f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org virtual void SetFirstFeedbackSlot(int slot) { 1755f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org call_feedback_slot_ = slot; 1756f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1757f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1758f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org bool HasCallFeedbackSlot() const { 1759f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return call_feedback_slot_ != kInvalidFeedbackSlot; 1760f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1761f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int CallFeedbackSlot() const { return call_feedback_slot_; } 17626e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1763ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual SmallMapList* GetReceiverTypes() OVERRIDE { 1764a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org if (expression()->IsProperty()) { 1765a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return expression()->AsProperty()->GetReceiverTypes(); 1766a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org } 1767a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return NULL; 17686e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org } 17696e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 1770ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsMonomorphic() OVERRIDE { 1771a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org if (expression()->IsProperty()) { 1772a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return expression()->AsProperty()->IsMonomorphic(); 1773a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org } 1774a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return !target_.is_null(); 17756e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org } 17766e196bfaf0e555d0c835390bb6ebc0a74484491dulan@chromium.org 17777e6132b924829c353864933f29124419916db550machenbach@chromium.org bool global_call() const { 17787e6132b924829c353864933f29124419916db550machenbach@chromium.org VariableProxy* proxy = expression_->AsVariableProxy(); 17797e6132b924829c353864933f29124419916db550machenbach@chromium.org return proxy != NULL && proxy->var()->IsUnallocated(); 17807e6132b924829c353864933f29124419916db550machenbach@chromium.org } 17817e6132b924829c353864933f29124419916db550machenbach@chromium.org 17827e6132b924829c353864933f29124419916db550machenbach@chromium.org bool known_global_function() const { 17837e6132b924829c353864933f29124419916db550machenbach@chromium.org return global_call() && !target_.is_null(); 17847e6132b924829c353864933f29124419916db550machenbach@chromium.org } 17857e6132b924829c353864933f29124419916db550machenbach@chromium.org 1786a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Handle<JSFunction> target() { return target_; } 178799aa490225c81012235659d9a183226b286178c8yangguo@chromium.org 178841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Handle<Cell> cell() { return cell_; } 1789a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 17907e6132b924829c353864933f29124419916db550machenbach@chromium.org Handle<AllocationSite> allocation_site() { return allocation_site_; } 17917e6132b924829c353864933f29124419916db550machenbach@chromium.org 1792a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org void set_target(Handle<JSFunction> target) { target_ = target; } 17937e6132b924829c353864933f29124419916db550machenbach@chromium.org void set_allocation_site(Handle<AllocationSite> site) { 17947e6132b924829c353864933f29124419916db550machenbach@chromium.org allocation_site_ = site; 17957e6132b924829c353864933f29124419916db550machenbach@chromium.org } 17967dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org bool ComputeGlobalTarget(Handle<GlobalObject> global, LookupIterator* it); 1797a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1798471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId ReturnId() const { return return_id_; } 1799a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 180043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org enum CallType { 180143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org POSSIBLY_EVAL_CALL, 180243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org GLOBAL_CALL, 180343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org LOOKUP_SLOT_CALL, 180443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org PROPERTY_CALL, 180543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org OTHER_CALL 180643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org }; 180743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org 180843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org // Helpers to determine how to handle the call. 180943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org CallType GetCallType(Isolate* isolate) const; 1810a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org bool IsUsingCallFeedbackSlot(Isolate* isolate) const; 181143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org 1812a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifdef DEBUG 1813a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Used to assert that the FullCodeGenerator records the return site. 1814a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool return_is_recorded_; 1815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif 1816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1817b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1818a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Call(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1819a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int pos, IdGen* id_gen) 1820a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 1821b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org expression_(expression), 1822b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org arguments_(arguments), 1823f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org call_feedback_slot_(kInvalidFeedbackSlot), 1824a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return_id_(id_gen->GetNextId()) { 1825a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org if (expression->IsProperty()) { 1826a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org expression->AsProperty()->mark_for_call(); 1827a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org } 1828a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org } 1829b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 183043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 183143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* expression_; 183243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Expression*>* arguments_; 183343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1834a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Handle<JSFunction> target_; 183541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org Handle<Cell> cell_; 18367e6132b924829c353864933f29124419916db550machenbach@chromium.org Handle<AllocationSite> allocation_site_; 1837f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int call_feedback_slot_; 1838a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1839471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId return_id_; 1840ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}; 1841ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1842ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1843ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CallNew FINAL : public Expression, public FeedbackSlotInterface { 184443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1845b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org DECLARE_NODE_TYPE(CallNew) 1846b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1847b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* expression() const { return expression_; } 1848b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ZoneList<Expression*>* arguments() const { return arguments_; } 1849b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1850471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org // Type feedback information. 1851a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org virtual int ComputeFeedbackSlotCount() { 185269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org return FLAG_pretenuring_call_new ? 2 : 1; 185369f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org } 1854f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org virtual void SetFirstFeedbackSlot(int slot) { 1855f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org callnew_feedback_slot_ = slot; 1856f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 1857f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1858f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int CallNewFeedbackSlot() { 1859e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(callnew_feedback_slot_ != kInvalidFeedbackSlot); 1860f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org return callnew_feedback_slot_; 1861f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 186269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org int AllocationSiteFeedbackSlot() { 1863e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(callnew_feedback_slot_ != kInvalidFeedbackSlot); 1864e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(FLAG_pretenuring_call_new); 186569f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org return callnew_feedback_slot_ + 1; 186669f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org } 1867f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1868967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org void RecordTypeFeedback(TypeFeedbackOracle* oracle); 1869ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsMonomorphic() OVERRIDE { return is_monomorphic_; } 1870c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Handle<JSFunction> target() const { return target_; } 1871c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ElementsKind elements_kind() const { return elements_kind_; } 1872c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org Handle<AllocationSite> allocation_site() const { 1873c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org return allocation_site_; 18741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 1875967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org 1876f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org static int feedback_slots() { return 1; } 1877f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 1878471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId ReturnId() const { return return_id_; } 1879967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org 1880b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1881a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CallNew(Zone* zone, Expression* expression, ZoneList<Expression*>* arguments, 1882a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int pos, IdGen* id_gen) 1883a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 1884717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org expression_(expression), 1885717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org arguments_(arguments), 1886967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org is_monomorphic_(false), 1887c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org elements_kind_(GetInitialFastElementsKind()), 1888f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org callnew_feedback_slot_(kInvalidFeedbackSlot), 1889a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org return_id_(id_gen->GetNextId()) {} 1890a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1891a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 1892c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org Expression* expression_; 1893c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org ZoneList<Expression*>* arguments_; 1894967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org 1895967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org bool is_monomorphic_; 1896967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org Handle<JSFunction> target_; 1897c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ElementsKind elements_kind_; 1898c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org Handle<AllocationSite> allocation_site_; 1899f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int callnew_feedback_slot_; 1900967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org 1901471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId return_id_; 190243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 190443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 190543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The CallRuntime class does not represent any official JavaScript 190643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// language construct. Instead it is used to call a C or JS function 190743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// with a set of arguments. This is used from the builtins that are 190843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// implemented in JavaScript (see "v8natives.js"). 1909ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CallRuntime FINAL : public Expression, public FeedbackSlotInterface { 191043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1911b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org DECLARE_NODE_TYPE(CallRuntime) 1912b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 191308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<String> name() const { return raw_name_->string(); } 191408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* raw_name() const { return raw_name_; } 1915b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org const Runtime::Function* function() const { return function_; } 1916b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ZoneList<Expression*>* arguments() const { return arguments_; } 1917b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org bool is_jsruntime() const { return function_ == NULL; } 1918b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 19199d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org // Type feedback information. 19209d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org virtual int ComputeFeedbackSlotCount() { 19219d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org return (FLAG_vector_ics && is_jsruntime()) ? 1 : 0; 19229d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 19239d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org virtual void SetFirstFeedbackSlot(int slot) { 19249d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org callruntime_feedback_slot_ = slot; 19259d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 19269d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 19279d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int CallRuntimeFeedbackSlot() { 1928e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!is_jsruntime() || 19299d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org callruntime_feedback_slot_ != kInvalidFeedbackSlot); 19309d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org return callruntime_feedback_slot_; 19319d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 19329d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 1933471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId CallRuntimeFeedbackId() const { return reuse(id()); } 1934471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 1935b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1936a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CallRuntime(Zone* zone, const AstRawString* name, 1937ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const Runtime::Function* function, 1938a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ZoneList<Expression*>* arguments, int pos, IdGen* id_gen) 1939a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 194008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org raw_name_(name), 1941717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org function_(function), 1942a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org arguments_(arguments) {} 194343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 194443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 194508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* raw_name_; 1946ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org const Runtime::Function* function_; 194743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Expression*>* arguments_; 19489d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int callruntime_feedback_slot_; 194943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 195043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 195143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1952ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass UnaryOperation FINAL : public Expression { 195343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1954b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org DECLARE_NODE_TYPE(UnaryOperation) 1955b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1956b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Token::Value op() const { return op_; } 1957b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* expression() const { return expression_; } 1958b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1959471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId MaterializeTrueId() { return materialize_true_id_; } 1960471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId MaterializeFalseId() { return materialize_false_id_; } 1961471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 196232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org virtual void RecordToBooleanTypeFeedback( 1963ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org TypeFeedbackOracle* oracle) OVERRIDE; 1964b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1965b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 1966a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org UnaryOperation(Zone* zone, Token::Value op, Expression* expression, int pos, 1967a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IdGen* id_gen) 1968a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 1969c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org op_(op), 1970c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org expression_(expression), 1971a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org materialize_true_id_(id_gen->GetNextId()), 1972a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org materialize_false_id_(id_gen->GetNextId()) { 1973e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Token::IsUnaryOp(op)); 197443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 197543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 197643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 197743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Token::Value op_; 197843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* expression_; 1979c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 1980c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // For unary not (Token::NOT), the AST ids where true and false will 1981c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org // actually be materialized, respectively. 1982471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId materialize_true_id_; 1983471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId materialize_false_id_; 198443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 198543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 198643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1987ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass BinaryOperation FINAL : public Expression { 198843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 1989f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(BinaryOperation) 199043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1991ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool ResultOverwriteAllowed() const OVERRIDE; 199243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 199343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Token::Value op() const { return op_; } 199443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* left() const { return left_; } 199543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* right() const { return right_; } 19960f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org Handle<AllocationSite> allocation_site() const { return allocation_site_; } 19970f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org void set_allocation_site(Handle<AllocationSite> allocation_site) { 19980f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org allocation_site_ = allocation_site; 19990f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org } 200043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2001471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId RightId() const { return right_id_; } 2002471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 2003471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId BinaryOperationFeedbackId() const { return reuse(id()); } 20041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Maybe<int> fixed_right_arg() const { return fixed_right_arg_; } 20051510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org void set_fixed_right_arg(Maybe<int> arg) { fixed_right_arg_ = arg; } 20061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 200732cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org virtual void RecordToBooleanTypeFeedback( 2008ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org TypeFeedbackOracle* oracle) OVERRIDE; 20095f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 2010b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 2011a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org BinaryOperation(Zone* zone, Token::Value op, Expression* left, 2012a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Expression* right, int pos, IdGen* id_gen) 2013a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 2014304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org op_(op), 2015304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org left_(left), 2016304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org right_(right), 2017a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org right_id_(id_gen->GetNextId()) { 2018e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Token::IsBinaryOp(op)); 2019b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 2020b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 202143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 202243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Token::Value op_; 202343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* left_; 202443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* right_; 20250f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org Handle<AllocationSite> allocation_site_; 2026c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 20271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // TODO(rossberg): the fixed arg should probably be represented as a Constant 20281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // type for the RHS. 20291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Maybe<int> fixed_right_arg_; 2030c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 2031304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org // The short-circuit logical operations need an AST ID for their 20325f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org // right-hand subexpression. 2033471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId right_id_; 203443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 203543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 203643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2037ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CountOperation FINAL : public Expression { 203865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org public: 2039f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(CountOperation) 2040f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 204143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool is_prefix() const { return is_prefix_; } 204243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool is_postfix() const { return !is_prefix_; } 204365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 204444bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Token::Value op() const { return op_; } 204574e4e5ea6d118c13967c54fe92c7782ebdcb6eb7kasperl@chromium.org Token::Value binary_op() { 204665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org return (op() == Token::INC) ? Token::ADD : Token::SUB; 204774e4e5ea6d118c13967c54fe92c7782ebdcb6eb7kasperl@chromium.org } 204865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 204944bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Expression* expression() const { return expression_; } 205043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2051ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsMonomorphic() OVERRIDE { 2052113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org return receiver_types_.length() == 1; 2053113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org } 2054ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual SmallMapList* GetReceiverTypes() OVERRIDE { 205532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org return &receiver_types_; 205632cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 2057ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { 20587bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org return store_mode_; 20597bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org } 20606d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* type() const { return type_; } 20619f18d9111f676f2899d9aa2444130c985eb75395machenbach@chromium.org void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; } 20626d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void set_type(Type* type) { type_ = type; } 206344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org 2064471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId AssignmentId() const { return assignment_id_; } 2065471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 2066471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId CountBinOpFeedbackId() const { return count_id_; } 2067471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId CountStoreFeedbackId() const { return reuse(id()); } 20685f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org 2069b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 2070a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CountOperation(Zone* zone, Token::Value op, bool is_prefix, Expression* expr, 2071a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int pos, IdGen* id_gen) 2072a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 2073b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org op_(op), 2074b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org is_prefix_(is_prefix), 20757bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org store_mode_(STANDARD_STORE), 2076b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org expression_(expr), 2077a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org assignment_id_(id_gen->GetNextId()), 2078a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org count_id_(id_gen->GetNextId()) {} 2079b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 208043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 208144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Token::Value op_; 20827bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org bool is_prefix_ : 1; 2083e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, 2084e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // must have extra bit. 20856d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* type_; 2086c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 208744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org Expression* expression_; 2088471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId assignment_id_; 2089471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const TypeFeedbackId count_id_; 2090ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org SmallMapList receiver_types_; 209143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 209243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 209343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2094ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CompareOperation FINAL : public Expression { 2095b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public: 2096f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(CompareOperation) 209743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 209843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Token::Value op() const { return op_; } 209943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* left() const { return left_; } 210043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* right() const { return right_; } 210143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Type feedback information. 2103471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId CompareOperationFeedbackId() const { return reuse(id()); } 21046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* combined_type() const { return combined_type_; } 21056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void set_combined_type(Type* type) { combined_type_ = type; } 2106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 210704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org // Match special cases. 210804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org bool IsLiteralCompareTypeof(Expression** expr, Handle<String>* check); 210996a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org bool IsLiteralCompareUndefined(Expression** expr, Isolate* isolate); 2110c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com bool IsLiteralCompareNull(Expression** expr); 211104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 2112b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 2113a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CompareOperation(Zone* zone, Token::Value op, Expression* left, 2114a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Expression* right, int pos, IdGen* id_gen) 2115a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 2116b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org op_(op), 2117b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org left_(left), 2118b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org right_(right), 21196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org combined_type_(Type::None(zone)) { 2120e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Token::IsCompareOp(op)); 2121b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 2122b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 212343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 212443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Token::Value op_; 212543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* left_; 212643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* right_; 2127c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 21286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Type* combined_type_; 212965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org}; 213065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 213165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 2132ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Conditional FINAL : public Expression { 213343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2134b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org DECLARE_NODE_TYPE(Conditional) 2135b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 2136b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* condition() const { return condition_; } 2137b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* then_expression() const { return then_expression_; } 2138b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* else_expression() const { return else_expression_; } 2139b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 2140471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId ThenId() const { return then_id_; } 2141471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId ElseId() const { return else_id_; } 2142b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 2143b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 2144a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Conditional(Zone* zone, Expression* condition, Expression* then_expression, 2145a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Expression* else_expression, int position, IdGen* id_gen) 2146a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, position, id_gen), 2147717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org condition_(condition), 214843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen then_expression_(then_expression), 21492356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org else_expression_(else_expression), 2150a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org then_id_(id_gen->GetNextId()), 2151a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org else_id_(id_gen->GetNextId()) {} 21522356e6fbe66ac3aa027b61cb43a3c3619b3c3a5evegorov@chromium.org 215343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 215443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* condition_; 215543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* then_expression_; 215643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* else_expression_; 2157471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId then_id_; 2158471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId else_id_; 215943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 216043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 216143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2162ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Assignment FINAL : public Expression { 216343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2164f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(Assignment) 216543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2166f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org Assignment* AsSimpleAssignment() { return !is_compound() ? this : NULL; } 2167f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 216843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Token::Value binary_op() const; 216943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 217043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Token::Value op() const { return op_; } 217143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* target() const { return target_; } 217243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* value() const { return value_; } 2173a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org BinaryOperation* binary_operation() const { return binary_operation_; } 2174a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 217513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org // This check relies on the definition order of token in token.h. 217613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org bool is_compound() const { return op() > Token::ASSIGN; } 217743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2178471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org BailoutId AssignmentId() const { return assignment_id_; } 2179471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 2180a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Type feedback information. 2181471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org TypeFeedbackId AssignmentFeedbackId() { return reuse(id()); } 2182ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsMonomorphic() OVERRIDE { 2183113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org return receiver_types_.length() == 1; 2184113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org } 21851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool IsUninitialized() { return is_uninitialized_; } 2186c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org bool HasNoTypeInformation() { 2187a03ba1e53fa6a04b8e56747536f226380bb6269bmachenbach@chromium.org return is_uninitialized_; 2188c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org } 2189ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual SmallMapList* GetReceiverTypes() OVERRIDE { 219032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org return &receiver_types_; 219132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org } 2192ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual KeyedAccessStoreMode GetStoreMode() OVERRIDE { 21937bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org return store_mode_; 21947bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org } 2195ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org void set_is_uninitialized(bool b) { is_uninitialized_ = b; } 2196ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org void set_store_mode(KeyedAccessStoreMode mode) { store_mode_ = mode; } 2197a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 2198b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 2199a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Assignment(Zone* zone, Token::Value op, Expression* target, Expression* value, 2200a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int pos, IdGen* id_gen); 2201b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 2202b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org template<class Visitor> 22036d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void Init(Zone* zone, AstNodeFactory<Visitor>* factory) { 2204e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Token::IsAssignmentOp(op_)); 2205b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org if (is_compound()) { 2206a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org binary_operation_ = factory->NewBinaryOperation( 2207a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org binary_op(), target_, value_, position() + 1); 2208b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 2209b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 2210b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 221143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 221243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Token::Value op_; 221343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* target_; 221443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* value_; 2215a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org BinaryOperation* binary_operation_; 2216471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org const BailoutId assignment_id_; 2217a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 22181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org bool is_uninitialized_ : 1; 2219e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org KeyedAccessStoreMode store_mode_ : 5; // Windows treats as signed, 2220e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // must have extra bit. 2221ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org SmallMapList receiver_types_; 222243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 222343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 222443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2225ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Yield FINAL : public Expression, public FeedbackSlotInterface { 2226f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org public: 2227f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org DECLARE_NODE_TYPE(Yield) 2228f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 222977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org enum Kind { 2230ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org kInitial, // The initial yield that returns the unboxed generator object. 2231ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org kSuspend, // A normal yield: { value: EXPRESSION, done: false } 2232ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org kDelegating, // A yield*. 2233ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org kFinal // A return: { value: EXPRESSION, done: true } 223477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org }; 223577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org 2236e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Expression* generator_object() const { return generator_object_; } 2237f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org Expression* expression() const { return expression_; } 223877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org Kind yield_kind() const { return yield_kind_; } 2239f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 22404e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // Delegating yield surrounds the "yield" in a "try/catch". This index 22414e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // locates the catch handler in the handler table, and is equivalent to 22424e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org // TryCatchStatement::index(). 22434e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org int index() const { 2244ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org DCHECK_EQ(kDelegating, yield_kind()); 22454e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return index_; 22464e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 22474e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org void set_index(int index) { 2248ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org DCHECK_EQ(kDelegating, yield_kind()); 22494e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org index_ = index; 22504e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 22514e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org 22529d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org // Type feedback information. 22539d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org virtual int ComputeFeedbackSlotCount() { 2254ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org return (FLAG_vector_ics && yield_kind() == kDelegating) ? 3 : 0; 22559d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 22569d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org virtual void SetFirstFeedbackSlot(int slot) { 22579d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org yield_first_feedback_slot_ = slot; 22589d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 22599d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 22609d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int KeyedLoadFeedbackSlot() { 2261e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot); 22629d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org return yield_first_feedback_slot_; 22639d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 22649d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 22659d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int DoneFeedbackSlot() { 2266e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot); 22679d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org return yield_first_feedback_slot_ + 1; 22689d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 22699d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 22709d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int ValueFeedbackSlot() { 2271e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(yield_first_feedback_slot_ != kInvalidFeedbackSlot); 22729d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org return yield_first_feedback_slot_ + 2; 22739d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org } 22749d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org 2275f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org protected: 2276a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Yield(Zone* zone, Expression* generator_object, Expression* expression, 2277a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Kind yield_kind, int pos, IdGen* id_gen) 2278a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), 2279e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org generator_object_(generator_object), 2280f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org expression_(expression), 228177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org yield_kind_(yield_kind), 22829d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org index_(-1), 2283a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org yield_first_feedback_slot_(kInvalidFeedbackSlot) {} 2284f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 2285f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org private: 2286e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Expression* generator_object_; 2287f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org Expression* expression_; 228877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org Kind yield_kind_; 22894e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org int index_; 22909d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int yield_first_feedback_slot_; 2291f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}; 2292f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 2293f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 2294ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass Throw FINAL : public Expression { 229543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2296f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(Throw) 2297f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 229843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* exception() const { return exception_; } 2299b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 2300b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 2301a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Throw(Zone* zone, Expression* exception, int pos, IdGen* id_gen) 2302a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), exception_(exception) {} 230343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 230443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 230543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* exception_; 230643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 230743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 230843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2309ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass FunctionLiteral FINAL : public Expression { 231043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2311dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org enum FunctionType { 23127c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org ANONYMOUS_EXPRESSION, 23137c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org NAMED_EXPRESSION, 23147c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org DECLARATION 23157c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org }; 23167c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 231756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org enum ParameterFlag { 231856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org kNoDuplicateParameters = 0, 231956454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org kHasDuplicateParameters = 1 232056454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org }; 232156454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 232256454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org enum IsFunctionFlag { 232356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org kGlobalOrEval, 232456454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org kIsFunction 232556454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org }; 232656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 2327471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org enum IsParenthesizedFlag { 2328471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org kIsParenthesized, 2329471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org kNotParenthesized 2330471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org }; 2331471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 2332dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org enum ArityRestriction { 2333dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org NORMAL_ARITY, 2334dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org GETTER_ARITY, 2335dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org SETTER_ARITY 2336dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org }; 2337dc9f731404454341ef693636fc6e2fc4bc50888eulan@chromium.org 2338f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(FunctionLiteral) 233943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 234008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<String> name() const { return raw_name_->string(); } 234108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* raw_name() const { return raw_name_; } 23424a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org Scope* scope() const { return scope_; } 23434a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org ZoneList<Statement*>* body() const { return body_; } 234443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void set_function_token_position(int pos) { function_token_position_ = pos; } 234543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int function_token_position() const { return function_token_position_; } 2346394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com int start_position() const; 2347394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com int end_position() const; 234856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org int SourceSize() const { return end_position() - start_position(); } 2349c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org bool is_expression() const { return IsExpression::decode(bitfield_); } 2350c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org bool is_anonymous() const { return IsAnonymous::decode(bitfield_); } 2351486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org StrictMode strict_mode() const; 235243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 235343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int materialized_literal_count() { return materialized_literal_count_; } 235443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int expected_property_count() { return expected_property_count_; } 235504e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org int handler_count() { return handler_count_; } 2356c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org int parameter_count() { return parameter_count_; } 235743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 235843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool AllowsLazyCompilation(); 23595a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org bool AllowsLazyCompilationWithoutContext(); 236043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23614610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org void InitializeSharedInfo(Handle<Code> code); 23624610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org 2363b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org Handle<String> debug_name() const { 236408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (raw_name_ != NULL && !raw_name_->IsEmpty()) { 236508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return raw_name_->string(); 236608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 2367b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org return inferred_name(); 2368b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org } 2369b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 237008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<String> inferred_name() const { 237108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (!inferred_name_.is_null()) { 2372e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(raw_inferred_name_ == NULL); 237308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return inferred_name_; 237408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 237508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (raw_inferred_name_ != NULL) { 237608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return raw_inferred_name_->string(); 237708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 237808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org UNREACHABLE(); 237908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return Handle<String>(); 238008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 238108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 238208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // Only one of {set_inferred_name, set_raw_inferred_name} should be called. 2383d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org void set_inferred_name(Handle<String> inferred_name) { 2384e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!inferred_name.is_null()); 2385d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org inferred_name_ = inferred_name; 2386e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(raw_inferred_name_== NULL || raw_inferred_name_->IsEmpty()); 238708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org raw_inferred_name_ = NULL; 238808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 238908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 239008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org void set_raw_inferred_name(const AstString* raw_inferred_name) { 2391e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(raw_inferred_name != NULL); 239208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org raw_inferred_name_ = raw_inferred_name; 2393e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(inferred_name_.is_null()); 239408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org inferred_name_ = Handle<String>(); 2395d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org } 2396d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org 23974610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org // shared_info may be null if it's not cached in full code. 23984610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org Handle<SharedFunctionInfo> shared_info() { return shared_info_; } 23994610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org 2400c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org bool pretenure() { return Pretenure::decode(bitfield_); } 2401c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org void set_pretenure() { bitfield_ |= Pretenure::encode(true); } 240221b5e95db1c650dfc2ba8e11d010bb01293f85c5vegorov@chromium.org 2403c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org bool has_duplicate_parameters() { 2404c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return HasDuplicateParameters::decode(bitfield_); 2405c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org } 24067b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org 240756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org bool is_function() { return IsFunction::decode(bitfield_) == kIsFunction; } 240856454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org 2409de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // This is used as a heuristic on when to eagerly compile a function 2410de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // literal. We consider the following constructs as hints that the 2411de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // function will be called immediately: 2412de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // - (function() { ... })(); 2413de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org // - var x = function() { ... }(); 2414471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org bool is_parenthesized() { 2415471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org return IsParenthesized::decode(bitfield_) == kIsParenthesized; 2416471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org } 2417de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org void set_parenthesized() { 2418de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org bitfield_ = IsParenthesized::update(bitfield_, kIsParenthesized); 2419de64f721c489207a7b9018406d39c7fb04bb9424verwaest@chromium.org } 2420471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org 24212c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org FunctionKind kind() { return FunctionKindBits::decode(bitfield_); } 24222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org bool is_arrow() { 24232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return IsArrowFunction(FunctionKindBits::decode(bitfield_)); 24242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } 24252c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org bool is_generator() { 24262c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return IsGeneratorFunction(FunctionKindBits::decode(bitfield_)); 24272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } 24282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org bool is_concise_method() { 24292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org return IsConciseMethod(FunctionKindBits::decode(bitfield_)); 24302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org } 2431f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 2432b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int ast_node_count() { return ast_properties_.node_count(); } 2433b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org AstProperties::Flags* flags() { return ast_properties_.flags(); } 2434b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org void set_ast_properties(AstProperties* ast_properties) { 2435b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ast_properties_ = *ast_properties; 2436b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 2437f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org int slot_count() { 2438a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org return ast_properties_.feedback_slots(); 2439f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 24402c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org bool dont_optimize() { return dont_optimize_reason_ != kNoReason; } 24412c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org BailoutReason dont_optimize_reason() { return dont_optimize_reason_; } 24422c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org void set_dont_optimize_reason(BailoutReason reason) { 24432c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org dont_optimize_reason_ = reason; 24442c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org } 24452c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org 2446b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 24479d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org FunctionLiteral(Zone* zone, const AstRawString* name, 24489d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org AstValueFactory* ast_value_factory, Scope* scope, 24499d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org ZoneList<Statement*>* body, int materialized_literal_count, 24509d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int expected_property_count, int handler_count, 24519d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int parameter_count, FunctionType function_type, 245256454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org ParameterFlag has_duplicate_parameters, 2453471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org IsFunctionFlag is_function, 24542c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org IsParenthesizedFlag is_parenthesized, FunctionKind kind, 2455a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int position, IdGen* id_gen) 2456a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, position, id_gen), 245708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org raw_name_(name), 2458b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org scope_(scope), 2459b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org body_(body), 246008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org raw_inferred_name_(ast_value_factory->empty_string()), 24612c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org dont_optimize_reason_(kNoReason), 2462b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org materialized_literal_count_(materialized_literal_count), 2463b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org expected_property_count_(expected_property_count), 2464b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org handler_count_(handler_count), 2465b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org parameter_count_(parameter_count), 2466b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org function_token_position_(RelocInfo::kNoPosition) { 24679d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org bitfield_ = IsExpression::encode(function_type != DECLARATION) | 24689d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org IsAnonymous::encode(function_type == ANONYMOUS_EXPRESSION) | 24699d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org Pretenure::encode(false) | 24709d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org HasDuplicateParameters::encode(has_duplicate_parameters) | 24719d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org IsFunction::encode(is_function) | 24729d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org IsParenthesized::encode(is_parenthesized) | 24732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org FunctionKindBits::encode(kind); 24742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org DCHECK(IsValidFunctionKind(kind)); 2475b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 2476b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 247743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 247808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* raw_name_; 247943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Handle<String> name_; 24804610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org Handle<SharedFunctionInfo> shared_info_; 248143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Scope* scope_; 248243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ZoneList<Statement*>* body_; 248308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstString* raw_inferred_name_; 2484c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org Handle<String> inferred_name_; 2485b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org AstProperties ast_properties_; 24862c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org BailoutReason dont_optimize_reason_; 2487c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 248843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int materialized_literal_count_; 248943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int expected_property_count_; 249004e4f1e9e1291ac270e1cb7d8384b2af2fd2d685jkummerow@chromium.org int handler_count_; 2491c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org int parameter_count_; 249243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int function_token_position_; 2493c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 2494c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org unsigned bitfield_; 24952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class IsExpression : public BitField<bool, 0, 1> {}; 24962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class IsAnonymous : public BitField<bool, 1, 1> {}; 24972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class Pretenure : public BitField<bool, 2, 1> {}; 24982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class HasDuplicateParameters : public BitField<ParameterFlag, 3, 1> {}; 24992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class IsFunction : public BitField<IsFunctionFlag, 4, 1> {}; 25002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class IsParenthesized : public BitField<IsParenthesizedFlag, 5, 1> {}; 25012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org class FunctionKindBits : public BitField<FunctionKind, 6, 3> {}; 250243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 250343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 250443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2505a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgclass ClassLiteral FINAL : public Expression { 2506a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org public: 2507a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org typedef ObjectLiteralProperty Property; 2508a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2509a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org DECLARE_NODE_TYPE(ClassLiteral) 2510a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2511a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Handle<String> name() const { return raw_name_->string(); } 2512a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org const AstRawString* raw_name() const { return raw_name_; } 2513a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Expression* extends() const { return extends_; } 2514a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Expression* constructor() const { return constructor_; } 2515a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ZoneList<Property*>* properties() const { return properties_; } 2516a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2517a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org protected: 2518a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ClassLiteral(Zone* zone, const AstRawString* name, Expression* extends, 2519a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Expression* constructor, ZoneList<Property*>* properties, 2520a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int position, IdGen* id_gen) 2521a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org : Expression(zone, position, id_gen), 2522a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org raw_name_(name), 2523a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org extends_(extends), 2524a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org constructor_(constructor), 2525a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org properties_(properties) {} 2526a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2527a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org private: 2528a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org const AstRawString* raw_name_; 2529a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Expression* extends_; 2530a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Expression* constructor_; 2531a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ZoneList<Property*>* properties_; 2532a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}; 2533a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2534a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 2535ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass NativeFunctionLiteral FINAL : public Expression { 253643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2537fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org DECLARE_NODE_TYPE(NativeFunctionLiteral) 2538f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 253908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<String> name() const { return name_->string(); } 2540fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org v8::Extension* extension() const { return extension_; } 2541b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 2542b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 254308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org NativeFunctionLiteral(Zone* zone, const AstRawString* name, 2544a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org v8::Extension* extension, int pos, IdGen* id_gen) 2545a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), name_(name), extension_(extension) {} 254643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 254743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 254808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* name_; 2549fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org v8::Extension* extension_; 255043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 255143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 255243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2553ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass ThisFunction FINAL : public Expression { 255443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2555f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org DECLARE_NODE_TYPE(ThisFunction) 2556b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 2557b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org protected: 2558a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ThisFunction(Zone* zone, int pos, IdGen* id_gen) 2559a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen) {} 2560a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2561a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 25625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 2563ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SuperReference FINAL : public Expression { 25645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org public: 25655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org DECLARE_NODE_TYPE(SuperReference) 25665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 25675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org VariableProxy* this_var() const { return this_var_; } 25685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 25695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org TypeFeedbackId HomeObjectFeedbackId() { return reuse(id()); } 25705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 25715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org protected: 2572a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org SuperReference(Zone* zone, VariableProxy* this_var, int pos, IdGen* id_gen) 2573a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : Expression(zone, pos, id_gen), this_var_(this_var) { 2574a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org DCHECK(this_var->is_this()); 25755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 25765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 25775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org VariableProxy* this_var_; 25785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}; 25795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 25805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 258165a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org#undef DECLARE_NODE_TYPE 258265a89c29ac6da09f5726f48f68eae9587b0e562aulan@chromium.org 2583a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2584a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// ---------------------------------------------------------------------------- 2585a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Regular expressions 2586a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2587a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 25883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgclass RegExpVisitor BASE_EMBEDDED { 25893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org public: 25903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org virtual ~RegExpVisitor() { } 25913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#define MAKE_CASE(Name) \ 25923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org virtual void* Visit##Name(RegExp##Name*, void* data) = 0; 25933291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE) 25943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#undef MAKE_CASE 25953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}; 25963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 25973291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 259832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass RegExpTree : public ZoneObject { 2599a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 260037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com static const int kInfinity = kMaxInt; 260132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org virtual ~RegExpTree() {} 2602a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) = 0; 2603a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 26048bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org RegExpNode* on_success) = 0; 2605a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual bool IsTextElement() { return false; } 26064a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org virtual bool IsAnchoredAtStart() { return false; } 26074a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org virtual bool IsAnchoredAtEnd() { return false; } 260837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com virtual int min_match() = 0; 260937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com virtual int max_match() = 0; 26103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // Returns the interval of registers used for captures within this 26113291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org // expression. 26123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org virtual Interval CaptureRegisters() { return Interval::Empty(); } 26137028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org virtual void AppendToText(RegExpText* text, Zone* zone); 2614f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org OStream& Print(OStream& os, Zone* zone); // NOLINT 2615a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAKE_ASTYPE(Name) \ 2616a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExp##Name* As##Name(); \ 2617a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual bool Is##Name(); 2618a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org FOR_EACH_REG_EXP_TREE_TYPE(MAKE_ASTYPE) 2619a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_ASTYPE 2620a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2621a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2622a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2623ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpDisjunction FINAL : public RegExpTree { 2624a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 262537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com explicit RegExpDisjunction(ZoneList<RegExpTree*>* alternatives); 2626ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2627a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2628ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2629ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpDisjunction* AsDisjunction() OVERRIDE; 2630ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual Interval CaptureRegisters() OVERRIDE; 2631ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsDisjunction() OVERRIDE; 2632ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtStart() OVERRIDE; 2633ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtEnd() OVERRIDE; 2634ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return min_match_; } 2635ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return max_match_; } 2636a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ZoneList<RegExpTree*>* alternatives() { return alternatives_; } 2637a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 2638a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ZoneList<RegExpTree*>* alternatives_; 263937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int min_match_; 264037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int max_match_; 2641a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2642a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2643a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2644ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpAlternative FINAL : public RegExpTree { 2645a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 264637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com explicit RegExpAlternative(ZoneList<RegExpTree*>* nodes); 2647ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2648a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2649ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2650ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpAlternative* AsAlternative() OVERRIDE; 2651ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual Interval CaptureRegisters() OVERRIDE; 2652ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAlternative() OVERRIDE; 2653ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtStart() OVERRIDE; 2654ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtEnd() OVERRIDE; 2655ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return min_match_; } 2656ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return max_match_; } 2657a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ZoneList<RegExpTree*>* nodes() { return nodes_; } 2658a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 2659a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ZoneList<RegExpTree*>* nodes_; 266037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int min_match_; 266137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int max_match_; 2662a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2663a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2664a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2665ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpAssertion FINAL : public RegExpTree { 2666a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 2667dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org enum AssertionType { 2668a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org START_OF_LINE, 2669a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org START_OF_INPUT, 2670a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org END_OF_LINE, 2671a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org END_OF_INPUT, 2672a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BOUNDARY, 2673a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org NON_BOUNDARY 2674a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org }; 2675dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org explicit RegExpAssertion(AssertionType type) : assertion_type_(type) { } 2676ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2677a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2678ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2679ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpAssertion* AsAssertion() OVERRIDE; 2680ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAssertion() OVERRIDE; 2681ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtStart() OVERRIDE; 2682ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtEnd() OVERRIDE; 2683ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return 0; } 2684ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return 0; } 2685dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org AssertionType assertion_type() { return assertion_type_; } 2686a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 2687dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org AssertionType assertion_type_; 2688a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2689a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2690a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2691ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass CharacterSet FINAL BASE_EMBEDDED { 269237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com public: 269337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com explicit CharacterSet(uc16 standard_set_type) 269437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com : ranges_(NULL), 269537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com standard_set_type_(standard_set_type) {} 269637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com explicit CharacterSet(ZoneList<CharacterRange>* ranges) 269737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com : ranges_(ranges), 269837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com standard_set_type_(0) {} 26997028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org ZoneList<CharacterRange>* ranges(Zone* zone); 270037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uc16 standard_set_type() { return standard_set_type_; } 270137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com void set_standard_set_type(uc16 special_set_type) { 270237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com standard_set_type_ = special_set_type; 270337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 270437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bool is_standard() { return standard_set_type_ != 0; } 27050c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org void Canonicalize(); 270637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com private: 270737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com ZoneList<CharacterRange>* ranges_; 270837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // If non-zero, the value represents a standard set (e.g., all whitespace 270937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // characters) without having to expand the ranges. 271037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uc16 standard_set_type_; 271137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}; 271237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 271337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 2714ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpCharacterClass FINAL : public RegExpTree { 2715a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 2716a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpCharacterClass(ZoneList<CharacterRange>* ranges, bool is_negated) 271737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com : set_(ranges), 2718a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org is_negated_(is_negated) { } 2719a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org explicit RegExpCharacterClass(uc16 type) 272037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com : set_(type), 272137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com is_negated_(false) { } 2722ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2723a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2724ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2725ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpCharacterClass* AsCharacterClass() OVERRIDE; 2726ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsCharacterClass() OVERRIDE; 2727ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsTextElement() OVERRIDE { return true; } 2728ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return 1; } 2729ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return 1; } 2730ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE; 273137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com CharacterSet character_set() { return set_; } 273237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // TODO(lrn): Remove need for complex version if is_standard that 273337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // recognizes a mangled standard set and just do { return set_.is_special(); } 27347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org bool is_standard(Zone* zone); 273537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // Returns a value representing the standard character set if is_standard() 273637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // returns true. 273737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // Currently used values are: 273837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // s : unicode whitespace 273937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // S : unicode non-whitespace 274037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // w : ASCII word character (digit, letter, underscore) 274137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // W : non-ASCII word character 274237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // d : ASCII digit 274337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // D : non-ASCII digit 2744ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org // . : non-unicode non-newline 274537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com // * : All characters 274637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uc16 standard_type() { return set_.standard_set_type(); } 27477028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org ZoneList<CharacterRange>* ranges(Zone* zone) { return set_.ranges(zone); } 2748a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool is_negated() { return is_negated_; } 2749e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 2750a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 275137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com CharacterSet set_; 2752a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool is_negated_; 2753a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2754a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2755a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2756ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpAtom FINAL : public RegExpTree { 2757a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 2758a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org explicit RegExpAtom(Vector<const uc16> data) : data_(data) { } 2759ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2760a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2761ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2762ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpAtom* AsAtom() OVERRIDE; 2763ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAtom() OVERRIDE; 2764ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsTextElement() OVERRIDE { return true; } 2765ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return data_.length(); } 2766ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return data_.length(); } 2767ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE; 2768a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Vector<const uc16> data() { return data_; } 276937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int length() { return data_.length(); } 2770a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 2771a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Vector<const uc16> data_; 2772a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2773a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2774a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2775ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpText FINAL : public RegExpTree { 277637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com public: 27777028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org explicit RegExpText(Zone* zone) : elements_(2, zone), length_(0) {} 2778ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 277937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2780ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2781ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpText* AsText() OVERRIDE; 2782ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsText() OVERRIDE; 2783ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsTextElement() OVERRIDE { return true; } 2784ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return length_; } 2785ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return length_; } 2786ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void AppendToText(RegExpText* text, Zone* zone) OVERRIDE; 27877028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org void AddElement(TextElement elm, Zone* zone) { 27887028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org elements_.Add(elm, zone); 278937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com length_ += elm.length(); 27903cdd9e13bac71e7c5b63da6962f8d30f6622db14kmillikin@chromium.org } 279137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com ZoneList<TextElement>* elements() { return &elements_; } 279237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com private: 279337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com ZoneList<TextElement> elements_; 279437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int length_; 279537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}; 279637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 279737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 2798ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpQuantifier FINAL : public RegExpTree { 2799a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 2800dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org enum QuantifierType { GREEDY, NON_GREEDY, POSSESSIVE }; 2801dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org RegExpQuantifier(int min, int max, QuantifierType type, RegExpTree* body) 28020c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org : body_(body), 28030c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org min_(min), 2804a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org max_(max), 28050c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org min_match_(min * body->min_match()), 2806dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org quantifier_type_(type) { 280737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (max > 0 && body->max_match() > kInfinity / max) { 280837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com max_match_ = kInfinity; 280937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else { 281037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com max_match_ = max * body->max_match(); 281137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 281237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 2813ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2814a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2815ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2816a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org static RegExpNode* ToNode(int min, 2817a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int max, 2818a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool is_greedy, 2819a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpTree* body, 2820a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpCompiler* compiler, 2821245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org RegExpNode* on_success, 2822245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org bool not_at_start = false); 2823ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpQuantifier* AsQuantifier() OVERRIDE; 2824ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual Interval CaptureRegisters() OVERRIDE; 2825ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsQuantifier() OVERRIDE; 2826ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return min_match_; } 2827ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return max_match_; } 2828a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int min() { return min_; } 2829a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int max() { return max_; } 2830dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org bool is_possessive() { return quantifier_type_ == POSSESSIVE; } 2831dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org bool is_non_greedy() { return quantifier_type_ == NON_GREEDY; } 2832dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org bool is_greedy() { return quantifier_type_ == GREEDY; } 2833a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpTree* body() { return body_; } 2834e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 2835a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 28360c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org RegExpTree* body_; 2837a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int min_; 2838a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int max_; 283937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int min_match_; 284037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int max_match_; 2841dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org QuantifierType quantifier_type_; 2842a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2843a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2844a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2845ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpCapture FINAL : public RegExpTree { 2846a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 2847a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org explicit RegExpCapture(RegExpTree* body, int index) 284886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org : body_(body), index_(index) { } 2849ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2850a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2851ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2852a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org static RegExpNode* ToNode(RegExpTree* body, 2853a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int index, 2854a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpCompiler* compiler, 28558bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org RegExpNode* on_success); 2856ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpCapture* AsCapture() OVERRIDE; 2857ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtStart() OVERRIDE; 2858ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtEnd() OVERRIDE; 2859ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual Interval CaptureRegisters() OVERRIDE; 2860ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsCapture() OVERRIDE; 2861ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return body_->min_match(); } 2862ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return body_->max_match(); } 2863a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpTree* body() { return body_; } 2864a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int index() { return index_; } 2865a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org static int StartRegister(int index) { return index * 2; } 2866a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org static int EndRegister(int index) { return index * 2 + 1; } 2867e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 2868a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 2869a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpTree* body_; 2870a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int index_; 2871a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2872a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2873a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2874ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpLookahead FINAL : public RegExpTree { 2875a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 2876ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org RegExpLookahead(RegExpTree* body, 2877ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org bool is_positive, 2878ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int capture_count, 2879ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int capture_from) 2880a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org : body_(body), 2881ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org is_positive_(is_positive), 2882ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org capture_count_(capture_count), 2883ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org capture_from_(capture_from) { } 2884ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 2885ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2886a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2887ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2888ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpLookahead* AsLookahead() OVERRIDE; 2889ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual Interval CaptureRegisters() OVERRIDE; 2890ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsLookahead() OVERRIDE; 2891ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsAnchoredAtStart() OVERRIDE; 2892ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return 0; } 2893ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return 0; } 2894a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpTree* body() { return body_; } 2895a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool is_positive() { return is_positive_; } 2896ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int capture_count() { return capture_count_; } 2897ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int capture_from() { return capture_from_; } 2898e297f5973a8a9ff0d9945da3f1e2d8a6230c294djkummerow@chromium.org 2899a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 2900a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpTree* body_; 2901a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool is_positive_; 2902ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int capture_count_; 2903ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int capture_from_; 2904a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2905a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2906a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2907ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpBackReference FINAL : public RegExpTree { 2908a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 2909a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org explicit RegExpBackReference(RegExpCapture* capture) 2910a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org : capture_(capture) { } 2911ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2912a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2913ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2914ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpBackReference* AsBackReference() OVERRIDE; 2915ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsBackReference() OVERRIDE; 2916ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return 0; } 2917ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return capture_->max_match(); } 2918a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int index() { return capture_->index(); } 2919a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpCapture* capture() { return capture_; } 2920a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 2921a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpCapture* capture_; 2922a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2923a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2924a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2925ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpEmpty FINAL : public RegExpTree { 2926a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 2927a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExpEmpty() { } 2928ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void* Accept(RegExpVisitor* visitor, void* data) OVERRIDE; 2929a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org virtual RegExpNode* ToNode(RegExpCompiler* compiler, 2930ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org RegExpNode* on_success) OVERRIDE; 2931ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual RegExpEmpty* AsEmpty() OVERRIDE; 2932ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsEmpty() OVERRIDE; 2933ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int min_match() OVERRIDE { return 0; } 2934ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual int max_match() OVERRIDE { return 0; } 29350ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry static RegExpEmpty* GetInstance() { 29360ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry static RegExpEmpty* instance = ::new RegExpEmpty(); 29370ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry return instance; 29380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry } 2939a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 2940a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2941a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 294243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 2943bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// Out-of-line inline constructors (to side-step cyclic dependencies). 2944bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 29456d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orginline ModuleVariable::ModuleVariable(Zone* zone, VariableProxy* proxy, int pos) 29466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org : Module(zone, proxy->interface(), pos), 2947bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com proxy_(proxy) { 2948bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com} 2949bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 2950bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 2951bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com// ---------------------------------------------------------------------------- 295243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Basic visitor 295343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// - leaf node visitors are abstract. 295443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2955a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgclass AstVisitor BASE_EMBEDDED { 295643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 2957a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org AstVisitor() {} 295832cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org virtual ~AstVisitor() {} 295943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 296025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org // Stack overflow check and dynamic dispatch. 2961a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org virtual void Visit(AstNode* node) = 0; 296243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 296325156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org // Iteration left-to-right. 29649d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com virtual void VisitDeclarations(ZoneList<Declaration*>* declarations); 296543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void VisitStatements(ZoneList<Statement*>* statements); 296643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void VisitExpressions(ZoneList<Expression*>* expressions); 296743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // Individual AST nodes. 296943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define DEF_VISIT(type) \ 297043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen virtual void Visit##type(type* node) = 0; 29710b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org AST_NODE_LIST(DEF_VISIT) 297243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DEF_VISIT 2973a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org}; 297443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2975ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 2976a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org#define DEFINE_AST_VISITOR_SUBCLASS_MEMBERS() \ 2977a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgpublic: \ 2978ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual void Visit(AstNode* node) FINAL OVERRIDE { \ 2979a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (!CheckStackOverflow()) node->Accept(this); \ 2980a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } \ 2981a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org \ 2982a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org void SetStackOverflow() { stack_overflow_ = true; } \ 2983a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org void ClearStackOverflow() { stack_overflow_ = false; } \ 2984a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool HasStackOverflow() const { return stack_overflow_; } \ 2985a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org \ 2986a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool CheckStackOverflow() { \ 2987a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (stack_overflow_) return true; \ 29886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org StackLimitCheck check(zone_->isolate()); \ 2989a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org if (!check.HasOverflowed()) return false; \ 2990a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org return (stack_overflow_ = true); \ 2991a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } \ 2992a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org \ 2993a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.orgprivate: \ 29946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org void InitializeAstVisitor(Zone* zone) { \ 29956d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org zone_ = zone; \ 2996a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org stack_overflow_ = false; \ 2997a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org } \ 29986d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Zone* zone() { return zone_; } \ 29996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Isolate* isolate() { return zone_->isolate(); } \ 3000a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org \ 30016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org Zone* zone_; \ 3002a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org bool stack_overflow_ 300343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3004ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 3005b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// ---------------------------------------------------------------------------- 3006b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// Construction time visitor. 3007b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3008b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgclass AstConstructionVisitor BASE_EMBEDDED { 3009b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public: 30109e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org AstConstructionVisitor() 30119e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org : dont_crankshaft_reason_(kNoReason), dont_turbofan_reason_(kNoReason) {} 3012b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3013b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org AstProperties* ast_properties() { return &properties_; } 30149e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org BailoutReason dont_optimize_reason() { 30159e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org if (dont_turbofan_reason_ != kNoReason) { 30169e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org return dont_turbofan_reason_; 30179e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } else { 30189e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org return dont_crankshaft_reason_; 30199e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 30209e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 3021b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3022b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org private: 3023b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org template<class> friend class AstNodeFactory; 3024b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3025b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org // Node visitors. 3026b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#define DEF_VISIT(type) \ 3027b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org void Visit##type(type* node); 3028b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org AST_NODE_LIST(DEF_VISIT) 3029b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#undef DEF_VISIT 3030b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3031b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org void increase_node_count() { properties_.add_node_count(1); } 3032b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org void add_flag(AstPropertiesFlag flag) { properties_.flags()->Add(flag); } 30339e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org void set_dont_crankshaft_reason(BailoutReason reason) { 30349e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org dont_crankshaft_reason_ = reason; 30359e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org } 30369e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org void set_dont_turbofan_reason(BailoutReason reason) { 30379e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org dont_turbofan_reason_ = reason; 30382c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org } 3039b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3040f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org void add_slot_node(FeedbackSlotInterface* slot_node) { 3041a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org int count = slot_node->ComputeFeedbackSlotCount(); 3042a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org if (count > 0) { 3043a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org slot_node->SetFirstFeedbackSlot(properties_.feedback_slots()); 3044a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org properties_.increase_feedback_slots(count); 3045a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org } 3046f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org } 3047f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org 3048b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org AstProperties properties_; 30499e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org BailoutReason dont_crankshaft_reason_; 30509e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org BailoutReason dont_turbofan_reason_; 3051b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org}; 3052b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3053b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3054b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgclass AstNullVisitor BASE_EMBEDDED { 3055b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public: 3056b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org // Node visitors. 3057b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#define DEF_VISIT(type) \ 3058b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org void Visit##type(type* node) {} 3059b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org AST_NODE_LIST(DEF_VISIT) 3060b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#undef DEF_VISIT 3061b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org}; 3062b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3063b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3064b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3065b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// ---------------------------------------------------------------------------- 3066b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org// AstNode factory 3067b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3068b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgtemplate<class Visitor> 3069ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass AstNodeFactory FINAL BASE_EMBEDDED { 3070b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org public: 3071a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org AstNodeFactory(Zone* zone, AstValueFactory* ast_value_factory, 3072a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org AstNode::IdGen* id_gen) 3073a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org : zone_(zone), ast_value_factory_(ast_value_factory), id_gen_(id_gen) {} 3074b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3075b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Visitor* visitor() { return &visitor_; } 3076b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3077b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#define VISIT_AND_RETURN(NodeType, node) \ 3078b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org visitor_.Visit##NodeType((node)); \ 3079b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org return node; 3080b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 308178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org VariableDeclaration* NewVariableDeclaration(VariableProxy* proxy, 308278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org VariableMode mode, 3083a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 3084a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 308578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org VariableDeclaration* decl = 30866d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org new(zone_) VariableDeclaration(zone_, proxy, mode, scope, pos); 308778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org VISIT_AND_RETURN(VariableDeclaration, decl) 308878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 308978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 3090812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org FunctionDeclaration* NewFunctionDeclaration(VariableProxy* proxy, 3091812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org VariableMode mode, 3092812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org FunctionLiteral* fun, 3093a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 3094a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3095812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org FunctionDeclaration* decl = 30966d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org new(zone_) FunctionDeclaration(zone_, proxy, mode, fun, scope, pos); 3097812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org VISIT_AND_RETURN(FunctionDeclaration, decl) 3098812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 3099812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 310078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org ModuleDeclaration* NewModuleDeclaration(VariableProxy* proxy, 310178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org Module* module, 3102a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 3103a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 310478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org ModuleDeclaration* decl = 31056d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org new(zone_) ModuleDeclaration(zone_, proxy, module, scope, pos); 310678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org VISIT_AND_RETURN(ModuleDeclaration, decl) 310778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 310878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 3109812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ImportDeclaration* NewImportDeclaration(VariableProxy* proxy, 3110812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org Module* module, 3111a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 3112a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3113812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ImportDeclaration* decl = 31146d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org new(zone_) ImportDeclaration(zone_, proxy, module, scope, pos); 3115812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org VISIT_AND_RETURN(ImportDeclaration, decl) 3116812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 3117812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 3118812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ExportDeclaration* NewExportDeclaration(VariableProxy* proxy, 3119a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Scope* scope, 3120a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3121812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org ExportDeclaration* decl = 31226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org new(zone_) ExportDeclaration(zone_, proxy, scope, pos); 3123812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org VISIT_AND_RETURN(ExportDeclaration, decl) 3124812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org } 3125812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org 3126a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ModuleLiteral* NewModuleLiteral(Block* body, Interface* interface, int pos) { 31276d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ModuleLiteral* module = 31286d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org new(zone_) ModuleLiteral(zone_, body, interface, pos); 312978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org VISIT_AND_RETURN(ModuleLiteral, module) 313078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 313178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 3132a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ModuleVariable* NewModuleVariable(VariableProxy* proxy, int pos) { 31336d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ModuleVariable* module = new(zone_) ModuleVariable(zone_, proxy, pos); 3134f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org VISIT_AND_RETURN(ModuleVariable, module) 313578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 313678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 313708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ModulePath* NewModulePath(Module* origin, const AstRawString* name, int pos) { 313808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ModulePath* module = new (zone_) ModulePath(zone_, origin, name, pos); 3139f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org VISIT_AND_RETURN(ModulePath, module) 314078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 314178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 3142a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ModuleUrl* NewModuleUrl(Handle<String> url, int pos) { 31436d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ModuleUrl* module = new(zone_) ModuleUrl(zone_, url, pos); 3144f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org VISIT_AND_RETURN(ModuleUrl, module) 314578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org } 314678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 314708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Block* NewBlock(ZoneList<const AstRawString*>* labels, 3148b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int capacity, 3149a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org bool is_initializer_block, 3150a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3151a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Block* block = new (zone_) 3152a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Block(zone_, labels, capacity, is_initializer_block, pos, id_gen_); 3153b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(Block, block) 3154b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3155b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3156a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org#define STATEMENT_WITH_LABELS(NodeType) \ 315708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org NodeType* New##NodeType(ZoneList<const AstRawString*>* labels, int pos) { \ 3158a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org NodeType* stmt = new (zone_) NodeType(zone_, labels, pos, id_gen_); \ 3159a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org VISIT_AND_RETURN(NodeType, stmt); \ 3160b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3161b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org STATEMENT_WITH_LABELS(DoWhileStatement) 3162b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org STATEMENT_WITH_LABELS(WhileStatement) 3163b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org STATEMENT_WITH_LABELS(ForStatement) 3164b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org STATEMENT_WITH_LABELS(SwitchStatement) 3165b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#undef STATEMENT_WITH_LABELS 3166b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 31671fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org ForEachStatement* NewForEachStatement(ForEachStatement::VisitMode visit_mode, 316808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ZoneList<const AstRawString*>* labels, 3169a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 31701fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org switch (visit_mode) { 31711fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org case ForEachStatement::ENUMERATE: { 3172a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ForInStatement* stmt = 3173a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) ForInStatement(zone_, labels, pos, id_gen_); 31741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org VISIT_AND_RETURN(ForInStatement, stmt); 31751fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 31761fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org case ForEachStatement::ITERATE: { 3177a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ForOfStatement* stmt = 3178a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) ForOfStatement(zone_, labels, pos, id_gen_); 31791fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org VISIT_AND_RETURN(ForOfStatement, stmt); 31801fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 31811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 31821fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org UNREACHABLE(); 31831fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org return NULL; 31841fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 31851fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org 3186a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ModuleStatement* NewModuleStatement( 3187a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org VariableProxy* proxy, Block* body, int pos) { 31886d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ModuleStatement* stmt = new(zone_) ModuleStatement(zone_, proxy, body, pos); 31898e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org VISIT_AND_RETURN(ModuleStatement, stmt) 31908e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 31918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org 3192a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ExpressionStatement* NewExpressionStatement(Expression* expression, int pos) { 31936d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ExpressionStatement* stmt = 31946d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org new(zone_) ExpressionStatement(zone_, expression, pos); 3195b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(ExpressionStatement, stmt) 3196b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3197b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3198a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ContinueStatement* NewContinueStatement(IterationStatement* target, int pos) { 31996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ContinueStatement* stmt = new(zone_) ContinueStatement(zone_, target, pos); 3200b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(ContinueStatement, stmt) 3201b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3202b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3203a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org BreakStatement* NewBreakStatement(BreakableStatement* target, int pos) { 32046d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org BreakStatement* stmt = new(zone_) BreakStatement(zone_, target, pos); 3205b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(BreakStatement, stmt) 3206b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3207b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3208a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ReturnStatement* NewReturnStatement(Expression* expression, int pos) { 32096d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ReturnStatement* stmt = new(zone_) ReturnStatement(zone_, expression, pos); 3210b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(ReturnStatement, stmt) 3211b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3212b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3213ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org WithStatement* NewWithStatement(Scope* scope, 3214ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org Expression* expression, 3215a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Statement* statement, 3216a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3217ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org WithStatement* stmt = new(zone_) WithStatement( 32186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org zone_, scope, expression, statement, pos); 3219b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(WithStatement, stmt) 3220b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3221b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3222b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org IfStatement* NewIfStatement(Expression* condition, 3223b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Statement* then_statement, 3224a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Statement* else_statement, 3225a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3226a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org IfStatement* stmt = new (zone_) IfStatement( 3227a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org zone_, condition, then_statement, else_statement, pos, id_gen_); 3228b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(IfStatement, stmt) 3229b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3230b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3231b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org TryCatchStatement* NewTryCatchStatement(int index, 3232b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Block* try_block, 3233b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Scope* scope, 3234b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Variable* variable, 3235a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Block* catch_block, 3236a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3237b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org TryCatchStatement* stmt = new(zone_) TryCatchStatement( 32386d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org zone_, index, try_block, scope, variable, catch_block, pos); 3239b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(TryCatchStatement, stmt) 3240b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3241b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3242b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org TryFinallyStatement* NewTryFinallyStatement(int index, 3243b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Block* try_block, 3244a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Block* finally_block, 3245a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 32466d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org TryFinallyStatement* stmt = new(zone_) TryFinallyStatement( 32476d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org zone_, index, try_block, finally_block, pos); 3248b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(TryFinallyStatement, stmt) 3249b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3250b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3251a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org DebuggerStatement* NewDebuggerStatement(int pos) { 3252a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org DebuggerStatement* stmt = 3253a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) DebuggerStatement(zone_, pos, id_gen_); 3254b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(DebuggerStatement, stmt) 3255b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3256b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3257a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org EmptyStatement* NewEmptyStatement(int pos) { 32586d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org return new(zone_) EmptyStatement(zone_, pos); 3259a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org } 3260a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org 3261a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CaseClause* NewCaseClause( 3262a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Expression* label, ZoneList<Statement*>* statements, int pos) { 3263a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org CaseClause* clause = 3264a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) CaseClause(zone_, label, statements, pos, id_gen_); 3265a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org VISIT_AND_RETURN(CaseClause, clause) 3266b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3267b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 326808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* NewStringLiteral(const AstRawString* string, int pos) { 3269a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal* lit = new (zone_) 3270a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal(zone_, ast_value_factory_->NewString(string), pos, id_gen_); 327108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VISIT_AND_RETURN(Literal, lit) 327208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 327308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 327408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // A JavaScript symbol (ECMA-262 edition 6). 327508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* NewSymbolLiteral(const char* name, int pos) { 3276a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal* lit = new (zone_) 3277a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal(zone_, ast_value_factory_->NewSymbol(name), pos, id_gen_); 3278b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(Literal, lit) 3279b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3280b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3281a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org Literal* NewNumberLiteral(double number, int pos) { 328208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* lit = new (zone_) 3283a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal(zone_, ast_value_factory_->NewNumber(number), pos, id_gen_); 328408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VISIT_AND_RETURN(Literal, lit) 328508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 328608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 328708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* NewSmiLiteral(int number, int pos) { 3288a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal* lit = new (zone_) 3289a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal(zone_, ast_value_factory_->NewSmi(number), pos, id_gen_); 329008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VISIT_AND_RETURN(Literal, lit) 329108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 329208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 329308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* NewBooleanLiteral(bool b, int pos) { 3294a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal* lit = new (zone_) 3295a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal(zone_, ast_value_factory_->NewBoolean(b), pos, id_gen_); 329608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VISIT_AND_RETURN(Literal, lit) 329708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 329808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 329908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* NewStringListLiteral(ZoneList<const AstRawString*>* strings, 330008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int pos) { 3301a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal* lit = new (zone_) Literal( 3302a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org zone_, ast_value_factory_->NewStringList(strings), pos, id_gen_); 330308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VISIT_AND_RETURN(Literal, lit) 330408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 330508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 330608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* NewNullLiteral(int pos) { 330708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* lit = 3308a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) Literal(zone_, ast_value_factory_->NewNull(), pos, id_gen_); 330908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VISIT_AND_RETURN(Literal, lit) 331008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 331108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 331208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* NewUndefinedLiteral(int pos) { 3313a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal* lit = new (zone_) 3314a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal(zone_, ast_value_factory_->NewUndefined(), pos, id_gen_); 331508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VISIT_AND_RETURN(Literal, lit) 331608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 331708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 331808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Literal* NewTheHoleLiteral(int pos) { 3319a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal* lit = new (zone_) 3320a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Literal(zone_, ast_value_factory_->NewTheHole(), pos, id_gen_); 332108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VISIT_AND_RETURN(Literal, lit) 3322b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3323b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3324b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ObjectLiteral* NewObjectLiteral( 3325b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ZoneList<ObjectLiteral::Property*>* properties, 3326b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int literal_index, 3327e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org int boilerplate_properties, 3328a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org bool has_function, 3329a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3330a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ObjectLiteral* lit = new (zone_) 3331a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ObjectLiteral(zone_, properties, literal_index, boilerplate_properties, 3332a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org has_function, pos, id_gen_); 3333b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(ObjectLiteral, lit) 3334b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3335b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 33366d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org ObjectLiteral::Property* NewObjectLiteralProperty(Literal* key, 3337a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Expression* value, 3338a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org bool is_static) { 3339a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org return new (zone_) ObjectLiteral::Property(zone_, ast_value_factory_, key, 3340a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org value, is_static); 33416d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org } 33426d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org 3343b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ObjectLiteral::Property* NewObjectLiteralProperty(bool is_getter, 3344a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org FunctionLiteral* value, 3345a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int pos, bool is_static) { 3346b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ObjectLiteral::Property* prop = 3347a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org new (zone_) ObjectLiteral::Property(zone_, is_getter, value, is_static); 334808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org prop->set_key(NewStringLiteral(value->raw_name(), pos)); 3349b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org return prop; // Not an AST node, will not be visited. 3350b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3351b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 335208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org RegExpLiteral* NewRegExpLiteral(const AstRawString* pattern, 335308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* flags, 3354a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int literal_index, 3355a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3356a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org RegExpLiteral* lit = new (zone_) 3357a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org RegExpLiteral(zone_, pattern, flags, literal_index, pos, id_gen_); 3358b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(RegExpLiteral, lit); 3359b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3360b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3361e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ArrayLiteral* NewArrayLiteral(ZoneList<Expression*>* values, 3362b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int literal_index, 3363a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3364a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ArrayLiteral* lit = 3365a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) ArrayLiteral(zone_, values, literal_index, pos, id_gen_); 3366b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(ArrayLiteral, lit) 3367b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3368b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3369a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org VariableProxy* NewVariableProxy(Variable* var, 3370a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos = RelocInfo::kNoPosition) { 3371a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org VariableProxy* proxy = new (zone_) VariableProxy(zone_, var, pos, id_gen_); 3372b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(VariableProxy, proxy) 3373b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3374b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 337508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org VariableProxy* NewVariableProxy(const AstRawString* name, 3376b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org bool is_this, 337728583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org Interface* interface = Interface::NewValue(), 337828583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org int position = RelocInfo::kNoPosition) { 3379a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org VariableProxy* proxy = new (zone_) 3380a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org VariableProxy(zone_, name, is_this, interface, position, id_gen_); 3381b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(VariableProxy, proxy) 3382b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3383b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3384b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Property* NewProperty(Expression* obj, Expression* key, int pos) { 3385a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Property* prop = new (zone_) Property(zone_, obj, key, pos, id_gen_); 3386b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(Property, prop) 3387b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3388b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3389b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Call* NewCall(Expression* expression, 3390b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ZoneList<Expression*>* arguments, 3391b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int pos) { 3392a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Call* call = new (zone_) Call(zone_, expression, arguments, pos, id_gen_); 3393b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(Call, call) 3394b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3395b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3396b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org CallNew* NewCallNew(Expression* expression, 3397b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org ZoneList<Expression*>* arguments, 3398b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int pos) { 3399a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org CallNew* call = 3400a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) CallNew(zone_, expression, arguments, pos, id_gen_); 3401b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(CallNew, call) 3402b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3403b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 340408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org CallRuntime* NewCallRuntime(const AstRawString* name, 3405b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org const Runtime::Function* function, 3406a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ZoneList<Expression*>* arguments, 3407a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int pos) { 3408b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org CallRuntime* call = 3409a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) CallRuntime(zone_, name, function, arguments, pos, id_gen_); 3410b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(CallRuntime, call) 3411b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3412b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3413b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org UnaryOperation* NewUnaryOperation(Token::Value op, 3414b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* expression, 3415b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int pos) { 3416b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org UnaryOperation* node = 3417a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) UnaryOperation(zone_, op, expression, pos, id_gen_); 3418b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(UnaryOperation, node) 3419b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3420b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3421b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org BinaryOperation* NewBinaryOperation(Token::Value op, 3422b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* left, 3423b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* right, 3424b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int pos) { 3425b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org BinaryOperation* node = 3426a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) BinaryOperation(zone_, op, left, right, pos, id_gen_); 3427b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(BinaryOperation, node) 3428b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3429b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3430b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org CountOperation* NewCountOperation(Token::Value op, 3431b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org bool is_prefix, 3432b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* expr, 3433b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int pos) { 3434b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org CountOperation* node = 3435a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) CountOperation(zone_, op, is_prefix, expr, pos, id_gen_); 3436b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(CountOperation, node) 3437b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3438b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3439b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org CompareOperation* NewCompareOperation(Token::Value op, 3440b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* left, 3441b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* right, 3442b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int pos) { 3443b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org CompareOperation* node = 3444a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) CompareOperation(zone_, op, left, right, pos, id_gen_); 3445b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(CompareOperation, node) 3446b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3447b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3448b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Conditional* NewConditional(Expression* condition, 3449b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* then_expression, 3450b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* else_expression, 3451a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org int position) { 3452a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Conditional* cond = new (zone_) Conditional( 3453a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org zone_, condition, then_expression, else_expression, position, id_gen_); 3454b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(Conditional, cond) 3455b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3456b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3457b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Assignment* NewAssignment(Token::Value op, 3458b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* target, 3459b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Expression* value, 3460b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org int pos) { 3461b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Assignment* assign = 3462a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) Assignment(zone_, op, target, value, pos, id_gen_); 34636d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org assign->Init(zone_, this); 3464b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(Assignment, assign) 3465b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3466b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3467e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Yield* NewYield(Expression *generator_object, 3468e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org Expression* expression, 346977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org Yield::Kind yield_kind, 3470e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org int pos) { 3471d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org if (!expression) expression = NewUndefinedLiteral(pos); 3472a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Yield* yield = new (zone_) 3473a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Yield(zone_, generator_object, expression, yield_kind, pos, id_gen_); 3474f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org VISIT_AND_RETURN(Yield, yield) 3475f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 3476f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 3477b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Throw* NewThrow(Expression* exception, int pos) { 3478a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org Throw* t = new (zone_) Throw(zone_, exception, pos, id_gen_); 3479b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(Throw, t) 3480b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3481b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3482b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org FunctionLiteral* NewFunctionLiteral( 34839d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org const AstRawString* name, AstValueFactory* ast_value_factory, 34849d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org Scope* scope, ZoneList<Statement*>* body, int materialized_literal_count, 34859d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org int expected_property_count, int handler_count, int parameter_count, 348656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org FunctionLiteral::ParameterFlag has_duplicate_parameters, 3487dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org FunctionLiteral::FunctionType function_type, 3488471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org FunctionLiteral::IsFunctionFlag is_function, 34892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org FunctionLiteral::IsParenthesizedFlag is_parenthesized, FunctionKind kind, 34902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org int position) { 34919d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org FunctionLiteral* lit = new (zone_) FunctionLiteral( 34929d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org zone_, name, ast_value_factory, scope, body, materialized_literal_count, 34939d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org expected_property_count, handler_count, parameter_count, function_type, 3494a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org has_duplicate_parameters, is_function, is_parenthesized, kind, position, 3495a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org id_gen_); 349656454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org // Top-level literal doesn't count for the AST's properties. 349756454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org if (is_function == FunctionLiteral::kIsFunction) { 3498b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org visitor_.VisitFunctionLiteral(lit); 3499b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3500b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org return lit; 3501b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3502b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3503a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ClassLiteral* NewClassLiteral(const AstRawString* name, Expression* extends, 3504a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org Expression* constructor, 3505a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ZoneList<ObjectLiteral::Property*>* properties, 3506a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org int position) { 3507a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org ClassLiteral* lit = new (zone_) ClassLiteral( 3508a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org zone_, name, extends, constructor, properties, position, id_gen_); 3509a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org VISIT_AND_RETURN(ClassLiteral, lit) 3510a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org } 3511a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org 3512a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org NativeFunctionLiteral* NewNativeFunctionLiteral(const AstRawString* name, 3513a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org v8::Extension* extension, 3514a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org int pos) { 3515fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org NativeFunctionLiteral* lit = 3516a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) NativeFunctionLiteral(zone_, name, extension, pos, id_gen_); 3517fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org VISIT_AND_RETURN(NativeFunctionLiteral, lit) 3518b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3519b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3520a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org ThisFunction* NewThisFunction(int pos) { 3521a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org ThisFunction* fun = new (zone_) ThisFunction(zone_, pos, id_gen_); 3522b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org VISIT_AND_RETURN(ThisFunction, fun) 3523b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 3524b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 35255e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org SuperReference* NewSuperReference(VariableProxy* this_var, int pos) { 3526a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org SuperReference* super = 3527a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org new (zone_) SuperReference(zone_, this_var, pos, id_gen_); 35285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org VISIT_AND_RETURN(SuperReference, super); 35295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org } 35305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 3531b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org#undef VISIT_AND_RETURN 3532b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3533b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org private: 3534b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Zone* zone_; 3535b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org Visitor visitor_; 353608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValueFactory* ast_value_factory_; 3537a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org AstNode::IdGen* id_gen_; 3538b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org}; 3539b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 3540b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 354143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 354243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 354343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif // V8_AST_H_ 3544