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