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
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h"
6659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org#include <cmath>  // For isfinite.
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/builtins.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/code-stubs.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/contexts.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/conversions.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hashmap.h"
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/parser.h"
14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/property.h"
154b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/property-details.h"
16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopes.h"
17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/string-stream.h"
18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/type-info.h"
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
2171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// All the Accept member functions for each syntax tree node type.
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2625156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org#define DECL_ACCEPT(type)                                       \
2725156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org  void type::Accept(AstVisitor* v) { v->Visit##type(this); }
280b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgAST_NODE_LIST(DECL_ACCEPT)
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DECL_ACCEPT
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Implementation of other node functionality.
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
364edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgbool Expression::IsSmiLiteral() const {
37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return IsLiteral() && AsLiteral()->value()->IsSmi();
38c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org}
39c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
40c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org
414edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgbool Expression::IsStringLiteral() const {
42196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return IsLiteral() && AsLiteral()->value()->IsString();
43f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org}
44f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
45f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
464edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgbool Expression::IsNullLiteral() const {
47196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  return IsLiteral() && AsLiteral()->value()->IsNull();
48f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org}
49f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
50f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org
514edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgbool Expression::IsUndefinedLiteral(Isolate* isolate) const {
524edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.org  const VariableProxy* var_proxy = AsVariableProxy();
5396a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  if (var_proxy == NULL) return false;
5496a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  Variable* var = var_proxy->var();
5596a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  // The global identifier "undefined" is immutable. Everything
5696a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  // else could be reassigned.
5796a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  return var != NULL && var->location() == Variable::UNALLOCATED &&
5808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org         var_proxy->raw_name()->IsOneByteEqualTo("undefined");
59ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org}
60ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
61ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
62a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgVariableProxy::VariableProxy(Zone* zone, Variable* var, int position,
63a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                             IdGen* id_gen)
64a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    : Expression(zone, position, id_gen),
6508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org      name_(var->raw_name()),
664a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org      var_(NULL),  // Will be set by the call to BindTo.
674a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org      is_this_(var->is_this()),
68248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      is_assigned_(false),
699d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      interface_(var->interface()),
709d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      variable_feedback_slot_(kInvalidFeedbackSlot) {
714a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org  BindTo(var);
724a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org}
734a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
744a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org
75a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgVariableProxy::VariableProxy(Zone* zone, const AstRawString* name, bool is_this,
76a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                             Interface* interface, int position, IdGen* id_gen)
77a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    : Expression(zone, position, id_gen),
78717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org      name_(name),
79717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org      var_(NULL),
80717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org      is_this_(is_this),
81248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org      is_assigned_(false),
829d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org      interface_(interface),
83a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      variable_feedback_slot_(kInvalidFeedbackSlot) {}
8443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid VariableProxy::BindTo(Variable* var) {
87e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(var_ == NULL);  // must be bound only once
88e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(var != NULL);  // must bind
89e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!FLAG_harmony_modules || interface_->IsUnified(var->interface()));
90e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((is_this() && var->is_this()) || name_ == var->raw_name());
9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Ideally CONST-ness should match. However, this is very hard to achieve
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // because we don't know the exact semantics of conflicting (const and
9343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // non-const) multiple variable declarations, const vars introduced via
9443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // eval() etc.  Const-ness and variable declarations are a complete mess
9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // in JS. Sigh...
9643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  var_ = var;
97248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org  var->set_is_used();
9843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
10043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgAssignment::Assignment(Zone* zone, Token::Value op, Expression* target,
102a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                       Expression* value, int pos, IdGen* id_gen)
103a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    : Expression(zone, pos, id_gen),
104717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org      op_(op),
105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      target_(target),
106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      value_(value),
1075f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org      binary_operation_(NULL),
108a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      assignment_id_(id_gen->GetNextId()),
1091510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      is_uninitialized_(false),
110a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      store_mode_(STANDARD_STORE) {}
111a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
112a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenToken::Value Assignment::binary_op() const {
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  switch (op_) {
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_BIT_OR: return Token::BIT_OR;
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_BIT_XOR: return Token::BIT_XOR;
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_BIT_AND: return Token::BIT_AND;
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_SHL: return Token::SHL;
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_SAR: return Token::SAR;
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_SHR: return Token::SHR;
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_ADD: return Token::ADD;
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_SUB: return Token::SUB;
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_MUL: return Token::MUL;
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_DIV: return Token::DIV;
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    case Token::ASSIGN_MOD: return Token::MOD;
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    default: UNREACHABLE();
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Token::ILLEGAL;
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool FunctionLiteral::AllowsLazyCompilation() {
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return scope()->AllowsLazyCompilation();
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1375a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgbool FunctionLiteral::AllowsLazyCompilationWithoutContext() {
1385a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  return scope()->AllowsLazyCompilationWithoutContext();
1395a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org}
1405a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
1415a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org
142c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgint FunctionLiteral::start_position() const {
143c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  return scope()->start_position();
144c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}
145c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
146c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
147c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgint FunctionLiteral::end_position() const {
148c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org  return scope()->end_position();
149c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}
150c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
151c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
152486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.orgStrictMode FunctionLiteral::strict_mode() const {
153486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return scope()->strict_mode();
154c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org}
155c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
156c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org
1574610c28af9f4355485f8115a725f320b80632804machenbach@chromium.orgvoid FunctionLiteral::InitializeSharedInfo(
1584610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    Handle<Code> unoptimized_code) {
1594610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  for (RelocIterator it(*unoptimized_code); !it.done(); it.next()) {
1604610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    RelocInfo* rinfo = it.rinfo();
1614610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    if (rinfo->rmode() != RelocInfo::EMBEDDED_OBJECT) continue;
1624610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    Object* obj = rinfo->target_object();
1634610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    if (obj->IsSharedFunctionInfo()) {
1644610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org      SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj);
1654610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org      if (shared->start_position() == start_position()) {
1664610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org        shared_info_ = Handle<SharedFunctionInfo>(shared);
1674610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org        break;
1684610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org      }
1694610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org    }
1704610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org  }
1714610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org}
1724610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org
1734610c28af9f4355485f8115a725f320b80632804machenbach@chromium.org
17408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgObjectLiteralProperty::ObjectLiteralProperty(Zone* zone,
17508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org                                             AstValueFactory* ast_value_factory,
176a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                             Literal* key, Expression* value,
177a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                             bool is_static) {
178e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  emit_store_ = true;
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  key_ = key;
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  value_ = value;
181a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  is_static_ = is_static;
18208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  if (key->raw_value()->EqualsString(ast_value_factory->proto_string())) {
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    kind_ = PROTOTYPE;
184bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org  } else if (value_->AsMaterializedLiteral() != NULL) {
185bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    kind_ = MATERIALIZED_LITERAL;
186196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  } else if (value_->IsLiteral()) {
187bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    kind_ = CONSTANT;
18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
189bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    kind_ = COMPUTED;
19043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
19143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
19243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
194a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgObjectLiteralProperty::ObjectLiteralProperty(Zone* zone, bool is_getter,
195a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                             FunctionLiteral* value,
196a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                                             bool is_static) {
197e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  emit_store_ = true;
19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  value_ = value;
19943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  kind_ = is_getter ? GETTER : SETTER;
200a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  is_static_ = is_static;
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
20243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2043811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgbool ObjectLiteral::Property::IsCompileTimeValue() {
2053811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  return kind_ == CONSTANT ||
2063811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org      (kind_ == MATERIALIZED_LITERAL &&
2073811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org       CompileTimeValue::IsCompileTimeValue(value_));
2083811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
2093811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
2103811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
211e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgvoid ObjectLiteral::Property::set_emit_store(bool emit_store) {
212e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  emit_store_ = emit_store;
213e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org}
214e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
215e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
216e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgbool ObjectLiteral::Property::emit_store() {
217e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  return emit_store_;
218e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org}
219e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
220e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
2217028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid ObjectLiteral::CalculateEmitStore(Zone* zone) {
2227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ZoneAllocationPolicy allocator(zone);
2237028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2247028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  ZoneHashMap table(Literal::Match, ZoneHashMap::kDefaultHashMapCapacity,
2257028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org                    allocator);
226bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  for (int i = properties()->length() - 1; i >= 0; i--) {
227bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    ObjectLiteral::Property* property = properties()->at(i);
228e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    Literal* literal = property->key();
2291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (literal->value()->IsNull()) continue;
230bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    uint32_t hash = literal->Hash();
231e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // If the key of a computed property is in the table, do not emit
232e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    // a store for the property later.
233c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org    if ((property->kind() == ObjectLiteral::Property::MATERIALIZED_LITERAL ||
234c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org         property->kind() == ObjectLiteral::Property::COMPUTED) &&
2357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        table.Lookup(literal, hash, false, allocator) != NULL) {
236bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com      property->set_emit_store(false);
237bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    } else {
238bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com      // Add key to the table.
2397028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      table.Lookup(literal, hash, true, allocator);
240e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    }
241e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  }
242e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org}
243e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
244e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org
245e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgbool ObjectLiteral::IsBoilerplateProperty(ObjectLiteral::Property* property) {
246e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  return property != NULL &&
247e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org         property->kind() != ObjectLiteral::Property::PROTOTYPE;
248e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
249e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
250e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
2517ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvoid ObjectLiteral::BuildConstantProperties(Isolate* isolate) {
252e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  if (!constant_properties_.is_null()) return;
253e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
254e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Allocate a fixed array to hold all the constant properties.
255e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  Handle<FixedArray> constant_properties = isolate->factory()->NewFixedArray(
256e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      boilerplate_properties_ * 2, TENURED);
257e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
258e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  int position = 0;
259e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Accumulate the value in local variables and store it at the end.
260e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  bool is_simple = true;
261e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  int depth_acc = 1;
262e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  uint32_t max_element_index = 0;
263e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  uint32_t elements = 0;
264e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  for (int i = 0; i < properties()->length(); i++) {
265e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    ObjectLiteral::Property* property = properties()->at(i);
266e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    if (!IsBoilerplateProperty(property)) {
267e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      is_simple = false;
268e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      continue;
269e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    }
270e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    MaterializedLiteral* m_literal = property->value()->AsMaterializedLiteral();
271e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    if (m_literal != NULL) {
2727ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org      m_literal->BuildConstants(isolate);
2737ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org      if (m_literal->depth() >= depth_acc) depth_acc = m_literal->depth() + 1;
274e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    }
275e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
276e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // Add CONSTANT and COMPUTED properties to boilerplate. Use undefined
277e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // value for COMPUTED properties, the real value is filled in at
278e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // runtime. The enumeration order is maintained.
279e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    Handle<Object> key = property->key()->value();
280e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    Handle<Object> value = GetBoilerplateValue(property->value(), isolate);
281e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
282e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // Ensure objects that may, at any point in time, contain fields with double
283e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // representation are always treated as nested objects. This is true for
284e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // computed fields (value is undefined), and smi and double literals
285e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // (value->IsNumber()).
286e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // TODO(verwaest): Remove once we can store them inline.
287e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    if (FLAG_track_double_fields &&
288e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org        (value->IsNumber() || value->IsUninitialized())) {
289e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      may_store_doubles_ = true;
290e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    }
291e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
292e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    is_simple = is_simple && !value->IsUninitialized();
293e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
294e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // Keep track of the number of elements in the object literal and
295e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // the largest element index.  If the largest element index is
296e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // much larger than the number of elements, creating an object
297e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // literal with fast elements will be a waste of space.
298e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    uint32_t element_index = 0;
299e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    if (key->IsString()
300e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org        && Handle<String>::cast(key)->AsArrayIndex(&element_index)
301e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org        && element_index > max_element_index) {
302e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      max_element_index = element_index;
303e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      elements++;
304e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    } else if (key->IsSmi()) {
305e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      int key_value = Smi::cast(*key)->value();
306e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      if (key_value > 0
307e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org          && static_cast<uint32_t>(key_value) > max_element_index) {
308e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org        max_element_index = key_value;
309e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      }
310e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      elements++;
311e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    }
312e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
313e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    // Add name, value pair to the fixed array.
314e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    constant_properties->set(position++, *key);
315e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    constant_properties->set(position++, *value);
316e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
317e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
318e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  constant_properties_ = constant_properties;
319e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  fast_elements_ =
320e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      (max_element_index <= 32) || ((2 * elements) >= max_element_index);
321e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  set_is_simple(is_simple);
3227ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  set_depth(depth_acc);
323e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
324e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
325e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
3267ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvoid ArrayLiteral::BuildConstantElements(Isolate* isolate) {
327e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  if (!constant_elements_.is_null()) return;
328e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
329e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Allocate a fixed array to hold all the object literals.
330e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  Handle<JSArray> array =
331e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      isolate->factory()->NewJSArray(0, FAST_HOLEY_SMI_ELEMENTS);
332b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  JSArray::Expand(array, values()->length());
333e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
334e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Fill in the literals.
335e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  bool is_simple = true;
336e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  int depth_acc = 1;
337e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  bool is_holey = false;
338e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  for (int i = 0, n = values()->length(); i < n; i++) {
339e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    Expression* element = values()->at(i);
340e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    MaterializedLiteral* m_literal = element->AsMaterializedLiteral();
341e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    if (m_literal != NULL) {
3427ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org      m_literal->BuildConstants(isolate);
3437ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org      if (m_literal->depth() + 1 > depth_acc) {
3447ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org        depth_acc = m_literal->depth() + 1;
3457ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org      }
346e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    }
347e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    Handle<Object> boilerplate_value = GetBoilerplateValue(element, isolate);
348e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    if (boilerplate_value->IsTheHole()) {
349e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      is_holey = true;
350e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    } else if (boilerplate_value->IsUninitialized()) {
351e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      is_simple = false;
352e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      JSObject::SetOwnElement(
3539e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org          array, i, handle(Smi::FromInt(0), isolate), SLOPPY).Assert();
354e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    } else {
3559e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org      JSObject::SetOwnElement(array, i, boilerplate_value, SLOPPY).Assert();
356e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    }
357e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
358e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
359e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  Handle<FixedArrayBase> element_values(array->elements());
360e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
361e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Simple and shallow arrays can be lazily copied, we transform the
362e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // elements array to a copy-on-write array.
363e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  if (is_simple && depth_acc == 1 && values()->length() > 0 &&
364e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      array->HasFastSmiOrObjectElements()) {
365e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    element_values->set_map(isolate->heap()->fixed_cow_array_map());
366e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
367e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
368e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // Remember both the literal's constant values as well as the ElementsKind
369e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  // in a 2-element FixedArray.
370e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  Handle<FixedArray> literals = isolate->factory()->NewFixedArray(2, TENURED);
371e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
372e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  ElementsKind kind = array->GetElementsKind();
373e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  kind = is_holey ? GetHoleyElementsKind(kind) : GetPackedElementsKind(kind);
374e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
375e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  literals->set(0, Smi::FromInt(kind));
376e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  literals->set(1, *element_values);
377e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
378e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  constant_elements_ = literals;
379e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  set_is_simple(is_simple);
3807ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  set_depth(depth_acc);
381e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
382e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
383e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
384e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgHandle<Object> MaterializedLiteral::GetBoilerplateValue(Expression* expression,
385e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org                                                        Isolate* isolate) {
386196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org  if (expression->IsLiteral()) {
387e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    return expression->AsLiteral()->value();
388e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
389e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  if (CompileTimeValue::IsCompileTimeValue(expression)) {
390e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    return CompileTimeValue::GetValue(isolate, expression);
391e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
392e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  return isolate->factory()->uninitialized_value();
393e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
394e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
395e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
3967ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvoid MaterializedLiteral::BuildConstants(Isolate* isolate) {
397e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  if (IsArrayLiteral()) {
3987ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    return AsArrayLiteral()->BuildConstantElements(isolate);
399e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
400e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  if (IsObjectLiteral()) {
4017ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org    return AsObjectLiteral()->BuildConstantProperties(isolate);
402e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
403e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsRegExpLiteral());
404e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(depth() >= 1);  // Depth should be initialized.
405e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
406e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
407e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
4087028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid TargetCollector::AddTarget(Label* target, Zone* zone) {
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Add the label to the collector, but discard duplicates.
4106d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  int length = targets_.length();
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < length; i++) {
4126d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org    if (targets_[i] == target) return;
41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
4147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  targets_.Add(target, zone);
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid UnaryOperation::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) {
4191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // TODO(olivf) If this Operation is used in a test context, then the
4201510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // expression has a ToBoolean stub and we want to collect the type
4211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // information. However the GraphBuilder expects it to be on the instruction
4221510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // corresponding to the TestContext, therefore we have to store it here and
4231510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // not on the operand.
4241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  set_to_boolean_types(oracle->ToBooleanTypes(expression()->test_id()));
4251510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
4261510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid BinaryOperation::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) {
4291510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // TODO(olivf) If this Operation is used in a test context, then the right
4301510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // hand side has a ToBoolean stub and we want to collect the type information.
4311510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // However the GraphBuilder expects it to be on the instruction corresponding
4321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // to the TestContext, therefore we have to store it here and not on the
4331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  // right hand operand.
4341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  set_to_boolean_types(oracle->ToBooleanTypes(right()->test_id()));
4351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
4361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
4384edebd5691ee147fa134ad8aaf6cc3c939831b93machenbach@chromium.orgbool BinaryOperation::ResultOverwriteAllowed() const {
43965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  switch (op_) {
44065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::COMMA:
44165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::OR:
44265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::AND:
44365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org      return false;
44465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::BIT_OR:
44565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::BIT_XOR:
44665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::BIT_AND:
44765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::SHL:
44865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::SAR:
44965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::SHR:
45065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::ADD:
45165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::SUB:
45265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::MUL:
45365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::DIV:
45465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    case Token::MOD:
45565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org      return true;
45665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org    default:
45765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org      UNREACHABLE();
45865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  }
45965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org  return false;
46065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org}
46165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
46265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org
463c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool IsTypeof(Expression* expr) {
464c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  UnaryOperation* maybe_unary = expr->AsUnaryOperation();
465c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return maybe_unary != NULL && maybe_unary->op() == Token::TYPEOF;
466c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
467c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
468c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
469c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Check for the pattern: typeof <expression> equals <string literal>.
470c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool MatchLiteralCompareTypeof(Expression* left,
471c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                      Token::Value op,
472c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                      Expression* right,
473c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                      Expression** expr,
474c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                      Handle<String>* check) {
475c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (IsTypeof(left) && right->IsStringLiteral() && Token::IsEqualityOp(op)) {
476c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    *expr = left->AsUnaryOperation()->expression();
4771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    *check = Handle<String>::cast(right->AsLiteral()->value());
47804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    return true;
47904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  }
480c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return false;
481c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
482c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
48304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
484c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool CompareOperation::IsLiteralCompareTypeof(Expression** expr,
485c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                              Handle<String>* check) {
486c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return MatchLiteralCompareTypeof(left_, op_, right_, expr, check) ||
487c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      MatchLiteralCompareTypeof(right_, op_, left_, expr, check);
488c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
489c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
490c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
491c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool IsVoidOfLiteral(Expression* expr) {
492c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  UnaryOperation* maybe_unary = expr->AsUnaryOperation();
493c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return maybe_unary != NULL &&
494c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      maybe_unary->op() == Token::VOID &&
495196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      maybe_unary->expression()->IsLiteral();
496c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
497c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
498c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
499ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// Check for the pattern: void <literal> equals <expression> or
500ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// undefined equals <expression>
501c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool MatchLiteralCompareUndefined(Expression* left,
502c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                         Token::Value op,
503c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                         Expression* right,
50496a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org                                         Expression** expr,
50596a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org                                         Isolate* isolate) {
506c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (IsVoidOfLiteral(left) && Token::IsEqualityOp(op)) {
507ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    *expr = right;
508ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    return true;
509ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
51096a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  if (left->IsUndefinedLiteral(isolate) && Token::IsEqualityOp(op)) {
511c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    *expr = right;
51204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    return true;
51304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  }
51404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  return false;
51504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org}
51604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
51704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
51896a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.orgbool CompareOperation::IsLiteralCompareUndefined(
51996a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org    Expression** expr, Isolate* isolate) {
52096a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org  return MatchLiteralCompareUndefined(left_, op_, right_, expr, isolate) ||
52196a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org      MatchLiteralCompareUndefined(right_, op_, left_, expr, isolate);
522c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
52304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
52404921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
525c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Check for the pattern: null equals <expression>
526c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool MatchLiteralCompareNull(Expression* left,
527c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                    Token::Value op,
528c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                    Expression* right,
529c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com                                    Expression** expr) {
530c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  if (left->IsNullLiteral() && Token::IsEqualityOp(op)) {
531c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    *expr = right;
53204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org    return true;
53304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org  }
534c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return false;
535c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
53604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
53704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
538c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool CompareOperation::IsLiteralCompareNull(Expression** expr) {
539c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return MatchLiteralCompareNull(left_, op_, right_, expr) ||
540c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com      MatchLiteralCompareNull(right_, op_, left_, expr);
54104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org}
54204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
54304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org
54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ----------------------------------------------------------------------------
545a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Inlining support
546a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
547a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgbool Declaration::IsInlineable() const {
54878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  return proxy()->var()->IsStackAllocated();
54978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
55078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
551812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgbool FunctionDeclaration::IsInlineable() const {
552812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return false;
553a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org}
554a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
555a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org
556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// ----------------------------------------------------------------------------
557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Recording of type feedback
558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// TODO(rossberg): all RecordTypeFeedback functions should disappear
5601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// once we use the common type field in the AST consistently.
5611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
562c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid Expression::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) {
563c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  to_boolean_types_ = oracle->ToBooleanTypes(test_id());
564c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org}
565c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
566c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
567a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgbool Call::IsUsingCallFeedbackSlot(Isolate* isolate) const {
568f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  CallType call_type = GetCallType(isolate);
569a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  return (call_type != POSSIBLY_EVAL_CALL);
570f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
571f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
572f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
57343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.orgCall::CallType Call::GetCallType(Isolate* isolate) const {
57443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  VariableProxy* proxy = expression()->AsVariableProxy();
57543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  if (proxy != NULL) {
57643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    if (proxy->var()->is_possibly_eval(isolate)) {
57743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      return POSSIBLY_EVAL_CALL;
57843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    } else if (proxy->var()->IsUnallocated()) {
57943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      return GLOBAL_CALL;
58043c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    } else if (proxy->var()->IsLookupSlot()) {
58143c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org      return LOOKUP_SLOT_CALL;
58243c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org    }
58343c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  }
58443c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
58543c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  Property* property = expression()->AsProperty();
58643c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org  return property != NULL ? PROPERTY_CALL : OTHER_CALL;
58743c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org}
58843c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
58943c51e51fafad9405752a3d7e953367531469575machenbach@chromium.org
590a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool Call::ComputeGlobalTarget(Handle<GlobalObject> global,
5917dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org                               LookupIterator* it) {
592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  target_ = Handle<JSFunction>::null();
59341728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  cell_ = Handle<Cell>::null();
5947dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org  DCHECK(it->IsFound() && it->GetHolder<JSObject>().is_identical_to(global));
5957dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org  cell_ = it->GetPropertyCell();
596c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org  if (cell_->value()->IsJSFunction()) {
597c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    Handle<JSFunction> candidate(JSFunction::cast(cell_->value()));
598c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    // If the function is in new space we assume it's more likely to
599c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org    // change and thus prefer the general IC code.
6007dae5b9f8500ada1f217a27db8a1f5c62becd404machenbach@chromium.org    if (!it->isolate()->heap()->InNewSpace(*candidate)) {
601c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org      target_ = candidate;
602c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org      return true;
603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
605a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return false;
606a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
609967e270a034432457500dbf950d2c4951a929e52ulan@chromium.orgvoid CallNew::RecordTypeFeedback(TypeFeedbackOracle* oracle) {
61069f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org  int allocation_site_feedback_slot = FLAG_pretenuring_call_new
61169f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      ? AllocationSiteFeedbackSlot()
61269f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      : CallNewFeedbackSlot();
613c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org  allocation_site_ =
61469f64b1a8bfa6f5418b7c1f71d4e0833f76e93edmachenbach@chromium.org      oracle->GetCallNewAllocationSite(allocation_site_feedback_slot);
615f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  is_monomorphic_ = oracle->CallNewIsMonomorphic(CallNewFeedbackSlot());
616967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  if (is_monomorphic_) {
617f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    target_ = oracle->GetCallNewTarget(CallNewFeedbackSlot());
618c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org    if (!allocation_site_.is_null()) {
619c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org      elements_kind_ = allocation_site_->GetElementsKind();
6201fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    }
621967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org  }
622967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org}
623967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
624967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org
6253233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgvoid ObjectLiteral::Property::RecordTypeFeedback(TypeFeedbackOracle* oracle) {
626ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org  TypeFeedbackId id = key()->LiteralFeedbackId();
627113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  SmallMapList maps;
628113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  oracle->CollectReceiverTypes(id, &maps);
629113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org  receiver_type_ = maps.length() == 1 ? maps.at(0)
630113035e2f19feb7032fbe57b2e3e376f1dfc4110jkummerow@chromium.org                                      : Handle<Map>::null();
6313233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org}
6323233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org
6333233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org
634a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// ----------------------------------------------------------------------------
635a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Implementation of AstVisitor
63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6379d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstVisitor::VisitDeclarations(ZoneList<Declaration*>* declarations) {
6389d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  for (int i = 0; i < declarations->length(); i++) {
6399d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Visit(declarations->at(i));
6409d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
6419d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
6429d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
6439d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
644a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid AstVisitor::VisitStatements(ZoneList<Statement*>* statements) {
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < statements->length(); i++) {
646dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    Statement* stmt = statements->at(i);
647dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    Visit(stmt);
648dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org    if (stmt->IsJump()) break;
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
653a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid AstVisitor::VisitExpressions(ZoneList<Expression*>* expressions) {
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < expressions->length(); i++) {
65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // The variable statement visiting code may pass NULL expressions
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // to this code. Maybe this should be handled by introducing an
65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // undefined expression or literal?  Revisit this code if this
65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // changes
65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Expression* expression = expressions->at(i);
66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (expression != NULL) Visit(expression);
66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
665a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// ----------------------------------------------------------------------------
666a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Regular expressions
667a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
668a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAKE_ACCEPT(Name)                                            \
669a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  void* RegExp##Name::Accept(RegExpVisitor* visitor, void* data) {   \
670a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    return visitor->Visit##Name(this, data);                         \
671a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
672a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgFOR_EACH_REG_EXP_TREE_TYPE(MAKE_ACCEPT)
673a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_ACCEPT
674a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
675a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAKE_TYPE_CASE(Name)                                         \
676a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExp##Name* RegExpTree::As##Name() {                             \
677a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    return NULL;                                                     \
678a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }                                                                  \
679a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  bool RegExpTree::Is##Name() { return false; }
680a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgFOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE)
681a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_TYPE_CASE
682a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
683a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAKE_TYPE_CASE(Name)                                        \
684a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  RegExp##Name* RegExp##Name::As##Name() {                          \
685a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    return this;                                                    \
686a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }                                                                 \
687a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  bool RegExp##Name::Is##Name() { return true; }
688a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgFOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE)
689a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_TYPE_CASE
690a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
691a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
6923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgstatic Interval ListCaptureRegisters(ZoneList<RegExpTree*>* children) {
6933291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  Interval result = Interval::Empty();
6943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  for (int i = 0; i < children->length(); i++)
6953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    result = result.Union(children->at(i)->CaptureRegisters());
6963291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return result;
6973291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
6983291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
6993291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpAlternative::CaptureRegisters() {
7013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return ListCaptureRegisters(nodes());
7023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
7033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpDisjunction::CaptureRegisters() {
7063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return ListCaptureRegisters(alternatives());
7073291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
7083291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpLookahead::CaptureRegisters() {
7113291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return body()->CaptureRegisters();
7123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
7133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7153291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpCapture::CaptureRegisters() {
7163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  Interval self(StartRegister(index()), EndRegister(index()));
7173291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return self.Union(body()->CaptureRegisters());
7183291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
7193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpQuantifier::CaptureRegisters() {
7223291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return body()->CaptureRegisters();
7233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
7243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
7264a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpAssertion::IsAnchoredAtStart() {
727dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  return assertion_type() == RegExpAssertion::START_OF_INPUT;
728ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
729ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
730ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
7314a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpAssertion::IsAnchoredAtEnd() {
732dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  return assertion_type() == RegExpAssertion::END_OF_INPUT;
7334a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
7344a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7354a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7364a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpAlternative::IsAnchoredAtStart() {
737245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  ZoneList<RegExpTree*>* nodes = this->nodes();
738245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  for (int i = 0; i < nodes->length(); i++) {
739245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    RegExpTree* node = nodes->at(i);
7404a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    if (node->IsAnchoredAtStart()) { return true; }
7414a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    if (node->max_match() > 0) { return false; }
7424a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
7434a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return false;
7444a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
7454a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7464a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7474a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpAlternative::IsAnchoredAtEnd() {
7484a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  ZoneList<RegExpTree*>* nodes = this->nodes();
7494a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  for (int i = nodes->length() - 1; i >= 0; i--) {
7504a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    RegExpTree* node = nodes->at(i);
7514a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    if (node->IsAnchoredAtEnd()) { return true; }
752245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    if (node->max_match() > 0) { return false; }
753245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  }
754245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org  return false;
755ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
756ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
757ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
7584a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpDisjunction::IsAnchoredAtStart() {
759ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  ZoneList<RegExpTree*>* alternatives = this->alternatives();
760ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  for (int i = 0; i < alternatives->length(); i++) {
7614a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    if (!alternatives->at(i)->IsAnchoredAtStart())
762ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org      return false;
763ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  }
764ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org  return true;
765ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
766ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
767ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
7684a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpDisjunction::IsAnchoredAtEnd() {
7694a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  ZoneList<RegExpTree*>* alternatives = this->alternatives();
7704a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  for (int i = 0; i < alternatives->length(); i++) {
7714a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org    if (!alternatives->at(i)->IsAnchoredAtEnd())
7724a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org      return false;
7734a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  }
7744a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return true;
7754a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
7764a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7774a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7784a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpLookahead::IsAnchoredAtStart() {
7794a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return is_positive() && body()->IsAnchoredAtStart();
7804a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org}
7814a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7824a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org
7834a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpCapture::IsAnchoredAtStart() {
7844a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return body()->IsAnchoredAtStart();
785ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
786ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
787ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
7884a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpCapture::IsAnchoredAtEnd() {
7894a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org  return body()->IsAnchoredAtEnd();
790ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org}
791ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
792ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org
793a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Convert regular expression trees to a simple sexp representation.
794a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// This representation should be different from the input grammar
795a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// in as many cases as possible, to make it more difficult for incorrect
796a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// parses to look as correct ones which is likely if the input and
797a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// output formats are alike.
798ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass RegExpUnparser FINAL : public RegExpVisitor {
799a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public:
800f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  RegExpUnparser(OStream& os, Zone* zone) : os_(os), zone_(zone) {}
801a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  void VisitCharacterRange(CharacterRange that);
80232cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org#define MAKE_CASE(Name) virtual void* Visit##Name(RegExp##Name*,          \
803ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org                                                  void* data) OVERRIDE;
804a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE)
805a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_CASE
806a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private:
807f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  OStream& os_;
8087028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  Zone* zone_;
809a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org};
810a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
811a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
812a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitDisjunction(RegExpDisjunction* that, void* data) {
813f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "(|";
814a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  for (int i = 0; i <  that->alternatives()->length(); i++) {
815f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os_ << " ";
816a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    that->alternatives()->at(i)->Accept(this, data);
817a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
818f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << ")";
819a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
820a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
821a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
822a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
823a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitAlternative(RegExpAlternative* that, void* data) {
824f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "(:";
825a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  for (int i = 0; i <  that->nodes()->length(); i++) {
826f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os_ << " ";
827a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    that->nodes()->at(i)->Accept(this, data);
828a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
829f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << ")";
830a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
831a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
832a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
833a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
834a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpUnparser::VisitCharacterRange(CharacterRange that) {
835f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << AsUC16(that.from());
836a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  if (!that.IsSingleton()) {
837f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os_ << "-" << AsUC16(that.to());
838a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
839a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
840a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
841a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
842a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
843a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that,
844a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org                                          void* data) {
845f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (that->is_negated()) os_ << "^";
846f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "[";
8477028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  for (int i = 0; i < that->ranges(zone_)->length(); i++) {
848f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    if (i > 0) os_ << " ";
8497028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org    VisitCharacterRange(that->ranges(zone_)->at(i));
850a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
851f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "]";
852a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
853a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
854a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
855a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
856a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitAssertion(RegExpAssertion* that, void* data) {
857dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  switch (that->assertion_type()) {
858a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    case RegExpAssertion::START_OF_INPUT:
859f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os_ << "@^i";
860a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      break;
861a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    case RegExpAssertion::END_OF_INPUT:
862f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os_ << "@$i";
863a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      break;
864a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    case RegExpAssertion::START_OF_LINE:
865f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os_ << "@^l";
866a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      break;
867a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    case RegExpAssertion::END_OF_LINE:
868f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os_ << "@$l";
869a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org       break;
870a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    case RegExpAssertion::BOUNDARY:
871f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os_ << "@b";
872a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      break;
873a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    case RegExpAssertion::NON_BOUNDARY:
874f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os_ << "@B";
875a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org      break;
876a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
877a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
878a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
879a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
880a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
881a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitAtom(RegExpAtom* that, void* data) {
882f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "'";
883a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Vector<const uc16> chardata = that->data();
884a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  for (int i = 0; i < chardata.length(); i++) {
885f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os_ << AsUC16(chardata[i]);
886a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
887f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "'";
888a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
889a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
890a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
891a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
892a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitText(RegExpText* that, void* data) {
893a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  if (that->elements()->length() == 1) {
8949259716434187c932704601f700375e53d865de8rossberg@chromium.org    that->elements()->at(0).tree()->Accept(this, data);
895a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  } else {
896f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os_ << "(!";
897a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    for (int i = 0; i < that->elements()->length(); i++) {
898f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os_ << " ";
8999259716434187c932704601f700375e53d865de8rossberg@chromium.org      that->elements()->at(i).tree()->Accept(this, data);
900a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org    }
901f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os_ << ")";
902a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
903a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
904a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
905a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
906a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
907a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitQuantifier(RegExpQuantifier* that, void* data) {
908f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "(# " << that->min() << " ";
90937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  if (that->max() == RegExpTree::kInfinity) {
910f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os_ << "- ";
911a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  } else {
912f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os_ << that->max() << " ";
913a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  }
914f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << (that->is_greedy() ? "g " : that->is_possessive() ? "p " : "n ");
915a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  that->body()->Accept(this, data);
916f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << ")";
917a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
918a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
919a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
920a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
921a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitCapture(RegExpCapture* that, void* data) {
922f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "(^ ";
923a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  that->body()->Accept(this, data);
924f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << ")";
925a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
926a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
927a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
928a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
929a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitLookahead(RegExpLookahead* that, void* data) {
930f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "(-> " << (that->is_positive() ? "+ " : "- ");
931a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  that->body()->Accept(this, data);
932f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << ")";
933a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
934a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
935a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
936a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
937a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitBackReference(RegExpBackReference* that,
938a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org                                         void* data) {
939f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << "(<- " << that->index() << ")";
940a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
941a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
942a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
943a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
944a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitEmpty(RegExpEmpty* that, void* data) {
945f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os_ << '%';
946a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  return NULL;
947a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
948a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
949a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
950f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& RegExpTree::Print(OStream& os, Zone* zone) {  // NOLINT
951f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  RegExpUnparser unparser(os, zone);
952a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org  Accept(&unparser, NULL);
953f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
954a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}
955a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
956a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org
95737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comRegExpDisjunction::RegExpDisjunction(ZoneList<RegExpTree*>* alternatives)
95837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    : alternatives_(alternatives) {
959e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(alternatives->length() > 1);
96037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  RegExpTree* first_alternative = alternatives->at(0);
96137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  min_match_ = first_alternative->min_match();
96237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  max_match_ = first_alternative->max_match();
96337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  for (int i = 1; i < alternatives->length(); i++) {
96437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    RegExpTree* alternative = alternatives->at(i);
96537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    min_match_ = Min(min_match_, alternative->min_match());
96637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    max_match_ = Max(max_match_, alternative->max_match());
96737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
96837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
96937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
97037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
971212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgstatic int IncreaseBy(int previous, int increase) {
972212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  if (RegExpTree::kInfinity - previous < increase) {
973212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    return RegExpTree::kInfinity;
974212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  } else {
975212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    return previous + increase;
976212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org  }
977212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org}
978212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org
97937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comRegExpAlternative::RegExpAlternative(ZoneList<RegExpTree*>* nodes)
98037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    : nodes_(nodes) {
981e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(nodes->length() > 1);
98237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  min_match_ = 0;
98337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  max_match_ = 0;
98437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  for (int i = 0; i < nodes->length(); i++) {
98537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    RegExpTree* node = nodes->at(i);
986212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    int node_min_match = node->min_match();
987212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    min_match_ = IncreaseBy(min_match_, node_min_match);
98837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com    int node_max_match = node->max_match();
989212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org    max_match_ = IncreaseBy(max_match_, node_max_match);
99037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com  }
99137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com}
99237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com
9935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
994a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgCaseClause::CaseClause(Zone* zone, Expression* label,
995a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                       ZoneList<Statement*>* statements, int pos, IdGen* id_gen)
996a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    : Expression(zone, pos, id_gen),
997a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org      label_(label),
998a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      statements_(statements),
9996d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org      compare_type_(Type::None(zone)),
1000a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      compare_id_(id_gen->GetNextId()),
1001a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      entry_id_(id_gen->GetNextId()) {}
1002dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org
1003b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
10049e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#define REGULAR_NODE(NodeType)                                   \
1005b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
10069e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    increase_node_count();                                       \
1007b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
10089e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#define REGULAR_NODE_WITH_FEEDBACK_SLOTS(NodeType)               \
1009f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
10109e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    increase_node_count();                                       \
10119e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_slot_node(node);                                         \
1012f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
10139e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#define DONT_OPTIMIZE_NODE(NodeType)                             \
1014ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
10159e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    increase_node_count();                                       \
10169e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    set_dont_crankshaft_reason(k##NodeType);                     \
10179e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_flag(kDontSelfOptimize);                                 \
1018ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  }
10199e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#define DONT_OPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(NodeType)         \
10209d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
10219e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    increase_node_count();                                       \
10229e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_slot_node(node);                                         \
10239e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    set_dont_crankshaft_reason(k##NodeType);                     \
10249e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_flag(kDontSelfOptimize);                                 \
10259e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  }
10269e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#define DONT_TURBOFAN_NODE(NodeType)                             \
10279e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org  void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
10289e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    increase_node_count();                                       \
10299e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    set_dont_crankshaft_reason(k##NodeType);                     \
10309e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    set_dont_turbofan_reason(k##NodeType);                       \
10319e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_flag(kDontSelfOptimize);                                 \
10329d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  }
10339d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org#define DONT_SELFOPTIMIZE_NODE(NodeType)                         \
1034ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
10359e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    increase_node_count();                                       \
10369e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_flag(kDontSelfOptimize);                                 \
1037ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  }
10389e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#define DONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(NodeType)     \
1039f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
10409e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    increase_node_count();                                       \
10419e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_slot_node(node);                                         \
10429e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_flag(kDontSelfOptimize);                                 \
1043f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
10449e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org#define DONT_CACHE_NODE(NodeType)                                \
104581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \
10469e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    increase_node_count();                                       \
10479e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    set_dont_crankshaft_reason(k##NodeType);                     \
10489e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_flag(kDontSelfOptimize);                                 \
10499e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    add_flag(kDontCache);                                        \
105081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  }
1051b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1052ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(VariableDeclaration)
1053ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(FunctionDeclaration)
1054ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Block)
1055ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ExpressionStatement)
1056ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(EmptyStatement)
1057ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(IfStatement)
1058ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ContinueStatement)
1059ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(BreakStatement)
1060ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ReturnStatement)
1061fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgREGULAR_NODE(SwitchStatement)
1062a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgREGULAR_NODE(CaseClause)
1063ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Conditional)
1064ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Literal)
10652bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgREGULAR_NODE(ArrayLiteral)
1066ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ObjectLiteral)
10679c741c80bfc8026103e86b46e15e2544095ce67eyangguo@chromium.orgREGULAR_NODE(RegExpLiteral)
10682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgREGULAR_NODE(FunctionLiteral)
1069ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Assignment)
1070ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Throw)
1071ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(UnaryOperation)
1072ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(CountOperation)
1073ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(BinaryOperation)
1074ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(CompareOperation)
1075ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ThisFunction)
10769d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
1077f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgREGULAR_NODE_WITH_FEEDBACK_SLOTS(Call)
1078f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgREGULAR_NODE_WITH_FEEDBACK_SLOTS(CallNew)
10799d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgREGULAR_NODE_WITH_FEEDBACK_SLOTS(Property)
1080ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// In theory, for VariableProxy we'd have to add:
10816fbe38f254bead420fb1c779e97dbeb71e92d23cyangguo@chromium.org// if (node->var()->IsLookupSlot())
10826fbe38f254bead420fb1c779e97dbeb71e92d23cyangguo@chromium.org//   set_dont_optimize_reason(kReferenceToAVariableWhichRequiresDynamicLookup);
1083ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// But node->var() is usually not bound yet at VariableProxy creation time, and
1084ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// LOOKUP variables only result from constructs that cannot be inlined anyway.
10859d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgREGULAR_NODE_WITH_FEEDBACK_SLOTS(VariableProxy)
1086ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
10878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org// We currently do not optimize any modules.
1088ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ModuleDeclaration)
1089ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ImportDeclaration)
1090ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ExportDeclaration)
1091ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ModuleVariable)
1092ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ModulePath)
1093ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ModuleUrl)
10948e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgDONT_OPTIMIZE_NODE(ModuleStatement)
1095ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(WithStatement)
1096ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(DebuggerStatement)
1097a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgDONT_OPTIMIZE_NODE(ClassLiteral)
1098fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.orgDONT_OPTIMIZE_NODE(NativeFunctionLiteral)
10995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgDONT_OPTIMIZE_NODE(SuperReference)
1100ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
11019d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgDONT_OPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(Yield)
11029d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
11039e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org// TODO(turbofan): Remove the dont_turbofan_reason once this list is empty.
11049e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgDONT_TURBOFAN_NODE(ForOfStatement)
11059e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgDONT_TURBOFAN_NODE(TryCatchStatement)
11069e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.orgDONT_TURBOFAN_NODE(TryFinallyStatement)
11079e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org
1108ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_SELFOPTIMIZE_NODE(DoWhileStatement)
1109ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_SELFOPTIMIZE_NODE(WhileStatement)
1110ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_SELFOPTIMIZE_NODE(ForStatement)
1111b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
11129d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.orgDONT_SELFOPTIMIZE_NODE_WITH_FEEDBACK_SLOTS(ForInStatement)
11139d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org
111481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgDONT_CACHE_NODE(ModuleLiteral)
111581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
1116f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
1117b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgvoid AstConstructionVisitor::VisitCallRuntime(CallRuntime* node) {
1118b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  increase_node_count();
11199d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org  add_slot_node(node);
1120b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  if (node->is_jsruntime()) {
11216fbe38f254bead420fb1c779e97dbeb71e92d23cyangguo@chromium.org    // Don't try to optimize JS runtime calls because we bailout on them.
11229e2b466e4b4a2026caefa79afe6737f1bad83a19machenbach@chromium.org    set_dont_crankshaft_reason(kCallToAJavaScriptRuntimeFunction);
1123b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org  }
1124b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org}
1125b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org
1126ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#undef REGULAR_NODE
1127ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#undef DONT_OPTIMIZE_NODE
1128ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#undef DONT_SELFOPTIMIZE_NODE
112981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org#undef DONT_CACHE_NODE
1130ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
1131bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
1132bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comHandle<String> Literal::ToString() {
113308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  if (value_->IsString()) return value_->AsString()->string();
1134e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(value_->IsNumber());
1135bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  char arr[100];
1136fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org  Vector<char> buffer(arr, arraysize(arr));
1137bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  const char* str;
113808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  if (value()->IsSmi()) {
1139bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    // Optimization only, the heap number case would subsume this.
114008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    SNPrintF(buffer, "%d", Smi::cast(*value())->value());
1141bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    str = arr;
1142bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  } else {
114308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org    str = DoubleToCString(value()->Number(), buffer);
1144bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  }
11458496027a525ad457b6d5729faf41f29100a27264machenbach@chromium.org  return isolate_->factory()->NewStringFromAsciiChecked(str);
1146bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com}
1147bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
1148bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
114943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
1150