108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// Redistribution and use in source and binary forms, with or without 308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// modification, are permitted provided that the following conditions are 408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// met: 508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// 608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// * Redistributions of source code must retain the above copyright 708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// notice, this list of conditions and the following disclaimer. 808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// * Redistributions in binary form must reproduce the above 908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// copyright notice, this list of conditions and the following 1008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// disclaimer in the documentation and/or other materials provided 1108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// with the distribution. 1208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// * Neither the name of Google Inc. nor the names of its 1308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// contributors may be used to endorse or promote products derived 1408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// from this software without specific prior written permission. 1508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// 1608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 2808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#include "src/ast-value-factory.h" 2908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 3008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#include "src/api.h" 3108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#include "src/objects.h" 3208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 3308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgnamespace v8 { 3408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgnamespace internal { 3508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 3608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgnamespace { 3708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 3808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org// For using StringToArrayIndex. 3908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgclass OneByteStringStream { 4008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org public: 4108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org explicit OneByteStringStream(Vector<const byte> lb) : 4208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org literal_bytes_(lb), pos_(0) {} 4308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 4408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org bool HasMore() { return pos_ < literal_bytes_.length(); } 4508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org uint16_t GetNext() { return literal_bytes_[pos_++]; } 4608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 4708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org private: 4808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Vector<const byte> literal_bytes_; 4908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int pos_; 5008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org}; 5108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 5208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 5308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 5408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgclass AstRawStringInternalizationKey : public HashTableKey { 5508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org public: 5608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org explicit AstRawStringInternalizationKey(const AstRawString* string) 5708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org : string_(string) {} 5808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 59ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual bool IsMatch(Object* other) OVERRIDE { 6008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (string_->is_one_byte_) 6108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return String::cast(other)->IsOneByteEqualTo(string_->literal_bytes_); 6208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return String::cast(other)->IsTwoByteEqualTo( 6308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Vector<const uint16_t>::cast(string_->literal_bytes_)); 6408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 6508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 66ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual uint32_t Hash() OVERRIDE { 6708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return string_->hash() >> Name::kHashShift; 6808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 6908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 70ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual uint32_t HashForObject(Object* key) OVERRIDE { 7108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return String::cast(key)->Hash(); 7208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 7308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 74ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org virtual Handle<Object> AsHandle(Isolate* isolate) OVERRIDE { 7508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (string_->is_one_byte_) 7608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return isolate->factory()->NewOneByteInternalizedString( 7708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org string_->literal_bytes_, string_->hash()); 7808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return isolate->factory()->NewTwoByteInternalizedString( 7908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Vector<const uint16_t>::cast(string_->literal_bytes_), string_->hash()); 8008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 8108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 8208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org private: 8308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* string_; 8408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org}; 8508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 8608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 8708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid AstRawString::Internalize(Isolate* isolate) { 8808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (!string_.is_null()) return; 8908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (literal_bytes_.length() == 0) { 9008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org string_ = isolate->factory()->empty_string(); 9108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } else { 9208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstRawStringInternalizationKey key(this); 9308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org string_ = StringTable::LookupKey(isolate, &key); 9408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 9508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 9608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 9708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 9808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgbool AstRawString::AsArrayIndex(uint32_t* index) const { 9908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (!string_.is_null()) 10008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return string_->AsArrayIndex(index); 10108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (!is_one_byte_ || literal_bytes_.length() == 0 || 10208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org literal_bytes_.length() > String::kMaxArrayIndexSize) 10308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return false; 10408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org OneByteStringStream stream(literal_bytes_); 10508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return StringToArrayIndex(&stream, index); 10608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 10708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 10808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 10908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgbool AstRawString::IsOneByteEqualTo(const char* data) const { 11008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int length = static_cast<int>(strlen(data)); 11108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (is_one_byte_ && literal_bytes_.length() == length) { 11208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const char* token = reinterpret_cast<const char*>(literal_bytes_.start()); 11308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return !strncmp(token, data, length); 11408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 11508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return false; 11608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 11708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 11808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 11908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgbool AstRawString::Compare(void* a, void* b) { 12008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstRawString* string1 = reinterpret_cast<AstRawString*>(a); 12108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstRawString* string2 = reinterpret_cast<AstRawString*>(b); 12208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (string1->is_one_byte_ != string2->is_one_byte_) return false; 12308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (string1->hash_ != string2->hash_) return false; 12408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int length = string1->literal_bytes_.length(); 12508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (string2->literal_bytes_.length() != length) return false; 12608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return memcmp(string1->literal_bytes_.start(), 12708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org string2->literal_bytes_.start(), length) == 0; 12808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 12908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 13008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 13108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid AstConsString::Internalize(Isolate* isolate) { 13208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // AstRawStrings are internalized before AstConsStrings so left and right are 13308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // already internalized. 13408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org string_ = isolate->factory() 13508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ->NewConsString(left_->string(), right_->string()) 13608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org .ToHandleChecked(); 13708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 13808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 13908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 14008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgbool AstValue::IsPropertyName() const { 14108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (type_ == STRING) { 14208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org uint32_t index; 14308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return !string_->AsArrayIndex(&index); 14408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 14508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return false; 14608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 14708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 14808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 14908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgbool AstValue::BooleanValue() const { 15008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org switch (type_) { 15108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case STRING: 152e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(string_ != NULL); 15308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return !string_->IsEmpty(); 15408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case SYMBOL: 15508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org UNREACHABLE(); 15608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 15708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case NUMBER: 15808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return DoubleToBoolean(number_); 15908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case SMI: 16008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return smi_ != 0; 16108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case STRING_ARRAY: 16208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org UNREACHABLE(); 16308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 16408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case BOOLEAN: 16508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return bool_; 16608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case NULL_TYPE: 16708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return false; 16808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case THE_HOLE: 16908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org UNREACHABLE(); 17008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 17108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case UNDEFINED: 17208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return false; 17308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 17408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org UNREACHABLE(); 17508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return false; 17608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 17708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 17808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 17908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid AstValue::Internalize(Isolate* isolate) { 18008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org switch (type_) { 18108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case STRING: 182e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(string_ != NULL); 18308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // Strings are already internalized. 184e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!string_->string().is_null()); 18508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 18608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case SYMBOL: 18708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = Object::GetProperty( 18808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org isolate, handle(isolate->native_context()->builtins()), 18908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org symbol_name_).ToHandleChecked(); 19008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 19108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case NUMBER: 19208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = isolate->factory()->NewNumber(number_, TENURED); 19308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 19408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case SMI: 19508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = handle(Smi::FromInt(smi_), isolate); 19608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 19708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case BOOLEAN: 19808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (bool_) { 19908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = isolate->factory()->true_value(); 20008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } else { 20108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = isolate->factory()->false_value(); 20208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 20308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 20408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case STRING_ARRAY: { 205e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(strings_ != NULL); 20608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Factory* factory = isolate->factory(); 20708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int len = strings_->length(); 20808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<FixedArray> elements = factory->NewFixedArray(len, TENURED); 20908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org for (int i = 0; i < len; i++) { 21008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstRawString* string = (*strings_)[i]; 21108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Handle<Object> element = string->string(); 21208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // Strings are already internalized. 213e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!element.is_null()); 21408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org elements->set(i, *element); 21508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 21608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = 21708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org factory->NewJSArrayWithElements(elements, FAST_ELEMENTS, TENURED); 21808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 21908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 22008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case NULL_TYPE: 22108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = isolate->factory()->null_value(); 22208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 22308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case THE_HOLE: 22408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = isolate->factory()->the_hole_value(); 22508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 22608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org case UNDEFINED: 22708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value_ = isolate->factory()->undefined_value(); 22808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org break; 22908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 23008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 23108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 23208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 23308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstRawString* AstValueFactory::GetOneByteString( 23408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Vector<const uint8_t> literal) { 23508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org uint32_t hash = StringHasher::HashSequentialString<uint8_t>( 23608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org literal.start(), literal.length(), hash_seed_); 23708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return GetString(hash, true, literal); 23808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 23908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 24008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 24108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstRawString* AstValueFactory::GetTwoByteString( 24208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org Vector<const uint16_t> literal) { 24308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org uint32_t hash = StringHasher::HashSequentialString<uint16_t>( 24408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org literal.start(), literal.length(), hash_seed_); 24508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return GetString(hash, false, Vector<const byte>::cast(literal)); 24608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 24708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 24808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 24908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstRawString* AstValueFactory::GetString(Handle<String> literal) { 25008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org DisallowHeapAllocation no_gc; 25108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org String::FlatContent content = literal->GetFlatContent(); 2522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org if (content.IsOneByte()) { 25308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return GetOneByteString(content.ToOneByteVector()); 25408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 255e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(content.IsTwoByte()); 25608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return GetTwoByteString(content.ToUC16Vector()); 25708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 25808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 25908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 26008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstConsString* AstValueFactory::NewConsString( 26108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org const AstString* left, const AstString* right) { 26208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // This Vector will be valid as long as the Collector is alive (meaning that 26308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // the AstRawString will not be moved). 26408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstConsString* new_string = new (zone_) AstConsString(left, right); 26508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org strings_.Add(new_string); 26608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 26708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org new_string->Internalize(isolate_); 26808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 26908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return new_string; 27008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 27108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 27208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 27308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid AstValueFactory::Internalize(Isolate* isolate) { 27408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 27508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // Everything is already internalized. 27608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return; 27708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 27808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // Strings need to be internalized before values, because values refer to 27908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // strings. 28008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org for (int i = 0; i < strings_.length(); ++i) { 28108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org strings_[i]->Internalize(isolate); 28208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 28308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org for (int i = 0; i < values_.length(); ++i) { 28408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_[i]->Internalize(isolate); 28508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 28608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org isolate_ = isolate; 28708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 28808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 28908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 29008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewString(const AstRawString* string) { 29108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = new (zone_) AstValue(string); 292e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(string != NULL); 29308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 29408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 29508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 29608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 29708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 29808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 29908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 30008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 30108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewSymbol(const char* name) { 30208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = new (zone_) AstValue(name); 30308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 30408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 30508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 30608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 30708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 30808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 30908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 31008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 31108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewNumber(double number) { 31208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = new (zone_) AstValue(number); 31308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 31408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 31508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 31608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 31708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 31808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 31908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 32008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 32108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewSmi(int number) { 32208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = 32308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org new (zone_) AstValue(AstValue::SMI, number); 32408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 32508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 32608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 32708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 32808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 32908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 33008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 33108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 33208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewBoolean(bool b) { 33308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = new (zone_) AstValue(b); 33408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 33508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 33608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 33708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 33808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 33908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 34008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 34108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 34208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewStringList( 34308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org ZoneList<const AstRawString*>* strings) { 34408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = new (zone_) AstValue(strings); 34508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 34608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 34708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 34808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 34908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 35008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 35108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 35208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 35308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewNull() { 35408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = new (zone_) AstValue(AstValue::NULL_TYPE); 35508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 35608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 35708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 35808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 35908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 36008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 36108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 36208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 36308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewUndefined() { 36408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = new (zone_) AstValue(AstValue::UNDEFINED); 36508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 36608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 36708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 36808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 36908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 37008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 37108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 37208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 37308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstValue* AstValueFactory::NewTheHole() { 37408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstValue* value = new (zone_) AstValue(AstValue::THE_HOLE); 37508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 37608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org value->Internalize(isolate_); 37708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 37808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org values_.Add(value); 37908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return value; 38008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 38108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 38208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 38308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgconst AstRawString* AstValueFactory::GetString( 38408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org uint32_t hash, bool is_one_byte, Vector<const byte> literal_bytes) { 38508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // literal_bytes here points to whatever the user passed, and this is OK 38608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // because we use vector_compare (which checks the contents) to compare 38708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // against the AstRawStrings which are in the string_table_. We should not 38808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // return this AstRawString. 38908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstRawString key(is_one_byte, literal_bytes, hash); 39008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org HashMap::Entry* entry = string_table_.Lookup(&key, hash, true); 39108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (entry->value == NULL) { 39208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org // Copy literal contents for later comparison. 39308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org int length = literal_bytes.length(); 39408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org byte* new_literal_bytes = zone_->NewArray<byte>(length); 39508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org memcpy(new_literal_bytes, literal_bytes.start(), length); 39608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org AstRawString* new_string = new (zone_) AstRawString( 39708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org is_one_byte, Vector<const byte>(new_literal_bytes, length), hash); 39808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org entry->key = new_string; 39908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org strings_.Add(new_string); 40008e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org if (isolate_) { 40108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org new_string->Internalize(isolate_); 40208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 40308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org entry->value = reinterpret_cast<void*>(1); 40408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org } 40508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org return reinterpret_cast<AstRawString*>(entry->key); 40608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} 40708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 40808e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org 40908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org} } // namespace v8::internal 410