1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met: 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions of source code must retain the above copyright 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// notice, this list of conditions and the following disclaimer. 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Redistributions in binary form must reproduce the above 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// copyright notice, this list of conditions and the following 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// disclaimer in the documentation and/or other materials provided 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// with the distribution. 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// * Neither the name of Google Inc. nor the names of its 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// contributors may be used to endorse or promote products derived 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// from this software without specific prior written permission. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "ast.h" 29659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 3077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org#include <cmath> // For isfinite. 31659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#include "builtins.h" 326bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org#include "code-stubs.h" 33c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org#include "contexts.h" 34659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#include "conversions.h" 35659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#include "hashmap.h" 363811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org#include "parser.h" 37659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#include "property-details.h" 38659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#include "property.h" 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "scopes.h" 40a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "string-stream.h" 4144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org#include "type-info.h" 4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 4471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// All the Accept member functions for each syntax tree node type. 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4925156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org#define DECL_ACCEPT(type) \ 5025156ded31ef771a2d799ed902483d83b3ebcbdclrn@chromium.org void type::Accept(AstVisitor* v) { v->Visit##type(this); } 510b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgAST_NODE_LIST(DECL_ACCEPT) 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef DECL_ACCEPT 5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Implementation of other node functionality. 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 59c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgbool Expression::IsSmiLiteral() { 601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return AsLiteral() != NULL && AsLiteral()->value()->IsSmi(); 61c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org} 62c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 63c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org 64c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgbool Expression::IsStringLiteral() { 651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return AsLiteral() != NULL && AsLiteral()->value()->IsString(); 66f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org} 67f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 68f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 69c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.orgbool Expression::IsNullLiteral() { 701510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return AsLiteral() != NULL && AsLiteral()->value()->IsNull(); 71f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org} 72f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 73f837290e142d49c9e1332841ec2c49ee2f09584avegorov@chromium.org 7496a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.orgbool Expression::IsUndefinedLiteral(Isolate* isolate) { 7596a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org VariableProxy* var_proxy = AsVariableProxy(); 7696a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org if (var_proxy == NULL) return false; 7796a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org Variable* var = var_proxy->var(); 7896a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org // The global identifier "undefined" is immutable. Everything 7996a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org // else could be reassigned. 8096a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org return var != NULL && var->location() == Variable::UNALLOCATED && 8196a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org var_proxy->name()->Equals(isolate->heap()->undefined_string()); 82ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org} 83ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 84ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 85a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgVariableProxy::VariableProxy(Isolate* isolate, Variable* var, int position) 86a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : Expression(isolate, position), 87717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org name_(var->name()), 884a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org var_(NULL), // Will be set by the call to BindTo. 894a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org is_this_(var->is_this()), 90c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org is_trivial_(false), 9164e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org is_lvalue_(false), 92bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com interface_(var->interface()) { 934a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org BindTo(var); 944a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org} 954a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 964a1fe7d5e92fdb673d5f05d5ddf7b1ed703ba18dwhesse@chromium.org 97717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.orgVariableProxy::VariableProxy(Isolate* isolate, 98717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org Handle<String> name, 9943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen bool is_this, 10028583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org Interface* interface, 10128583c92ca8f528df625800519088ac88996d504jkummerow@chromium.org int position) 102a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : Expression(isolate, position), 103717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org name_(name), 104717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org var_(NULL), 105717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org is_this_(is_this), 106717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org is_trivial_(false), 10764e3a4be4a99f31920128de34573c8ac9038de42ricow@chromium.org is_lvalue_(false), 108bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com interface_(interface) { 109c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org // Names must be canonicalized for fast equality checks. 1104a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org ASSERT(name->IsInternalizedString()); 11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid VariableProxy::BindTo(Variable* var) { 11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(var_ == NULL); // must be bound only once 11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT(var != NULL); // must bind 1178e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org ASSERT(!FLAG_harmony_modules || interface_->IsUnified(var->interface())); 11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ASSERT((is_this() && var->is_this()) || name_.is_identical_to(var->name())); 11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Ideally CONST-ness should match. However, this is very hard to achieve 12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // because we don't know the exact semantics of conflicting (const and 12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // non-const) multiple variable declarations, const vars introduced via 12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // eval() etc. Const-ness and variable declarations are a complete mess 12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // in JS. Sigh... 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen var_ = var; 125ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org var->set_is_used(true); 12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 129717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.orgAssignment::Assignment(Isolate* isolate, 130717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org Token::Value op, 131a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Expression* target, 132a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Expression* value, 133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int pos) 134a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : Expression(isolate, pos), 135717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org op_(op), 136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org target_(target), 137a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org value_(value), 1385f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org binary_operation_(NULL), 139717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org assignment_id_(GetNextId(isolate)), 1401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org is_uninitialized_(false), 141c9913f099d68d3604e53b19d0fc5abe309143bdcbmeurer@chromium.org is_pre_monomorphic_(false), 1427bd87f0fe09b5d7c12de8f1db0bdb759dc4130acjkummerow@chromium.org store_mode_(STANDARD_STORE) { } 143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 144a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenToken::Value Assignment::binary_op() const { 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (op_) { 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_BIT_OR: return Token::BIT_OR; 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_BIT_XOR: return Token::BIT_XOR; 14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_BIT_AND: return Token::BIT_AND; 15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_SHL: return Token::SHL; 15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_SAR: return Token::SAR; 15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_SHR: return Token::SHR; 15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_ADD: return Token::ADD; 15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_SUB: return Token::SUB; 15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_MUL: return Token::MUL; 15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_DIV: return Token::DIV; 15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case Token::ASSIGN_MOD: return Token::MOD; 15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: UNREACHABLE(); 15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return Token::ILLEGAL; 16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenbool FunctionLiteral::AllowsLazyCompilation() { 16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return scope()->AllowsLazyCompilation(); 16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1695a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgbool FunctionLiteral::AllowsLazyCompilationWithoutContext() { 1705a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org return scope()->AllowsLazyCompilationWithoutContext(); 1715a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org} 1725a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 1735a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 174c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgint FunctionLiteral::start_position() const { 175c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return scope()->start_position(); 176c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org} 177c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 178c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 179c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.orgint FunctionLiteral::end_position() const { 180c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org return scope()->end_position(); 181c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org} 182c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 183c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 1841b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgLanguageMode FunctionLiteral::language_mode() const { 1851b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org return scope()->language_mode(); 186c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org} 187c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 188c612e0211bdb8821cbd7886e15b0273ed82d2e9edanno@chromium.org 189c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgObjectLiteralProperty::ObjectLiteralProperty(Literal* key, 190c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Expression* value, 191c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org Isolate* isolate) { 192e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org emit_store_ = true; 19343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen key_ = key; 19443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen value_ = value; 1951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Object* k = *key->value(); 1964a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org if (k->IsInternalizedString() && 1974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org isolate->heap()->proto_string()->Equals(String::cast(k))) { 19843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kind_ = PROTOTYPE; 199bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org } else if (value_->AsMaterializedLiteral() != NULL) { 200bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org kind_ = MATERIALIZED_LITERAL; 201bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org } else if (value_->AsLiteral() != NULL) { 202bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org kind_ = CONSTANT; 20343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 204bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org kind_ = COMPUTED; 20543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 20643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 209c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgObjectLiteralProperty::ObjectLiteralProperty(bool is_getter, 210c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org FunctionLiteral* value) { 211e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org emit_store_ = true; 21243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen value_ = value; 21343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen kind_ = is_getter ? GETTER : SETTER; 21443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 21543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 21643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2173811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgbool ObjectLiteral::Property::IsCompileTimeValue() { 2183811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return kind_ == CONSTANT || 2193811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org (kind_ == MATERIALIZED_LITERAL && 2203811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org CompileTimeValue::IsCompileTimeValue(value_)); 2213811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 2223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2233811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 224e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgvoid ObjectLiteral::Property::set_emit_store(bool emit_store) { 225e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org emit_store_ = emit_store; 226e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org} 227e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 228e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 229e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgbool ObjectLiteral::Property::emit_store() { 230e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org return emit_store_; 231e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org} 232e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 233e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 2347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid ObjectLiteral::CalculateEmitStore(Zone* zone) { 2357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org ZoneAllocationPolicy allocator(zone); 2367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org 2377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org ZoneHashMap table(Literal::Match, ZoneHashMap::kDefaultHashMapCapacity, 2387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org allocator); 239bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com for (int i = properties()->length() - 1; i >= 0; i--) { 240bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com ObjectLiteral::Property* property = properties()->at(i); 241e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org Literal* literal = property->key(); 2421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (literal->value()->IsNull()) continue; 243bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com uint32_t hash = literal->Hash(); 244e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // If the key of a computed property is in the table, do not emit 245e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // a store for the property later. 246c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org if ((property->kind() == ObjectLiteral::Property::MATERIALIZED_LITERAL || 247c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org property->kind() == ObjectLiteral::Property::COMPUTED) && 2487028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org table.Lookup(literal, hash, false, allocator) != NULL) { 249bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com property->set_emit_store(false); 250bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } else { 251bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Add key to the table. 2527028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org table.Lookup(literal, hash, true, allocator); 253e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org } 254e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org } 255e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org} 256e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 257e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org 258e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgbool ObjectLiteral::IsBoilerplateProperty(ObjectLiteral::Property* property) { 259e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return property != NULL && 260e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org property->kind() != ObjectLiteral::Property::PROTOTYPE; 261e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 262e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 263e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 2647ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvoid ObjectLiteral::BuildConstantProperties(Isolate* isolate) { 265e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (!constant_properties_.is_null()) return; 266e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 267e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Allocate a fixed array to hold all the constant properties. 268e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<FixedArray> constant_properties = isolate->factory()->NewFixedArray( 269e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org boilerplate_properties_ * 2, TENURED); 270e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 271e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org int position = 0; 272e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Accumulate the value in local variables and store it at the end. 273e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org bool is_simple = true; 274e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org int depth_acc = 1; 275e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org uint32_t max_element_index = 0; 276e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org uint32_t elements = 0; 277e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org for (int i = 0; i < properties()->length(); i++) { 278e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ObjectLiteral::Property* property = properties()->at(i); 279e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (!IsBoilerplateProperty(property)) { 280e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org is_simple = false; 281e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org continue; 282e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 283e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org MaterializedLiteral* m_literal = property->value()->AsMaterializedLiteral(); 284e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (m_literal != NULL) { 2857ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org m_literal->BuildConstants(isolate); 2867ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org if (m_literal->depth() >= depth_acc) depth_acc = m_literal->depth() + 1; 287e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 288e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 289e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Add CONSTANT and COMPUTED properties to boilerplate. Use undefined 290e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // value for COMPUTED properties, the real value is filled in at 291e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // runtime. The enumeration order is maintained. 292e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<Object> key = property->key()->value(); 293e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<Object> value = GetBoilerplateValue(property->value(), isolate); 294e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 295e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Ensure objects that may, at any point in time, contain fields with double 296e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // representation are always treated as nested objects. This is true for 297e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // computed fields (value is undefined), and smi and double literals 298e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // (value->IsNumber()). 299e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // TODO(verwaest): Remove once we can store them inline. 300e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (FLAG_track_double_fields && 301e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org (value->IsNumber() || value->IsUninitialized())) { 302e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org may_store_doubles_ = true; 303e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 304e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 305e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org is_simple = is_simple && !value->IsUninitialized(); 306e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 307e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Keep track of the number of elements in the object literal and 308e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // the largest element index. If the largest element index is 309e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // much larger than the number of elements, creating an object 310e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // literal with fast elements will be a waste of space. 311e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org uint32_t element_index = 0; 312e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (key->IsString() 313e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org && Handle<String>::cast(key)->AsArrayIndex(&element_index) 314e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org && element_index > max_element_index) { 315e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org max_element_index = element_index; 316e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org elements++; 317e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } else if (key->IsSmi()) { 318e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org int key_value = Smi::cast(*key)->value(); 319e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (key_value > 0 320e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org && static_cast<uint32_t>(key_value) > max_element_index) { 321e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org max_element_index = key_value; 322e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 323e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org elements++; 324e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 325e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 326e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Add name, value pair to the fixed array. 327e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org constant_properties->set(position++, *key); 328e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org constant_properties->set(position++, *value); 329e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 330e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 331e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org constant_properties_ = constant_properties; 332e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org fast_elements_ = 333e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org (max_element_index <= 32) || ((2 * elements) >= max_element_index); 334e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org set_is_simple(is_simple); 3357ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org set_depth(depth_acc); 336e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 337e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 338e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 3397ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvoid ArrayLiteral::BuildConstantElements(Isolate* isolate) { 340e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (!constant_elements_.is_null()) return; 341e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 342e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Allocate a fixed array to hold all the object literals. 343e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<JSArray> array = 344e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org isolate->factory()->NewJSArray(0, FAST_HOLEY_SMI_ELEMENTS); 345e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org isolate->factory()->SetElementsCapacityAndLength( 346e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org array, values()->length(), values()->length()); 347e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 348e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Fill in the literals. 349e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org bool is_simple = true; 350e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org int depth_acc = 1; 351e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org bool is_holey = false; 352e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org for (int i = 0, n = values()->length(); i < n; i++) { 353e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Expression* element = values()->at(i); 354e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org MaterializedLiteral* m_literal = element->AsMaterializedLiteral(); 355e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (m_literal != NULL) { 3567ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org m_literal->BuildConstants(isolate); 3577ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org if (m_literal->depth() + 1 > depth_acc) { 3587ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org depth_acc = m_literal->depth() + 1; 3597ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org } 360e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 361e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<Object> boilerplate_value = GetBoilerplateValue(element, isolate); 362e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (boilerplate_value->IsTheHole()) { 363e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org is_holey = true; 364e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } else if (boilerplate_value->IsUninitialized()) { 365e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org is_simple = false; 366e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org JSObject::SetOwnElement( 367e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org array, i, handle(Smi::FromInt(0), isolate), kNonStrictMode); 368e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } else { 369e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org JSObject::SetOwnElement(array, i, boilerplate_value, kNonStrictMode); 370e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 371e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 372e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 373e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<FixedArrayBase> element_values(array->elements()); 374e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 375e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Simple and shallow arrays can be lazily copied, we transform the 376e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // elements array to a copy-on-write array. 377e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (is_simple && depth_acc == 1 && values()->length() > 0 && 378e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org array->HasFastSmiOrObjectElements()) { 379e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org element_values->set_map(isolate->heap()->fixed_cow_array_map()); 380e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 381e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 382e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // Remember both the literal's constant values as well as the ElementsKind 383e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org // in a 2-element FixedArray. 384e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Handle<FixedArray> literals = isolate->factory()->NewFixedArray(2, TENURED); 385e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 386e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ElementsKind kind = array->GetElementsKind(); 387e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org kind = is_holey ? GetHoleyElementsKind(kind) : GetPackedElementsKind(kind); 388e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 389e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org literals->set(0, Smi::FromInt(kind)); 390e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org literals->set(1, *element_values); 391e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 392e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org constant_elements_ = literals; 393e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org set_is_simple(is_simple); 3947ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org set_depth(depth_acc); 395e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 396e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 397e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 398e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgHandle<Object> MaterializedLiteral::GetBoilerplateValue(Expression* expression, 399e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org Isolate* isolate) { 400e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (expression->AsLiteral() != NULL) { 401e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return expression->AsLiteral()->value(); 402e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 403e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (CompileTimeValue::IsCompileTimeValue(expression)) { 404e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return CompileTimeValue::GetValue(isolate, expression); 405e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 406e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org return isolate->factory()->uninitialized_value(); 407e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 408e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 409e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 4107ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.orgvoid MaterializedLiteral::BuildConstants(Isolate* isolate) { 411e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (IsArrayLiteral()) { 4127ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org return AsArrayLiteral()->BuildConstantElements(isolate); 413e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 414e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org if (IsObjectLiteral()) { 4157ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org return AsObjectLiteral()->BuildConstantProperties(isolate); 416e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org } 417e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org ASSERT(IsRegExpLiteral()); 4187ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org ASSERT(depth() >= 1); // Depth should be initialized. 419e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org} 420e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 421e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org 4227028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgvoid TargetCollector::AddTarget(Label* target, Zone* zone) { 42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Add the label to the collector, but discard duplicates. 4246d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org int length = targets_.length(); 42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < length; i++) { 4266d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org if (targets_[i] == target) return; 42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 4287028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org targets_.Add(target, zone); 42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4321510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid UnaryOperation::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) { 4331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // TODO(olivf) If this Operation is used in a test context, then the 4341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // expression has a ToBoolean stub and we want to collect the type 4351510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // information. However the GraphBuilder expects it to be on the instruction 4361510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // corresponding to the TestContext, therefore we have to store it here and 4371510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // not on the operand. 4381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_to_boolean_types(oracle->ToBooleanTypes(expression()->test_id())); 4391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 4401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid BinaryOperation::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) { 4431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // TODO(olivf) If this Operation is used in a test context, then the right 4441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // hand side has a ToBoolean stub and we want to collect the type information. 4451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // However the GraphBuilder expects it to be on the instruction corresponding 4461510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // to the TestContext, therefore we have to store it here and not on the 4471510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org // right hand operand. 4481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org set_to_boolean_types(oracle->ToBooleanTypes(right()->test_id())); 4491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} 4501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 4511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 45265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.orgbool BinaryOperation::ResultOverwriteAllowed() { 45365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org switch (op_) { 45465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::COMMA: 45565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::OR: 45665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::AND: 45765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org return false; 45865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::BIT_OR: 45965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::BIT_XOR: 46065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::BIT_AND: 46165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::SHL: 46265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::SAR: 46365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::SHR: 46465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::ADD: 46565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::SUB: 46665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::MUL: 46765fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::DIV: 46865fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org case Token::MOD: 46965fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org return true; 47065fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org default: 47165fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org UNREACHABLE(); 47265fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org } 47365fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org return false; 47465fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org} 47565fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 47665fae84840520e9ce49a78bf542abf073b49ac3fricow@chromium.org 477c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool IsTypeof(Expression* expr) { 478c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com UnaryOperation* maybe_unary = expr->AsUnaryOperation(); 479c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return maybe_unary != NULL && maybe_unary->op() == Token::TYPEOF; 480c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 481c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 482c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 483c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Check for the pattern: typeof <expression> equals <string literal>. 484c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool MatchLiteralCompareTypeof(Expression* left, 485c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Token::Value op, 486c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Expression* right, 487c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Expression** expr, 488c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Handle<String>* check) { 489c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (IsTypeof(left) && right->IsStringLiteral() && Token::IsEqualityOp(op)) { 490c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *expr = left->AsUnaryOperation()->expression(); 4911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org *check = Handle<String>::cast(right->AsLiteral()->value()); 49204921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org return true; 49304921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 494c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return false; 495c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 496c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 49704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 498c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool CompareOperation::IsLiteralCompareTypeof(Expression** expr, 499c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Handle<String>* check) { 500c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return MatchLiteralCompareTypeof(left_, op_, right_, expr, check) || 501c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MatchLiteralCompareTypeof(right_, op_, left_, expr, check); 502c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 503c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 504c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 505c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool IsVoidOfLiteral(Expression* expr) { 506c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com UnaryOperation* maybe_unary = expr->AsUnaryOperation(); 507c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return maybe_unary != NULL && 508c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com maybe_unary->op() == Token::VOID && 509c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com maybe_unary->expression()->AsLiteral() != NULL; 510c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 511c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 512c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com 513ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// Check for the pattern: void <literal> equals <expression> or 514ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org// undefined equals <expression> 515c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool MatchLiteralCompareUndefined(Expression* left, 516c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Token::Value op, 517c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Expression* right, 51896a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org Expression** expr, 51996a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org Isolate* isolate) { 520c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (IsVoidOfLiteral(left) && Token::IsEqualityOp(op)) { 521ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org *expr = right; 522ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org return true; 523ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org } 52496a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org if (left->IsUndefinedLiteral(isolate) && Token::IsEqualityOp(op)) { 525c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *expr = right; 52604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org return true; 52704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 52804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org return false; 52904921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org} 53004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 53104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 53296a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.orgbool CompareOperation::IsLiteralCompareUndefined( 53396a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org Expression** expr, Isolate* isolate) { 53496a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org return MatchLiteralCompareUndefined(left_, op_, right_, expr, isolate) || 53596a3c512c0c7fd9e0e1d6bb0a965a3fd051705eajkummerow@chromium.org MatchLiteralCompareUndefined(right_, op_, left_, expr, isolate); 536c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 53704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 53804921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 539c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com// Check for the pattern: null equals <expression> 540c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.comstatic bool MatchLiteralCompareNull(Expression* left, 541c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Token::Value op, 542c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Expression* right, 543c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Expression** expr) { 544c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (left->IsNullLiteral() && Token::IsEqualityOp(op)) { 545c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com *expr = right; 54604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org return true; 54704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org } 548c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return false; 549c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com} 55004921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 55104921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 552c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.combool CompareOperation::IsLiteralCompareNull(Expression** expr) { 553c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com return MatchLiteralCompareNull(left_, op_, right_, expr) || 554c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com MatchLiteralCompareNull(right_, op_, left_, expr); 55504921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org} 55604921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 55704921a8093ce8bbec34084bd742b7aa3d299be15ager@chromium.org 55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// ---------------------------------------------------------------------------- 559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Inlining support 560a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 561a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.orgbool Declaration::IsInlineable() const { 56278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org return proxy()->var()->IsStackAllocated(); 56378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org} 56478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org 565812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgbool FunctionDeclaration::IsInlineable() const { 566812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org return false; 567a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org} 568a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 569a9aa5fa8ae2a2b43a94e6462ded2cd51445e9ee3ager@chromium.org 570a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// ---------------------------------------------------------------------------- 571a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Recording of type feedback 572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 5731510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// TODO(rossberg): all RecordTypeFeedback functions should disappear 5741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org// once we use the common type field in the AST consistently. 5751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 5761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 577c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgvoid Expression::RecordToBooleanTypeFeedback(TypeFeedbackOracle* oracle) { 578c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org to_boolean_types_ = oracle->ToBooleanTypes(test_id()); 579c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 580c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 581c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool Call::ComputeTarget(Handle<Map> type, Handle<String> name) { 583994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // If there is an interceptor, we can't compute the target for a direct call. 5842efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org if (type->has_named_interceptor()) return false; 5852efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org 5860ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org if (check_type_ == RECEIVER_MAP_CHECK) { 587994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // For primitive checks the holder is set up to point to the corresponding 588994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // prototype object, i.e. one step of the algorithm below has been already 589994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // performed. For non-primitive checks we clear it to allow computing 590994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // targets for polymorphic calls. 5910ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org holder_ = Handle<JSObject>::null(); 5920ee099beef2c2b38743d657b84a30b626d9178ecager@chromium.org } 593994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org LookupResult lookup(type->GetIsolate()); 594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org while (true) { 595e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // If a dictionary map is found in the prototype chain before the actual 596e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // target, a new target can always appear. In that case, bail out. 597e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // TODO(verwaest): Alternatively a runtime negative lookup on the normal 598e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org // receiver or prototype could be added. 599e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if (type->is_dictionary_map()) return false; 60099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org type->LookupDescriptor(NULL, *name, &lookup); 6019a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org if (lookup.IsFound()) { 6029a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org switch (lookup.type()) { 603fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org case CONSTANT: { 6049a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // We surely know the target for a constant function. 605fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org Handle<Object> constant(lookup.GetConstantFromMap(*type), 606fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org type->GetIsolate()); 607fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (constant->IsJSFunction()) { 608fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org target_ = Handle<JSFunction>::cast(constant); 609fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org return true; 610fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org } 611fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org // Fall through. 612fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org } 6139a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org case NORMAL: 6149a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org case FIELD: 6159a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org case CALLBACKS: 6169a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org case HANDLER: 6179a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org case INTERCEPTOR: 6189a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org // We don't know the target. 6199a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org return false; 62099aa490225c81012235659d9a183226b286178c8yangguo@chromium.org case TRANSITION: 6217a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org case NONEXISTENT: 6227a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org UNREACHABLE(); 6237a6fc815d62905d0c52705b96225b1bd23e00a43jkummerow@chromium.org break; 624994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org } 625a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 626994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // If we reach the end of the prototype chain, we don't know the target. 627994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org if (!type->prototype()->IsJSObject()) return false; 628994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org // Go up the prototype chain, recording where we are currently. 629994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org holder_ = Handle<JSObject>(JSObject::cast(type->prototype())); 630994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org type = Handle<Map>(holder()->map()); 631a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 632a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 633a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 634a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 635a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool Call::ComputeGlobalTarget(Handle<GlobalObject> global, 636c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org LookupResult* lookup) { 637a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org target_ = Handle<JSFunction>::null(); 63841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org cell_ = Handle<Cell>::null(); 63905ed9ddc6ff3a1ab3983c50d378cddfa257869b6jkummerow@chromium.org ASSERT(lookup->IsFound() && 640c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org lookup->type() == NORMAL && 641c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org lookup->holder() == *global); 64241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org cell_ = Handle<Cell>(global->GetPropertyCell(lookup)); 643c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org if (cell_->value()->IsJSFunction()) { 644c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org Handle<JSFunction> candidate(JSFunction::cast(cell_->value())); 645c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org // If the function is in new space we assume it's more likely to 646c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org // change and thus prefer the general IC code. 647c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org if (!lookup->isolate()->heap()->InNewSpace(*candidate)) { 648c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org target_ = candidate; 649c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org return true; 650a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 651a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 652a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return false; 653a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 654a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 656c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.orgHandle<JSObject> Call::GetPrototypeForPrimitiveCheck( 657c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org CheckType check, Isolate* isolate) { 658c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::internal::Context* native_context = isolate->context()->native_context(); 659c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org JSFunction* function = NULL; 660c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org switch (check) { 661c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org case RECEIVER_MAP_CHECK: 662c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org UNREACHABLE(); 663c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org break; 664c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org case STRING_CHECK: 665c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org function = native_context->string_function(); 666c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org break; 667c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org case SYMBOL_CHECK: 668c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org function = native_context->symbol_function(); 669c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org break; 670c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org case NUMBER_CHECK: 671c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org function = native_context->number_function(); 672c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org break; 673c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org case BOOLEAN_CHECK: 674c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org function = native_context->boolean_function(); 675c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org break; 676c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 677c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org ASSERT(function != NULL); 678c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org return Handle<JSObject>(JSObject::cast(function->instance_prototype())); 679c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org} 680c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 681c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org 68240cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.orgvoid Call::RecordTypeFeedback(TypeFeedbackOracle* oracle, 68340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org CallKind call_kind) { 684ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org is_monomorphic_ = oracle->CallIsMonomorphic(CallFeedbackId()); 685a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org Property* property = expression()->AsProperty(); 686c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (property == NULL) { 687c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Function call. Specialize for monomorphic calls. 688ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org if (is_monomorphic_) target_ = oracle->GetCallTarget(CallFeedbackId()); 689ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } else if (property->key()->IsPropertyName()) { 690c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com // Method call. Specialize for the receiver types seen at runtime. 691c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Literal* key = property->key()->AsLiteral(); 6921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ASSERT(key != NULL && key->value()->IsString()); 6931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Handle<String> name = Handle<String>::cast(key->value()); 694ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org check_type_ = oracle->GetCallCheckType(CallFeedbackId()); 695c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com receiver_types_.Clear(); 696639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org if (check_type_ == RECEIVER_MAP_CHECK) { 697ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org oracle->CallReceiverTypes(CallFeedbackId(), 698ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org name, arguments()->length(), call_kind, &receiver_types_); 699639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org is_monomorphic_ = is_monomorphic_ && receiver_types_.length() > 0; 700639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } else { 701639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org holder_ = GetPrototypeForPrimitiveCheck(check_type_, oracle->isolate()); 702639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org receiver_types_.Add(handle(holder_->map()), oracle->zone()); 703639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org } 704ef33a5482a35a9a25f702f8e3f02bb6b49f3854cjkummerow@chromium.org#ifdef ENABLE_SLOW_ASSERTS 705c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (FLAG_enable_slow_asserts) { 706c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com int length = receiver_types_.length(); 707c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com for (int i = 0; i < length; i++) { 708c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com Handle<Map> map = receiver_types_.at(i); 709c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com ASSERT(!map.is_null() && *map != NULL); 710c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com } 711a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 712a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif 713c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com if (is_monomorphic_) { 714639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org Handle<Map> map = receiver_types_.first(); 715c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com is_monomorphic_ = ComputeTarget(map, name); 716c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org } 717ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } else { 718ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org if (is_monomorphic_) { 719ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org keyed_array_call_is_holey_ = 720ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org oracle->KeyedArrayCallIsHoley(CallFeedbackId()); 721ea468886ebe54afda9c81df0e85eea04bbb4f0f2machenbach@chromium.org } 722a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 723a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 724a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 725a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 726967e270a034432457500dbf950d2c4951a929e52ulan@chromium.orgvoid CallNew::RecordTypeFeedback(TypeFeedbackOracle* oracle) { 727ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org allocation_info_cell_ = 728ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org oracle->GetCallNewAllocationInfoCell(CallNewFeedbackId()); 729ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org is_monomorphic_ = oracle->CallNewIsMonomorphic(CallNewFeedbackId()); 730967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org if (is_monomorphic_) { 731ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org target_ = oracle->GetCallNewTarget(CallNewFeedbackId()); 7321fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Object* value = allocation_info_cell_->value(); 733e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org ASSERT(!value->IsTheHole()); 734bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org if (value->IsAllocationSite()) { 735bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org AllocationSite* site = AllocationSite::cast(value); 736bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org elements_kind_ = site->GetElementsKind(); 7371fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org } 738967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org } 739967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org} 740967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org 741967e270a034432457500dbf950d2c4951a929e52ulan@chromium.org 7423233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.orgvoid ObjectLiteral::Property::RecordTypeFeedback(TypeFeedbackOracle* oracle) { 743ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org TypeFeedbackId id = key()->LiteralFeedbackId(); 744aafe5810a82411878a83bbf65e492fa19d152226jkummerow@chromium.org SmallMapList maps; 745aafe5810a82411878a83bbf65e492fa19d152226jkummerow@chromium.org oracle->CollectReceiverTypes(id, &maps); 746aafe5810a82411878a83bbf65e492fa19d152226jkummerow@chromium.org receiver_type_ = maps.length() == 1 ? maps.at(0) 747aafe5810a82411878a83bbf65e492fa19d152226jkummerow@chromium.org : Handle<Map>::null(); 7483233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org} 7493233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org 7503233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org 751a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// ---------------------------------------------------------------------------- 752a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Implementation of AstVisitor 75343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 7549d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstVisitor::VisitDeclarations(ZoneList<Declaration*>* declarations) { 7559d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com for (int i = 0; i < declarations->length(); i++) { 7569d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com Visit(declarations->at(i)); 7579d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com } 7589d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com} 7599d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 7609d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com 761a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid AstVisitor::VisitStatements(ZoneList<Statement*>* statements) { 76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < statements->length(); i++) { 763dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org Statement* stmt = statements->at(i); 764dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org Visit(stmt); 765dc94e19484d1700cb0ec22365444223e49a3ac1ejkummerow@chromium.org if (stmt->IsJump()) break; 76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 770a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid AstVisitor::VisitExpressions(ZoneList<Expression*>* expressions) { 77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (int i = 0; i < expressions->length(); i++) { 77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The variable statement visiting code may pass NULL expressions 77343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // to this code. Maybe this should be handled by introducing an 77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // undefined expression or literal? Revisit this code if this 77543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // changes 77643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Expression* expression = expressions->at(i); 77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (expression != NULL) Visit(expression); 77843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 78043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 78143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 782a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// ---------------------------------------------------------------------------- 783a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Regular expressions 784a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 785a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAKE_ACCEPT(Name) \ 786a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void* RegExp##Name::Accept(RegExpVisitor* visitor, void* data) { \ 787a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return visitor->Visit##Name(this, data); \ 788a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 789a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgFOR_EACH_REG_EXP_TREE_TYPE(MAKE_ACCEPT) 790a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_ACCEPT 791a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 792a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAKE_TYPE_CASE(Name) \ 793a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExp##Name* RegExpTree::As##Name() { \ 794a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; \ 795a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } \ 796a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool RegExpTree::Is##Name() { return false; } 797a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgFOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE) 798a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_TYPE_CASE 799a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 800a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#define MAKE_TYPE_CASE(Name) \ 801a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org RegExp##Name* RegExp##Name::As##Name() { \ 802a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return this; \ 803a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } \ 804a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool RegExp##Name::Is##Name() { return true; } 805a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgFOR_EACH_REG_EXP_TREE_TYPE(MAKE_TYPE_CASE) 806a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_TYPE_CASE 807a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 808a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 8093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgstatic Interval ListCaptureRegisters(ZoneList<RegExpTree*>* children) { 8103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org Interval result = Interval::Empty(); 8113291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org for (int i = 0; i < children->length(); i++) 8123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org result = result.Union(children->at(i)->CaptureRegisters()); 8133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org return result; 8143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 8153291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8173291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpAlternative::CaptureRegisters() { 8183291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org return ListCaptureRegisters(nodes()); 8193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 8203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8223291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpDisjunction::CaptureRegisters() { 8233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org return ListCaptureRegisters(alternatives()); 8243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 8253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8263291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8273291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpLookahead::CaptureRegisters() { 8283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org return body()->CaptureRegisters(); 8293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 8303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8313291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8323291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpCapture::CaptureRegisters() { 8333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org Interval self(StartRegister(index()), EndRegister(index())); 8343291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org return self.Union(body()->CaptureRegisters()); 8353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 8363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8373291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgInterval RegExpQuantifier::CaptureRegisters() { 8393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org return body()->CaptureRegisters(); 8403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 8413291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 8434a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpAssertion::IsAnchoredAtStart() { 844dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org return assertion_type() == RegExpAssertion::START_OF_INPUT; 845ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 846ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 847ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 8484a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpAssertion::IsAnchoredAtEnd() { 849dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org return assertion_type() == RegExpAssertion::END_OF_INPUT; 8504a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org} 8514a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 8524a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 8534a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpAlternative::IsAnchoredAtStart() { 854245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org ZoneList<RegExpTree*>* nodes = this->nodes(); 855245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org for (int i = 0; i < nodes->length(); i++) { 856245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org RegExpTree* node = nodes->at(i); 8574a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org if (node->IsAnchoredAtStart()) { return true; } 8584a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org if (node->max_match() > 0) { return false; } 8594a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org } 8604a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org return false; 8614a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org} 8624a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 8634a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 8644a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpAlternative::IsAnchoredAtEnd() { 8654a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org ZoneList<RegExpTree*>* nodes = this->nodes(); 8664a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org for (int i = nodes->length() - 1; i >= 0; i--) { 8674a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org RegExpTree* node = nodes->at(i); 8684a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org if (node->IsAnchoredAtEnd()) { return true; } 869245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org if (node->max_match() > 0) { return false; } 870245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org } 871245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return false; 872ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 873ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 874ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 8754a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpDisjunction::IsAnchoredAtStart() { 876ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ZoneList<RegExpTree*>* alternatives = this->alternatives(); 877ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org for (int i = 0; i < alternatives->length(); i++) { 8784a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org if (!alternatives->at(i)->IsAnchoredAtStart()) 879ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return false; 880ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 881ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return true; 882ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 883ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 884ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 8854a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpDisjunction::IsAnchoredAtEnd() { 8864a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org ZoneList<RegExpTree*>* alternatives = this->alternatives(); 8874a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org for (int i = 0; i < alternatives->length(); i++) { 8884a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org if (!alternatives->at(i)->IsAnchoredAtEnd()) 8894a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org return false; 8904a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org } 8914a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org return true; 8924a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org} 8934a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 8944a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 8954a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpLookahead::IsAnchoredAtStart() { 8964a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org return is_positive() && body()->IsAnchoredAtStart(); 8974a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org} 8984a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 8994a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 9004a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpCapture::IsAnchoredAtStart() { 9014a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org return body()->IsAnchoredAtStart(); 902ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 903ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 904ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 9054a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgbool RegExpCapture::IsAnchoredAtEnd() { 9064a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org return body()->IsAnchoredAtEnd(); 907ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 908ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 909ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 910a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Convert regular expression trees to a simple sexp representation. 911a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// This representation should be different from the input grammar 912a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// in as many cases as possible, to make it more difficult for incorrect 913a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// parses to look as correct ones which is likely if the input and 914a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// output formats are alike. 91532cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.orgclass RegExpUnparser V8_FINAL : public RegExpVisitor { 916a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org public: 9177028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org explicit RegExpUnparser(Zone* zone); 918a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void VisitCharacterRange(CharacterRange that); 91983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org SmartArrayPointer<const char> ToString() { return stream_.ToCString(); } 92032cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org#define MAKE_CASE(Name) virtual void* Visit##Name(RegExp##Name*, \ 92132cb9b2c195baa85d4c04f4c7b22b9aa04e97d3fverwaest@chromium.org void* data) V8_OVERRIDE; 922a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org FOR_EACH_REG_EXP_TREE_TYPE(MAKE_CASE) 923a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#undef MAKE_CASE 924a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org private: 925a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org StringStream* stream() { return &stream_; } 926a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org HeapStringAllocator alloc_; 927a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org StringStream stream_; 9287028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org Zone* zone_; 929a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org}; 930a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 931a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 9327028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgRegExpUnparser::RegExpUnparser(Zone* zone) : stream_(&alloc_), zone_(zone) { 933a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 934a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 935a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 936a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitDisjunction(RegExpDisjunction* that, void* data) { 937a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("(|"); 938a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org for (int i = 0; i < that->alternatives()->length(); i++) { 939a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(" "); 940a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org that->alternatives()->at(i)->Accept(this, data); 941a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 942a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(")"); 943a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 944a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 945a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 946a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 947a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitAlternative(RegExpAlternative* that, void* data) { 948a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("(:"); 949a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org for (int i = 0; i < that->nodes()->length(); i++) { 950a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(" "); 951a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org that->nodes()->at(i)->Accept(this, data); 952a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 953a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(")"); 954a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 955a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 956a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 957a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 958a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpUnparser::VisitCharacterRange(CharacterRange that) { 959a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("%k", that.from()); 960a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (!that.IsSingleton()) { 961a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("-%k", that.to()); 962a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 963a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 964a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 965a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 966a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 967a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitCharacterClass(RegExpCharacterClass* that, 968a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void* data) { 969a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (that->is_negated()) 970a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("^"); 971a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("["); 9727028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org for (int i = 0; i < that->ranges(zone_)->length(); i++) { 973a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (i > 0) stream()->Add(" "); 9747028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org VisitCharacterRange(that->ranges(zone_)->at(i)); 975a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 976a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("]"); 977a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 978a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 979a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 980a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 981a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitAssertion(RegExpAssertion* that, void* data) { 982dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org switch (that->assertion_type()) { 983a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org case RegExpAssertion::START_OF_INPUT: 984a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("@^i"); 985a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 986a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org case RegExpAssertion::END_OF_INPUT: 987a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("@$i"); 988a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 989a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org case RegExpAssertion::START_OF_LINE: 990a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("@^l"); 991a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 992a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org case RegExpAssertion::END_OF_LINE: 993a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("@$l"); 994a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 995a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org case RegExpAssertion::BOUNDARY: 996a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("@b"); 997a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 998a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org case RegExpAssertion::NON_BOUNDARY: 999a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("@B"); 1000a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 1001a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 1002a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 1003a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1004a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1005a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1006a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitAtom(RegExpAtom* that, void* data) { 1007a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("'"); 1008a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Vector<const uc16> chardata = that->data(); 1009a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org for (int i = 0; i < chardata.length(); i++) { 1010a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("%k", chardata[i]); 1011a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 1012a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("'"); 1013a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 1014a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1015a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1016a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1017a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitText(RegExpText* that, void* data) { 1018a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (that->elements()->length() == 1) { 10199259716434187c932704601f700375e53d865de8rossberg@chromium.org that->elements()->at(0).tree()->Accept(this, data); 1020a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 1021a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("(!"); 1022a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org for (int i = 0; i < that->elements()->length(); i++) { 1023a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(" "); 10249259716434187c932704601f700375e53d865de8rossberg@chromium.org that->elements()->at(i).tree()->Accept(this, data); 1025a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 1026a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(")"); 1027a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 1028a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 1029a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1030a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1031a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1032a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitQuantifier(RegExpQuantifier* that, void* data) { 1033a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("(# %i ", that->min()); 103437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (that->max() == RegExpTree::kInfinity) { 1035a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("- "); 1036a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 1037a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("%i ", that->max()); 1038a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 10390c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org stream()->Add(that->is_greedy() ? "g " : that->is_possessive() ? "p " : "n "); 1040a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org that->body()->Accept(this, data); 1041a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(")"); 1042a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 1043a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1044a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1045a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1046a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitCapture(RegExpCapture* that, void* data) { 1047a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("(^ "); 1048a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org that->body()->Accept(this, data); 1049a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(")"); 1050a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 1051a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1052a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1053a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1054a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitLookahead(RegExpLookahead* that, void* data) { 1055a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("(-> "); 1056a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(that->is_positive() ? "+ " : "- "); 1057a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org that->body()->Accept(this, data); 1058a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add(")"); 1059a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 1060a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1061a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1062a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1063a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitBackReference(RegExpBackReference* that, 1064a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org void* data) { 1065a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Add("(<- %i)", that->index()); 1066a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 1067a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1068a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1069a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1070a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid* RegExpUnparser::VisitEmpty(RegExpEmpty* that, void* data) { 1071a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stream()->Put('%'); 1072a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return NULL; 1073a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1074a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1075a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 10767028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgSmartArrayPointer<const char> RegExpTree::ToString(Zone* zone) { 10777028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org RegExpUnparser unparser(zone); 1078a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Accept(&unparser, NULL); 1079a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return unparser.ToString(); 1080a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 1081a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1082a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 108337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comRegExpDisjunction::RegExpDisjunction(ZoneList<RegExpTree*>* alternatives) 108437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com : alternatives_(alternatives) { 1085ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(alternatives->length() > 1); 108637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com RegExpTree* first_alternative = alternatives->at(0); 108737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com min_match_ = first_alternative->min_match(); 108837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com max_match_ = first_alternative->max_match(); 108937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com for (int i = 1; i < alternatives->length(); i++) { 109037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com RegExpTree* alternative = alternatives->at(i); 109137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com min_match_ = Min(min_match_, alternative->min_match()); 109237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com max_match_ = Max(max_match_, alternative->max_match()); 109337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 109437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 109537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 109637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 1097212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.orgstatic int IncreaseBy(int previous, int increase) { 1098212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org if (RegExpTree::kInfinity - previous < increase) { 1099212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org return RegExpTree::kInfinity; 1100212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org } else { 1101212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org return previous + increase; 1102212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org } 1103212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org} 1104212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org 110537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comRegExpAlternative::RegExpAlternative(ZoneList<RegExpTree*>* nodes) 110637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com : nodes_(nodes) { 1107ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(nodes->length() > 1); 110837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com min_match_ = 0; 110937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com max_match_ = 0; 111037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com for (int i = 0; i < nodes->length(); i++) { 111137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com RegExpTree* node = nodes->at(i); 1112212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org int node_min_match = node->min_match(); 1113212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org min_match_ = IncreaseBy(min_match_, node_min_match); 111437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int node_max_match = node->max_match(); 1115212d964d8f853ddb1fdf3a64037f3af294d55cf3jkummerow@chromium.org max_match_ = IncreaseBy(max_match_, node_max_match); 111637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 111737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 111837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 11195d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1120717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.orgCaseClause::CaseClause(Isolate* isolate, 1121717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org Expression* label, 1122a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org ZoneList<Statement*>* statements, 1123a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org int pos) 1124a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org : AstNode(pos), 1125a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org label_(label), 1126a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org statements_(statements), 112741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org compare_type_(Type::None(), isolate), 1128717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org compare_id_(AstNode::GetNextId(isolate)), 1129717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org entry_id_(AstNode::GetNextId(isolate)) { 11304d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org} 1131dff694e8cc18aa9640e92962de2699b9d07a7690vegorov@chromium.org 1132b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1133ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#define REGULAR_NODE(NodeType) \ 1134b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ 1135b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org increase_node_count(); \ 1136b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 1137ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#define DONT_OPTIMIZE_NODE(NodeType) \ 1138ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ 1139ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com increase_node_count(); \ 11402c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org set_dont_optimize_reason(k##NodeType); \ 1141ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com add_flag(kDontInline); \ 1142ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com add_flag(kDontSelfOptimize); \ 1143ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 1144ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#define DONT_SELFOPTIMIZE_NODE(NodeType) \ 1145ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ 1146ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com increase_node_count(); \ 1147ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com add_flag(kDontSelfOptimize); \ 1148ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com } 114981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org#define DONT_CACHE_NODE(NodeType) \ 115081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org void AstConstructionVisitor::Visit##NodeType(NodeType* node) { \ 115181cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org increase_node_count(); \ 11522c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org set_dont_optimize_reason(k##NodeType); \ 115381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org add_flag(kDontInline); \ 115481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org add_flag(kDontSelfOptimize); \ 115581cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org add_flag(kDontCache); \ 115681cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org } 1157b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1158ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(VariableDeclaration) 1159ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(FunctionDeclaration) 1160ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Block) 1161ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ExpressionStatement) 1162ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(EmptyStatement) 1163ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(IfStatement) 1164ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ContinueStatement) 1165ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(BreakStatement) 1166ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ReturnStatement) 1167fb0463312815affb1f0e9d5e351b7f9a3422e3a2svenpanne@chromium.orgREGULAR_NODE(SwitchStatement) 1168a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgREGULAR_NODE(CaseClause) 1169ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Conditional) 1170ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Literal) 11712bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgREGULAR_NODE(ArrayLiteral) 1172ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ObjectLiteral) 11739c741c80bfc8026103e86b46e15e2544095ce67eyangguo@chromium.orgREGULAR_NODE(RegExpLiteral) 11742bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgREGULAR_NODE(FunctionLiteral) 1175ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Assignment) 1176ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Throw) 1177ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Property) 1178ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(UnaryOperation) 1179ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(CountOperation) 1180ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(BinaryOperation) 1181ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(CompareOperation) 1182ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(ThisFunction) 1183ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(Call) 1184ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(CallNew) 1185ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// In theory, for VariableProxy we'd have to add: 1186ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// if (node->var()->IsLookupSlot()) add_flag(kDontInline); 1187ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// But node->var() is usually not bound yet at VariableProxy creation time, and 1188ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com// LOOKUP variables only result from constructs that cannot be inlined anyway. 1189ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comREGULAR_NODE(VariableProxy) 1190ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 11918e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org// We currently do not optimize any modules. 1192ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ModuleDeclaration) 1193ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ImportDeclaration) 1194ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ExportDeclaration) 1195ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ModuleVariable) 1196ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ModulePath) 1197ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(ModuleUrl) 11988e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgDONT_OPTIMIZE_NODE(ModuleStatement) 1199f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgDONT_OPTIMIZE_NODE(Yield) 1200ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(WithStatement) 1201ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(TryCatchStatement) 1202ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(TryFinallyStatement) 1203ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_OPTIMIZE_NODE(DebuggerStatement) 1204fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.orgDONT_OPTIMIZE_NODE(NativeFunctionLiteral) 1205ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1206ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_SELFOPTIMIZE_NODE(DoWhileStatement) 1207ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_SELFOPTIMIZE_NODE(WhileStatement) 1208ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_SELFOPTIMIZE_NODE(ForStatement) 1209ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comDONT_SELFOPTIMIZE_NODE(ForInStatement) 12101fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgDONT_SELFOPTIMIZE_NODE(ForOfStatement) 1211b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 121281cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.orgDONT_CACHE_NODE(ModuleLiteral) 121381cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org 1214b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.orgvoid AstConstructionVisitor::VisitCallRuntime(CallRuntime* node) { 1215b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org increase_node_count(); 1216b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org if (node->is_jsruntime()) { 1217b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org // Don't try to inline JS runtime calls because we don't (currently) even 1218b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org // optimize them. 1219b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org add_flag(kDontInline); 1220b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } else if (node->function()->intrinsic_type == Runtime::INLINE && 122159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org (node->name()->IsOneByteEqualTo( 122259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org STATIC_ASCII_VECTOR("_ArgumentsLength")) || 122359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org node->name()->IsOneByteEqualTo(STATIC_ASCII_VECTOR("_Arguments")))) { 1224b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org // Don't inline the %_ArgumentsLength or %_Arguments because their 1225b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org // implementation will not work. There is no stack frame to get them 1226b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org // from. 1227b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org add_flag(kDontInline); 1228b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org } 1229b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org} 1230b1df11df5b7bdcc201852bfcdce0a8eace33b011svenpanne@chromium.org 1231ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#undef REGULAR_NODE 1232ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#undef DONT_OPTIMIZE_NODE 1233ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com#undef DONT_SELFOPTIMIZE_NODE 123481cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org#undef DONT_CACHE_NODE 1235ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com 1236bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 1237bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comHandle<String> Literal::ToString() { 12381510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (value_->IsString()) return Handle<String>::cast(value_); 12391510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ASSERT(value_->IsNumber()); 1240bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com char arr[100]; 1241bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com Vector<char> buffer(arr, ARRAY_SIZE(arr)); 1242bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com const char* str; 12431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (value_->IsSmi()) { 1244bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com // Optimization only, the heap number case would subsume this. 12451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org OS::SNPrintF(buffer, "%d", Smi::cast(*value_)->value()); 1246bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com str = arr; 1247bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } else { 12481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org str = DoubleToCString(value_->Number(), buffer); 1249bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com } 12508fa5bd929d2f128e3d554398bd085b3c2f98e23bjkummerow@chromium.org return isolate_->factory()->NewStringFromAscii(CStrVector(str)); 1251bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com} 1252bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 1253bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com 125443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} } // namespace v8::internal 1255