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