objects-inl.h revision f87a203d89e1bbb6708282e0b64dbd13d59b723d
1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 the V8 project authors. All rights reserved. 2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without 3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are 4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met: 5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions of source code must retain the above copyright 7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// notice, this list of conditions and the following disclaimer. 8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Redistributions in binary form must reproduce the above 9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// copyright notice, this list of conditions and the following 10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// disclaimer in the documentation and/or other materials provided 11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// with the distribution. 12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// * Neither the name of Google Inc. nor the names of its 13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// contributors may be used to endorse or promote products derived 14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// from this software without specific prior written permission. 15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Review notes: 29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// - The use of macros in these inline functions may seem superfluous 31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// but it is absolutely needed to make sure gcc generates optimal 32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// code. gcc is not happy when attempting to inline too deep. 33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// 34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_OBJECTS_INL_H_ 36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_OBJECTS_INL_H_ 37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "objects.h" 39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "contexts.h" 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "conversions-inl.h" 4180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "heap.h" 4280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "memory.h" 43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "property.h" 4480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "spaces.h" 45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails::PropertyDetails(Smi* smi) { 50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value_ = smi->value(); 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* PropertyDetails::AsSmi() { 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::FromInt(value_); 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails PropertyDetails::AsDeleted() { 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyDetails d(DONT_ENUM, NORMAL); 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Smi* smi = Smi::FromInt(AsSmi()->value() | DeletedField::encode(1)); 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return PropertyDetails(smi); 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CAST_ACCESSOR(type) \ 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type* type::cast(Object* object) { \ 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(object->Is##type()); \ 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<type*>(object); \ 70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define INT_ACCESSORS(holder, name, offset) \ 74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int holder::name() { return READ_INT_FIELD(this, offset); } \ 75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); } 76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define ACCESSORS(holder, name, type, offset) \ 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \ 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void holder::set_##name(type* value, WriteBarrierMode mode) { \ 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); \ 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CONDITIONAL_WRITE_BARRIER(this, offset, mode); \ 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define SMI_ACCESSORS(holder, name, offset) \ 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int holder::name() { \ 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value = READ_FIELD(this, offset); \ 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::cast(value)->value(); \ 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } \ 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void holder::set_##name(int value) { \ 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, Smi::FromInt(value)); \ 93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_GETTER(holder, field, name, offset) \ 97a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool holder::name() { \ 98a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(field(), offset); \ 99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } \ 100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_ACCESSORS(holder, field, name, offset) \ 103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool holder::name() { \ 104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(field(), offset); \ 105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } \ 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void holder::set_##name(bool value) { \ 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_##field(BooleanBit::set(field(), offset, value)); \ 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsInstanceOf(FunctionTemplateInfo* expected) { 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // There is a constraint on the object; check. 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!this->IsJSObject()) return false; 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Fetch the constructor function of the object. 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* cons_obj = JSObject::cast(this)->map()->constructor(); 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!cons_obj->IsJSFunction()) return false; 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JSFunction* fun = JSFunction::cast(cons_obj); 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Iterate through the chain of inheriting function templates to 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // see if the required one occurs. 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (Object* type = fun->shared()->function_data(); 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type->IsFunctionTemplateInfo(); 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type = FunctionTemplateInfo::cast(type)->parent_template()) { 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (type == expected) return true; 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Didn't find the required type in the inheritance chain. 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return false; 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSmi() { 131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_SMI_TAG(this); 132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHeapObject() { 136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Internals::HasHeapObjectTag(this); 137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHeapNumber() { 141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == HEAP_NUMBER_TYPE; 143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsString() { 147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE; 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSymbol() { 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!this->IsHeapObject()) return false; 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type = HeapObject::cast(this)->map()->instance_type(); 155e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Because the symbol tag is non-zero and no non-string types have the 156e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // symbol bit set we can test for symbols with a very simple test 157e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // operation. 158e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(kSymbolTag != 0); 159e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(kNotStringTag + kIsSymbolMask > LAST_TYPE); 160e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return (type & kIsSymbolMask) != 0; 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsConsString() { 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!this->IsHeapObject()) return false; 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type = HeapObject::cast(this)->map()->instance_type(); 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type & (kIsNotStringMask | kStringRepresentationMask)) == 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (kStringTag | kConsStringTag); 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqString() { 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsSequential(); 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqAsciiString() { 179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsSequential() && 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::cast(this)->IsAsciiRepresentation(); 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqTwoByteString() { 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsSequential() && 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::cast(this)->IsTwoByteRepresentation(); 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalString() { 193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsExternal(); 195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalAsciiString() { 199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsExternal() && 201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::cast(this)->IsAsciiRepresentation(); 202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalTwoByteString() { 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsExternal() && 208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::cast(this)->IsTwoByteRepresentation(); 209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(String* str) 213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : type_(str->map()->instance_type()) { 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_valid(); 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((type_ & kIsNotStringMask) == kStringTag); 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(Map* map) 220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : type_(map->instance_type()) { 221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_valid(); 222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((type_ & kIsNotStringMask) == kStringTag); 223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(InstanceType t) 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : type_(static_cast<uint32_t>(t)) { 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_valid(); 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((type_ & kIsNotStringMask) == kStringTag); 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSymbol() { 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(valid()); 235e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(kSymbolTag != 0); 236e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return (type_ & kIsSymbolMask) != 0; 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsAsciiRepresentation() { 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type = map()->instance_type(); 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type & kStringEncodingMask) == kAsciiStringTag; 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsTwoByteRepresentation() { 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type = map()->instance_type(); 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type & kStringEncodingMask) == kTwoByteStringTag; 249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2529dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenbool String::HasOnlyAsciiChars() { 2539dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen uint32_t type = map()->instance_type(); 2549dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen return (type & kStringEncodingMask) == kAsciiStringTag || 2559dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen (type & kAsciiDataHintMask) == kAsciiDataHintTag; 2566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 2576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsCons() { 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type_ & kStringRepresentationMask) == kConsStringTag; 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternal() { 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type_ & kStringRepresentationMask) == kExternalStringTag; 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequential() { 270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type_ & kStringRepresentationMask) == kSeqStringTag; 271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringRepresentationTag StringShape::representation_tag() { 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t tag = (type_ & kStringRepresentationMask); 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<StringRepresentationTag>(tag); 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t StringShape::full_representation_tag() { 281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type_ & (kStringRepresentationMask | kStringEncodingMask)); 282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSTATIC_CHECK((kStringRepresentationMask | kStringEncodingMask) == 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Internals::kFullStringRepresentationMask); 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequentialAscii() { 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return full_representation_tag() == (kSeqStringTag | kAsciiStringTag); 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequentialTwoByte() { 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return full_representation_tag() == (kSeqStringTag | kTwoByteStringTag); 296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternalAscii() { 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return full_representation_tag() == (kExternalStringTag | kAsciiStringTag); 301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternalTwoByte() { 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag); 306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSTATIC_CHECK((kExternalStringTag | kTwoByteStringTag) == 310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Internals::kExternalTwoByteRepresentationTag); 311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc32 FlatStringReader::Get(int index) { 314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= index && index <= length_); 315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_ascii_) { 316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<const byte*>(start_)[index]; 317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<const uc16*>(start_)[index]; 319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsNumber() { 324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsSmi() || IsHeapNumber(); 325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsByteArray() { 329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == BYTE_ARRAY_TYPE; 331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsPixelArray() { 335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() && 336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HeapObject::cast(this)->map()->instance_type() == PIXEL_ARRAY_TYPE; 337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalArray() { 3413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (!Object::IsHeapObject()) 3423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return false; 3433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block InstanceType instance_type = 3443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type(); 345e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && 346e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke instance_type <= LAST_EXTERNAL_ARRAY_TYPE); 3473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalByteArray() { 3513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return Object::IsHeapObject() && 3523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type() == 3533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EXTERNAL_BYTE_ARRAY_TYPE; 3543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalUnsignedByteArray() { 3583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return Object::IsHeapObject() && 3593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type() == 3603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE; 3613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalShortArray() { 3653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return Object::IsHeapObject() && 3663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type() == 3673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EXTERNAL_SHORT_ARRAY_TYPE; 3683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalUnsignedShortArray() { 3723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return Object::IsHeapObject() && 3733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type() == 3743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE; 3753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalIntArray() { 3793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return Object::IsHeapObject() && 3803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type() == 3813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EXTERNAL_INT_ARRAY_TYPE; 3823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalUnsignedIntArray() { 3863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return Object::IsHeapObject() && 3873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type() == 3883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EXTERNAL_UNSIGNED_INT_ARRAY_TYPE; 3893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalFloatArray() { 3933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return Object::IsHeapObject() && 3943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type() == 3953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block EXTERNAL_FLOAT_ARRAY_TYPE; 3963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 3973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsFailure() { 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_FAILURE_TAG(this); 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsRetryAfterGC() { 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_FAILURE_TAG(this) 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC; 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsOutOfMemoryFailure() { 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_FAILURE_TAG(this) 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && Failure::cast(this)->IsOutOfMemoryException(); 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsException() { 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this == Failure::Exception(); 418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSObject() { 422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHeapObject() 423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE; 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSContextExtensionObject() { 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHeapObject() 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && (HeapObject::cast(this)->map()->instance_type() == 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_CONTEXT_EXTENSION_OBJECT_TYPE); 431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsMap() { 435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == MAP_TYPE; 437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsFixedArray() { 441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == FIXED_ARRAY_TYPE; 443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsDescriptorArray() { 447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsFixedArray(); 448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsContext() { 452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && (HeapObject::cast(this)->map() == Heap::context_map() || 454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HeapObject::cast(this)->map() == Heap::catch_context_map() || 455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HeapObject::cast(this)->map() == Heap::global_context_map()); 456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsCatchContext() { 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map() == Heap::catch_context_map(); 462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsGlobalContext() { 466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map() == Heap::global_context_map(); 468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSFunction() { 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == JS_FUNCTION_TYPE; 474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> inline bool Is<JSFunction>(Object* obj) { 478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return obj->IsJSFunction(); 479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsCode() { 483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == CODE_TYPE; 485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsOddball() { 489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == ODDBALL_TYPE; 491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSGlobalPropertyCell() { 495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() 497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block == JS_GLOBAL_PROPERTY_CELL_TYPE; 498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSharedFunctionInfo() { 502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() && 503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (HeapObject::cast(this)->map()->instance_type() == 504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block SHARED_FUNCTION_INFO_TYPE); 505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSValue() { 509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == JS_VALUE_TYPE; 511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStringWrapper() { 515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsJSValue() && JSValue::cast(this)->value()->IsString(); 516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsProxy() { 520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == PROXY_TYPE; 522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsBoolean() { 526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsTrue() || IsFalse(); 527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSArray() { 531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == JS_ARRAY_TYPE; 533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSRegExp() { 537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == JS_REGEXP_TYPE; 539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> inline bool Is<JSArray>(Object* obj) { 543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return obj->IsJSArray(); 544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHashTable() { 548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map() == Heap::hash_table_map(); 550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsDictionary() { 554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHashTable() && this != Heap::symbol_table(); 555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSymbolTable() { 559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHashTable() && this == Heap::raw_unchecked_symbol_table(); 560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5636ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Object::IsJSFunctionResultCache() { 5646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!IsFixedArray()) return false; 5656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block FixedArray* self = FixedArray::cast(this); 5666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int length = self->length(); 5676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (length < JSFunctionResultCache::kEntriesIndex) return false; 5686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if ((length - JSFunctionResultCache::kEntriesIndex) 5696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block % JSFunctionResultCache::kEntrySize != 0) { 5706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return false; 5716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 5726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef DEBUG 5736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block reinterpret_cast<JSFunctionResultCache*>(this)->JSFunctionResultCacheVerify(); 5746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif 5756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return true; 5766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 5776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 5786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 57980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenbool Object::IsNormalizedMapCache() { 58080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen if (!IsFixedArray()) return false; 58180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen if (FixedArray::cast(this)->length() != NormalizedMapCache::kEntries) { 58280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return false; 58380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen } 58480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#ifdef DEBUG 58580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen reinterpret_cast<NormalizedMapCache*>(this)->NormalizedMapCacheVerify(); 58680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#endif 58780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return true; 58880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen} 58980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 59080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsCompilationCacheTable() { 592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHashTable(); 593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5966ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Object::IsCodeCacheHashTable() { 5976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return IsHashTable(); 5986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 5996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 6006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsMapCache() { 602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHashTable(); 603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsPrimitive() { 607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsOddball() || IsNumber() || IsString(); 608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSGlobalProxy() { 612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool result = IsHeapObject() && 613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (HeapObject::cast(this)->map()->instance_type() == 614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_GLOBAL_PROXY_TYPE); 615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!result || IsAccessCheckNeeded()); 616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsGlobalObject() { 621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsHeapObject()) return false; 622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InstanceType type = HeapObject::cast(this)->map()->instance_type(); 624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return type == JS_GLOBAL_OBJECT_TYPE || 625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type == JS_BUILTINS_OBJECT_TYPE; 626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSGlobalObject() { 630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHeapObject() && 631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (HeapObject::cast(this)->map()->instance_type() == 632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_GLOBAL_OBJECT_TYPE); 633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSBuiltinsObject() { 637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHeapObject() && 638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (HeapObject::cast(this)->map()->instance_type() == 639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_BUILTINS_OBJECT_TYPE); 640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsUndetectableObject() { 644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHeapObject() 645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->is_undetectable(); 646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsAccessCheckNeeded() { 650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHeapObject() 651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->is_access_check_needed(); 652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStruct() { 656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsHeapObject()) return false; 657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (HeapObject::cast(this)->map()->instance_type()) { 658a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true; 659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STRUCT_LIST(MAKE_STRUCT_CASE) 660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CASE 661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: return false; 662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_PREDICATE(NAME, Name, name) \ 667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool Object::Is##Name() { \ 668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() \ 669a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \ 670a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STRUCT_LIST(MAKE_STRUCT_PREDICATE) 672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_PREDICATE 673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsUndefined() { 676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this == Heap::undefined_value(); 677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsTheHole() { 681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this == Heap::the_hole_value(); 682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsNull() { 686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this == Heap::null_value(); 687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsTrue() { 691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this == Heap::true_value(); 692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsFalse() { 696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this == Heap::false_value(); 697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdouble Object::Number() { 701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(IsNumber()); 702a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsSmi() 703a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ? static_cast<double>(reinterpret_cast<Smi*>(this)->value()) 704a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : reinterpret_cast<HeapNumber*>(this)->value(); 705a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 706a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 707a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 708a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 709a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::ToSmi() { 710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (IsSmi()) return this; 711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (IsHeapNumber()) { 712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block double value = HeapNumber::cast(this)->value(); 713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int int_value = FastD2I(value); 714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (value == FastI2D(int_value) && Smi::IsValid(int_value)) { 715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::FromInt(int_value); 716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Failure::Exception(); 719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::HasSpecificClassOf(String* name) { 723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this->IsJSObject() && (JSObject::cast(this)->class_name() == name); 724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::GetElement(uint32_t index) { 728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetElementWithReceiver(this, index); 729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::GetProperty(String* key) { 733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyAttributes attributes; 734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetPropertyWithReceiver(this, key, &attributes); 735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Object::GetProperty(String* key, PropertyAttributes* attributes) { 739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetPropertyWithReceiver(this, key, attributes); 740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define FIELD_ADDR(p, offset) \ 744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag) 745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_FIELD(p, offset) \ 747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset))) 748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_FIELD(p, offset, value) \ 750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) 751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_BARRIER(object, offset) \ 754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Heap::RecordWrite(object->address(), offset); 755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// CONDITIONAL_WRITE_BARRIER must be issued after the actual 757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// write due to the assert validating the written value. 758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CONDITIONAL_WRITE_BARRIER(object, offset, mode) \ 759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (mode == UPDATE_WRITE_BARRIER) { \ 760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Heap::RecordWrite(object->address(), offset); \ 761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { \ 762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(mode == SKIP_WRITE_BARRIER); \ 763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(Heap::InNewSpace(object) || \ 7646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block !Heap::InNewSpace(READ_FIELD(object, offset)) || \ 7657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch Page::FromAddress(object->address())-> \ 7667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch IsRegionDirty(object->address() + offset)); \ 767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_DOUBLE_FIELD(p, offset) \ 770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<double*>(FIELD_ADDR(p, offset))) 771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_DOUBLE_FIELD(p, offset, value) \ 773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value) 774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INT_FIELD(p, offset) \ 776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<int*>(FIELD_ADDR(p, offset))) 777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INT_FIELD(p, offset, value) \ 779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value) 780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INTPTR_FIELD(p, offset) \ 782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset))) 783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INTPTR_FIELD(p, offset, value) \ 785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value) 786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_UINT32_FIELD(p, offset) \ 788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) 789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_UINT32_FIELD(p, offset, value) \ 791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value) 792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_SHORT_FIELD(p, offset) \ 794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset))) 795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_SHORT_FIELD(p, offset, value) \ 797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value) 798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_BYTE_FIELD(p, offset) \ 800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset))) 801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_BYTE_FIELD(p, offset, value) \ 803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value) 804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject** HeapObject::RawField(HeapObject* obj, int byte_offset) { 807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return &READ_FIELD(obj, byte_offset); 808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Smi::value() { 812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Internals::SmiValue(this); 813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* Smi::FromInt(int value) { 817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(Smi::IsValid(value)); 8183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int smi_shift_bits = kSmiTagSize + kSmiShiftSize; 819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block intptr_t tagged_value = 8203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag; 821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Smi*>(tagged_value); 822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* Smi::FromIntptr(intptr_t value) { 826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(Smi::IsValid(value)); 8273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int smi_shift_bits = kSmiTagSize + kSmiShiftSize; 8283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag); 829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure::Type Failure::type() const { 833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Type>(value() & kFailureTypeTagMask); 834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Failure::IsInternalError() const { 838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return type() == INTERNAL_ERROR; 839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Failure::IsOutOfMemoryException() const { 843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return type() == OUT_OF_MEMORY_EXCEPTION; 844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAllocationSpace Failure::allocation_space() const { 848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_EQ(RETRY_AFTER_GC, type()); 849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<AllocationSpace>((value() >> kFailureTypeTagSize) 850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block & kSpaceTagMask); 851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::InternalError() { 855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Construct(INTERNAL_ERROR); 856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::Exception() { 860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Construct(EXCEPTION); 861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::OutOfMemoryException() { 865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Construct(OUT_OF_MEMORY_EXCEPTION); 866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockintptr_t Failure::value() const { 8706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return static_cast<intptr_t>( 8716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block reinterpret_cast<uintptr_t>(this) >> kFailureTagSize); 872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 875f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochFailure* Failure::RetryAfterGC() { 876f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return RetryAfterGC(NEW_SPACE); 877f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch} 878f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 879f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 880f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochFailure* Failure::RetryAfterGC(AllocationSpace space) { 881f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch ASSERT((space & ~kSpaceTagMask) == 0); 882f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return Construct(RETRY_AFTER_GC, space); 883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockFailure* Failure::Construct(Type type, intptr_t value) { 8876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block uintptr_t info = 8886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block (static_cast<uintptr_t>(value) << kFailureTypeTagSize) | type; 889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info); 8903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return reinterpret_cast<Failure*>((info << kFailureTagSize) | kFailureTag); 891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Smi::IsValid(intptr_t value) { 895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool in_range = (value >= kMinValue) && (value <= kMaxValue); 897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 8983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 8993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#ifdef V8_TARGET_ARCH_X64 9003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // To be representable as a long smi, the value must be a 32-bit integer. 9013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block bool result = (value == static_cast<int32_t>(value)); 9023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#else 903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // To be representable as an tagged small integer, the two 904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // most-significant bits of 'value' must be either 00 or 11 due to 905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // sign-extension. To check this we add 01 to the two 906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // most-significant bits, and check if the most-significant bit is 0 907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // CAUTION: The original code below: 909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // bool result = ((value + 0x40000000) & 0x80000000) == 0; 910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // may lead to incorrect results according to the C language spec, and 911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // in fact doesn't work correctly with gcc4.1.1 in some cases: The 912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // compiler may produce undefined results in case of signed integer 913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // overflow. The computation must be done w/ unsigned ints. 9143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block bool result = (static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U); 915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(result == in_range); 917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromMap(Map* map) { 922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return MapWord(reinterpret_cast<uintptr_t>(map)); 923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* MapWord::ToMap() { 927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Map*>(value_); 928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool MapWord::IsForwardingAddress() { 932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_SMI_TAG(reinterpret_cast<Object*>(value_)); 933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromForwardingAddress(HeapObject* object) { 937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag; 938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return MapWord(reinterpret_cast<uintptr_t>(raw)); 939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* MapWord::ToForwardingAddress() { 943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(IsForwardingAddress()); 944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HeapObject::FromAddress(reinterpret_cast<Address>(value_)); 945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool MapWord::IsMarked() { 949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (value_ & kMarkingMask) == 0; 950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid MapWord::SetMark() { 954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value_ &= ~kMarkingMask; 955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid MapWord::ClearMark() { 959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value_ |= kMarkingMask; 960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool MapWord::IsOverflowed() { 964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (value_ & kOverflowMask) != 0; 965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid MapWord::SetOverflow() { 969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value_ |= kOverflowMask; 970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid MapWord::ClearOverflow() { 974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value_ &= ~kOverflowMask; 975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::EncodeAddress(Address map_address, int offset) { 979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Offset is the distance in live bytes from the first live object in the 980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // same page. The offset between two objects in the same page should not 981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // exceed the object area size of a page. 982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= offset && offset < Page::kObjectAreaSize); 983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 984e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke uintptr_t compact_offset = offset >> kObjectAlignmentBits; 985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(compact_offset < (1 << kForwardingOffsetBits)); 986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Page* map_page = Page::FromAddress(map_address); 988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_MAP_PAGE_INDEX(map_page->mc_page_index); 989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 990e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke uintptr_t map_page_offset = 991e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke map_page->Offset(map_address) >> kMapAlignmentBits; 992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uintptr_t encoding = 994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (compact_offset << kForwardingOffsetShift) | 995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (map_page_offset << kMapPageOffsetShift) | 996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (map_page->mc_page_index << kMapPageIndexShift); 997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return MapWord(encoding); 998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress MapWord::DecodeMapAddress(MapSpace* map_space) { 1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int map_page_index = 1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static_cast<int>((value_ & kMapPageIndexMask) >> kMapPageIndexShift); 1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_MAP_PAGE_INDEX(map_page_index); 1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int map_page_offset = static_cast<int>( 1007e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ((value_ & kMapPageOffsetMask) >> kMapPageOffsetShift) << 1008e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke kMapAlignmentBits); 1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (map_space->PageAddress(map_page_index) + map_page_offset); 1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint MapWord::DecodeOffset() { 1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The offset field is represented in the kForwardingOffsetBits 1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // most-significant bits. 1017d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block uintptr_t offset = (value_ >> kForwardingOffsetShift) << kObjectAlignmentBits; 1018d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(offset < static_cast<uintptr_t>(Page::kObjectAreaSize)); 1019d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return static_cast<int>(offset); 1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromEncodedAddress(Address address) { 1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return MapWord(reinterpret_cast<uintptr_t>(address)); 1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress MapWord::ToEncodedAddress() { 1029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Address>(value_); 1030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::VerifyObjectField(int offset) { 1035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block VerifyPointer(READ_FIELD(this, offset)); 1036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 10377f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 10387f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid HeapObject::VerifySmiField(int offset) { 10397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(READ_FIELD(this, offset)->IsSmi()); 10407f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 1041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 1042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* HeapObject::map() { 1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map_word().ToMap(); 1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map(Map* value) { 1050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_map_word(MapWord::FromMap(value)); 1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord HeapObject::map_word() { 1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset))); 1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map_word(MapWord map_word) { 10607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // WRITE_FIELD does not invoke write barrier, but there is no need 1061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // here. 1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kMapOffset, reinterpret_cast<Object*>(map_word.value_)); 1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* HeapObject::FromAddress(Address address) { 1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_TAG_ALIGNED(address); 1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); 1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress HeapObject::address() { 1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Address>(this) - kHeapObjectTag; 1074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::Size() { 1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return SizeFromMap(map()); 1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) { 1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)), 1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reinterpret_cast<Object**>(FIELD_ADDR(this, end))); 1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::IteratePointer(ObjectVisitor* v, int offset) { 1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v->VisitPointer(reinterpret_cast<Object**>(FIELD_ADDR(this, offset))); 1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HeapObject::IsMarked() { 1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map_word().IsMarked(); 1095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::SetMark() { 1099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!IsMarked()); 1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block MapWord first_word = map_word(); 1101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block first_word.SetMark(); 1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_map_word(first_word); 1103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::ClearMark() { 1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(IsMarked()); 1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block MapWord first_word = map_word(); 1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block first_word.ClearMark(); 1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_map_word(first_word); 1111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool HeapObject::IsOverflowed() { 1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map_word().IsOverflowed(); 1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::SetOverflow() { 1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block MapWord first_word = map_word(); 1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block first_word.SetOverflow(); 1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_map_word(first_word); 1123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::ClearOverflow() { 1127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(IsOverflowed()); 1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block MapWord first_word = map_word(); 1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block first_word.ClearOverflow(); 1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_map_word(first_word); 1131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdouble HeapNumber::value() { 1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_DOUBLE_FIELD(this, kValueOffset); 1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapNumber::set_value(double value) { 1140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_DOUBLE_FIELD(this, kValueOffset, value); 1141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11446ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockint HeapNumber::get_exponent() { 11456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return ((READ_INT_FIELD(this, kExponentOffset) & kExponentMask) >> 11466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block kExponentShift) - kExponentBias; 11476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 11486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 11496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 11506ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockint HeapNumber::get_sign() { 11516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return READ_INT_FIELD(this, kExponentOffset) & kSignMask; 11526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 11536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 11546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) 1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochHeapObject* JSObject::elements() { 1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* array = READ_FIELD(this, kElementsOffset); 1160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // In the assert below Dictionary is covered under FixedArray. 11613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT(array->IsFixedArray() || array->IsPixelArray() || 11623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block array->IsExternalArray()); 11637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return reinterpret_cast<HeapObject*>(array); 1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) { 11688defd9ff6930b4e24729971a61cf7469daf119beSteve Block ASSERT(map()->has_fast_elements() == 1169756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick (value->map() == Heap::fixed_array_map() || 1170756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick value->map() == Heap::fixed_cow_array_map())); 1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // In the assert below Dictionary is covered under FixedArray. 11723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT(value->IsFixedArray() || value->IsPixelArray() || 11733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block value->IsExternalArray()); 1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kElementsOffset, value); 1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CONDITIONAL_WRITE_BARRIER(this, kElementsOffset, mode); 1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_properties() { 1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); 1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kPropertiesOffset, Heap::empty_fixed_array()); 1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_elements() { 11868defd9ff6930b4e24729971a61cf7469daf119beSteve Block ASSERT(map()->has_fast_elements()); 1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!Heap::InNewSpace(Heap::empty_fixed_array())); 1188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kElementsOffset, Heap::empty_fixed_array()); 1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11928defd9ff6930b4e24729971a61cf7469daf119beSteve BlockObject* JSObject::ResetElements() { 11938defd9ff6930b4e24729971a61cf7469daf119beSteve Block Object* obj = map()->GetFastElementsMap(); 11948defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (obj->IsFailure()) return obj; 11958defd9ff6930b4e24729971a61cf7469daf119beSteve Block set_map(Map::cast(obj)); 11968defd9ff6930b4e24729971a61cf7469daf119beSteve Block initialize_elements(); 11978defd9ff6930b4e24729971a61cf7469daf119beSteve Block return this; 11988defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 11998defd9ff6930b4e24729971a61cf7469daf119beSteve Block 12008defd9ff6930b4e24729971a61cf7469daf119beSteve Block 1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_string, String, kToStringOffset) 1202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_number, Object, kToNumberOffset) 1203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSGlobalPropertyCell::value() { 1206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kValueOffset); 1207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) { 1211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The write barrier is not used for global property cells. 1212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!val->IsJSGlobalPropertyCell()); 1213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kValueOffset, val); 1214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSObject::GetHeaderSize() { 1218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InstanceType type = map()->instance_type(); 1219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check for the most common kind of JavaScript object before 1220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // falling into the generic switch. This speeds up the internal 1221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // field operations considerably on average. 1222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; 1223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (type) { 1224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_GLOBAL_PROXY_TYPE: 1225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSGlobalProxy::kSize; 1226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_GLOBAL_OBJECT_TYPE: 1227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSGlobalObject::kSize; 1228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_BUILTINS_OBJECT_TYPE: 1229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSBuiltinsObject::kSize; 1230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_FUNCTION_TYPE: 1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSFunction::kSize; 1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_VALUE_TYPE: 1233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSValue::kSize; 1234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_ARRAY_TYPE: 1235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSValue::kSize; 1236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_REGEXP_TYPE: 1237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSValue::kSize; 1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_CONTEXT_EXTENSION_OBJECT_TYPE: 1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSObject::kHeaderSize; 1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: 1241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 1242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 1243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSObject::GetInternalFieldCount() { 1248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(1 << kPointerSizeLog2 == kPointerSize); 1249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Make sure to adjust for the number of in-object properties. These 1250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // properties do contribute to the size, but are not internal fields. 1251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) - 1252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block map()->inobject_properties(); 1253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::GetInternalField(int index) { 1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < GetInternalFieldCount() && index >= 0); 1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Internal objects do follow immediately after the header, whereas in-object 1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // properties are at the end of the object. Therefore there is no need 1260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to adjust the index here. 1261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index)); 1262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SetInternalField(int index, Object* value) { 1266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < GetInternalFieldCount() && index >= 0); 1267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Internal objects do follow immediately after the header, whereas in-object 1268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // properties are at the end of the object. Therefore there is no need 1269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to adjust the index here. 1270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = GetHeaderSize() + (kPointerSize * index); 1271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BARRIER(this, offset); 1273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Access fast-case object properties at index. The use of these routines 1277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is needed to correctly distinguish between properties stored in-object and 1278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// properties stored in the properties array. 1279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::FastPropertyAt(int index) { 1280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adjust for the number of properties stored in the object. 1281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block index -= map()->inobject_properties(); 1282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (index < 0) { 1283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = map()->instance_size() + (index * kPointerSize); 1284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, offset); 1285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < properties()->length()); 1287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return properties()->get(index); 1288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::FastPropertyAtPut(int index, Object* value) { 1293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adjust for the number of properties stored in the object. 1294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block index -= map()->inobject_properties(); 1295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (index < 0) { 1296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = map()->instance_size() + (index * kPointerSize); 1297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BARRIER(this, offset); 1299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < properties()->length()); 1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block properties()->set(index, value); 1302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return value; 1304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAt(int index) { 1308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adjust for the number of properties stored in the object. 1309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block index -= map()->inobject_properties(); 1310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < 0); 1311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = map()->instance_size() + (index * kPointerSize); 1312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, offset); 1313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAtPut(int index, 1317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value, 1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode) { 1319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adjust for the number of properties stored in the object. 1320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block index -= map()->inobject_properties(); 1321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < 0); 1322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = map()->instance_size() + (index * kPointerSize); 1323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CONDITIONAL_WRITE_BARRIER(this, offset, mode); 1325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return value; 1326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13300d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid JSObject::InitializeBody(int object_size, Object* value) { 13310d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(!value->IsHeapObject() || !Heap::InNewSpace(value)); 1332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { 1333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13388defd9ff6930b4e24729971a61cf7469daf119beSteve Blockbool JSObject::HasFastProperties() { 13398defd9ff6930b4e24729971a61cf7469daf119beSteve Block return !properties()->IsDictionary(); 13408defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 13418defd9ff6930b4e24729971a61cf7469daf119beSteve Block 13428defd9ff6930b4e24729971a61cf7469daf119beSteve Block 13438defd9ff6930b4e24729971a61cf7469daf119beSteve Blockint JSObject::MaxFastProperties() { 13448defd9ff6930b4e24729971a61cf7469daf119beSteve Block // Allow extra fast properties if the object has more than 13458defd9ff6930b4e24729971a61cf7469daf119beSteve Block // kMaxFastProperties in-object properties. When this is the case, 13468defd9ff6930b4e24729971a61cf7469daf119beSteve Block // it is very unlikely that the object is being used as a dictionary 13478defd9ff6930b4e24729971a61cf7469daf119beSteve Block // and there is a good chance that allowing more map transitions 13488defd9ff6930b4e24729971a61cf7469daf119beSteve Block // will be worth it. 13498defd9ff6930b4e24729971a61cf7469daf119beSteve Block return Max(map()->inobject_properties(), kMaxFastProperties); 13508defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 13518defd9ff6930b4e24729971a61cf7469daf119beSteve Block 13528defd9ff6930b4e24729971a61cf7469daf119beSteve Block 1353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Struct::InitializeBody(int object_size) { 1354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value = Heap::undefined_value(); 1355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { 1356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool Object::ToArrayIndex(uint32_t* index) { 13627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch if (IsSmi()) { 13637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch int value = Smi::cast(this)->value(); 1364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (value < 0) return false; 1365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *index = value; 1366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 1367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 13687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch if (IsHeapNumber()) { 13697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch double value = HeapNumber::cast(this)->value(); 1370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t uint_value = static_cast<uint32_t>(value); 1371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (value == static_cast<double>(uint_value)) { 1372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *index = uint_value; 1373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 1374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return false; 1377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStringObjectWithCharacterAt(uint32_t index) { 1381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!this->IsJSValue()) return false; 1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JSValue* js_value = JSValue::cast(this); 1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!js_value->value()->IsString()) return false; 1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String* str = String::cast(js_value->value()); 1387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (index >= (uint32_t)str->length()) return false; 1388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 1390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* FixedArray::get(int index) { 1394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kHeaderSize + index * kPointerSize); 1396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Smi* value) { 1400756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(map() != Heap::fixed_cow_array_map()); 1401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(reinterpret_cast<Object*>(value)->IsSmi()); 1402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = kHeaderSize + index * kPointerSize; 1403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Object* value) { 1408756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(map() != Heap::fixed_cow_array_map()); 1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = kHeaderSize + index * kPointerSize; 1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BARRIER(this, offset); 1413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 14164515c472dc3e5ed2448a564600976759e569a0a8Leon ClarkeWriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) { 1417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (Heap::InNewSpace(this)) return SKIP_WRITE_BARRIER; 1418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return UPDATE_WRITE_BARRIER; 1419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, 1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value, 1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode) { 1425756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(map() != Heap::fixed_cow_array_map()); 1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = kHeaderSize + index * kPointerSize; 1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CONDITIONAL_WRITE_BARRIER(this, offset, mode); 1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::fast_set(FixedArray* array, int index, Object* value) { 1434756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(array->map() != Heap::raw_unchecked_fixed_cow_array_map()); 1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < array->length()); 14364515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke ASSERT(!Heap::InNewSpace(value)); 1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); 1438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_undefined(int index) { 1442756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(map() != Heap::fixed_cow_array_map()); 1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!Heap::InNewSpace(Heap::undefined_value())); 1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kHeaderSize + index * kPointerSize, 1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Heap::undefined_value()); 1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_null(int index) { 1451756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(map() != Heap::fixed_cow_array_map()); 1452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!Heap::InNewSpace(Heap::null_value())); 1454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kHeaderSize + index * kPointerSize, Heap::null_value()); 1455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_the_hole(int index) { 1459756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(map() != Heap::fixed_cow_array_map()); 1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!Heap::InNewSpace(Heap::the_hole_value())); 1462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kHeaderSize + index * kPointerSize, Heap::the_hole_value()); 1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1466756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedArray::set_unchecked(int index, Smi* value) { 1467756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(reinterpret_cast<Object*>(value)->IsSmi()); 1468756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick int offset = kHeaderSize + index * kPointerSize; 1469756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick WRITE_FIELD(this, offset, value); 1470756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 1471756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1472756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1473f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdochvoid FixedArray::set_unchecked(int index, 1474f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch Object* value, 1475f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch WriteBarrierMode mode) { 1476f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch int offset = kHeaderSize + index * kPointerSize; 1477f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch WRITE_FIELD(this, offset, value); 1478f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CONDITIONAL_WRITE_BARRIER(this, offset, mode); 1479f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch} 1480f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 1481f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 1482756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedArray::set_null_unchecked(int index) { 1483756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(index >= 0 && index < this->length()); 1484756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(!Heap::InNewSpace(Heap::null_value())); 1485756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick WRITE_FIELD(this, kHeaderSize + index * kPointerSize, Heap::null_value()); 1486756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 1487756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1488756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 14896ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockObject** FixedArray::data_start() { 14906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return HeapObject::RawField(this, kHeaderSize); 14916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 14926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 14936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsEmpty() { 1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(this == Heap::empty_descriptor_array() || 1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block this->length() > 2); 1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this == Heap::empty_descriptor_array(); 1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::fast_swap(FixedArray* array, int first, int second) { 1502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* tmp = array->get(first); 1503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fast_set(array, first, array->get(second)); 1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fast_set(array, second, tmp); 1505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint DescriptorArray::Search(String* name) { 1509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block SLOW_ASSERT(IsSortedNoDuplicates()); 1510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check for empty descriptor array. 1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int nof = number_of_descriptors(); 1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (nof == 0) return kNotFound; 1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Fast case: do linear search for small arrays. 1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int kMaxElementsForLinearSearch = 8; 1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (StringShape(name).IsSymbol() && nof < kMaxElementsForLinearSearch) { 1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return LinearSearch(name, nof); 1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Slow case: perform binary search. 1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BinarySearch(name, 0, nof - 1); 1523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1526756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint DescriptorArray::SearchWithCache(String* name) { 1527756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick int number = DescriptorLookupCache::Lookup(this, name); 1528756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (number == DescriptorLookupCache::kAbsent) { 1529756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick number = Search(name); 1530756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick DescriptorLookupCache::Update(this, name, number); 1531756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 1532756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return number; 1533756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 1534756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1535756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* DescriptorArray::GetKey(int descriptor_number) { 1537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return String::cast(get(ToKeyIndex(descriptor_number))); 1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* DescriptorArray::GetValue(int descriptor_number) { 1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetContentArray()->get(ToValueIndex(descriptor_number)); 1545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* DescriptorArray::GetDetails(int descriptor_number) { 1549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::cast(GetContentArray()->get(ToDetailsIndex(descriptor_number))); 1551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType DescriptorArray::GetType(int descriptor_number) { 1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return PropertyDetails(GetDetails(descriptor_number)).type(); 1557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint DescriptorArray::GetFieldIndex(int descriptor_number) { 1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Descriptor::IndexFromValue(GetValue(descriptor_number)); 1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSFunction* DescriptorArray::GetConstantFunction(int descriptor_number) { 1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSFunction::cast(GetValue(descriptor_number)); 1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* DescriptorArray::GetCallbacksObject(int descriptor_number) { 1571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(GetType(descriptor_number) == CALLBACKS); 1572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetValue(descriptor_number); 1573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) { 1577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(GetType(descriptor_number) == CALLBACKS); 1578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Proxy* p = Proxy::cast(GetCallbacksObject(descriptor_number)); 1579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<AccessorDescriptor*>(p->proxy()); 1580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsProperty(int descriptor_number) { 1584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetType(descriptor_number) < FIRST_PHANTOM_PROPERTY_TYPE; 1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsTransition(int descriptor_number) { 1589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyType t = GetType(descriptor_number); 1590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return t == MAP_TRANSITION || t == CONSTANT_TRANSITION; 1591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsNullDescriptor(int descriptor_number) { 1595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetType(descriptor_number) == NULL_DESCRIPTOR; 1596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsDontEnum(int descriptor_number) { 1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return PropertyDetails(GetDetails(descriptor_number)).IsDontEnum(); 1601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::Get(int descriptor_number, Descriptor* desc) { 1605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->Init(GetKey(descriptor_number), 1606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block GetValue(descriptor_number), 1607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block GetDetails(descriptor_number)); 1608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::Set(int descriptor_number, Descriptor* desc) { 1612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Range check. 1613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1615e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Make sure none of the elements in desc are in new space. 1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!Heap::InNewSpace(desc->GetKey())); 1617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!Heap::InNewSpace(desc->GetValue())); 1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fast_set(this, ToKeyIndex(descriptor_number), desc->GetKey()); 1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray* content_array = GetContentArray(); 1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fast_set(content_array, ToValueIndex(descriptor_number), desc->GetValue()); 1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fast_set(content_array, ToDetailsIndex(descriptor_number), 1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->GetDetails().AsSmi()); 1624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1626a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::CopyFrom(int index, DescriptorArray* src, int src_index) { 1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Descriptor desc; 1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block src->Get(src_index, &desc); 1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Set(index, &desc); 1631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::Swap(int first, int second) { 1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fast_swap(this, ToKeyIndex(first), ToKeyIndex(second)); 1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray* content_array = GetContentArray(); 1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fast_swap(content_array, ToValueIndex(first), ToValueIndex(second)); 1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block fast_swap(content_array, ToDetailsIndex(first), ToDetailsIndex(second)); 1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool NumberDictionary::requires_slow_elements() { 1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* max_index_object = get(kMaxNumberKeyIndex); 1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!max_index_object->IsSmi()) return false; 1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0 != 1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask); 1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t NumberDictionary::max_number_key() { 1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!requires_slow_elements()); 1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* max_index_object = get(kMaxNumberKeyIndex); 1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!max_index_object->IsSmi()) return 0; 1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value()); 1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return value >> kRequiresSlowElementsTagSize; 1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid NumberDictionary::set_requires_slow_elements() { 16584515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask)); 1659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ------------------------------------ 1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Cast operations 1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(FixedArray) 1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(DescriptorArray) 1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SymbolTable) 16696ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCAST_ACCESSOR(JSFunctionResultCache) 167080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian MonsenCAST_ACCESSOR(NormalizedMapCache) 1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(CompilationCacheTable) 16726ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCAST_ACCESSOR(CodeCacheHashTable) 1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(MapCache) 1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(String) 1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqString) 1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqAsciiString) 1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqTwoByteString) 1678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ConsString) 1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalString) 1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalAsciiString) 1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalTwoByteString) 1682a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSObject) 1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Smi) 1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Failure) 1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(HeapObject) 1686a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(HeapNumber) 1687a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Oddball) 1688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalPropertyCell) 1689a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SharedFunctionInfo) 1690a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Map) 1691a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSFunction) 1692a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(GlobalObject) 1693a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalProxy) 1694a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalObject) 1695a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSBuiltinsObject) 1696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Code) 1697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSArray) 1698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSRegExp) 1699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Proxy) 1700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ByteArray) 1701a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(PixelArray) 17023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalArray) 17033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalByteArray) 17043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedByteArray) 17053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalShortArray) 17063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedShortArray) 17073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalIntArray) 17083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedIntArray) 17093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalFloatArray) 1710a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Struct) 1711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) 1714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STRUCT_LIST(MAKE_STRUCT_CAST) 1715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CAST 1716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename Shape, typename Key> 1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { 1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(obj->IsHashTable()); 1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<HashTable*>(obj); 1722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(FixedArray, length, kLengthOffset) 17267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(ByteArray, length, kLengthOffset) 17277f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 17287f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochINT_ACCESSORS(PixelArray, length, kLengthOffset) 17297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochINT_ACCESSORS(ExternalArray, length, kLengthOffset) 1730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17326ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockSMI_ACCESSORS(String, length, kLengthOffset) 1733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1735d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockuint32_t String::hash_field() { 1736d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return READ_UINT32_FIELD(this, kHashFieldOffset); 1737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1740d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvoid String::set_hash_field(uint32_t value) { 1741d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block WRITE_UINT32_FIELD(this, kHashFieldOffset, value); 17427f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_64_BIT 17437f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0); 17447f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif 1745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1748d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockbool String::Equals(String* other) { 1749d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (other == this) return true; 1750d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (StringShape(this).IsSymbol() && StringShape(other).IsSymbol()) { 1751d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return false; 1752d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 1753d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return SlowEquals(other); 1754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 17576ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockObject* String::TryFlatten(PretenureFlag pretenure) { 1758f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (!StringShape(this).IsCons()) return this; 1759f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke ConsString* cons = ConsString::cast(this); 1760f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (cons->second()->length() == 0) return cons->first(); 17616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return SlowTryFlatten(pretenure); 1762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1765f7060e27768c550ace7ec48ad8c093466db52dfaLeon ClarkeString* String::TryFlattenGetString(PretenureFlag pretenure) { 1766f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke Object* flat = TryFlatten(pretenure); 1767f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke return flat->IsFailure() ? this : String::cast(flat); 1768f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke} 1769f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 1770f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 1771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t String::Get(int index) { 1772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 1773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (StringShape(this).full_representation_tag()) { 1774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kSeqStringTag | kAsciiStringTag: 1775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return SeqAsciiString::cast(this)->SeqAsciiStringGet(index); 1776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kSeqStringTag | kTwoByteStringTag: 1777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index); 1778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kConsStringTag | kAsciiStringTag: 1779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kConsStringTag | kTwoByteStringTag: 1780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ConsString::cast(this)->ConsStringGet(index); 1781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kExternalStringTag | kAsciiStringTag: 1782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index); 1783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kExternalStringTag | kTwoByteStringTag: 1784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index); 1785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: 1786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block break; 1787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 1790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid String::Set(int index, uint16_t value) { 1795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 1796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(StringShape(this).IsSequential()); 1797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this->IsAsciiRepresentation() 1799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ? SeqAsciiString::cast(this)->SeqAsciiStringSet(index, value) 1800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value); 1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsFlat() { 1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (StringShape(this).representation_tag()) { 1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kConsStringTag: { 1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String* second = ConsString::cast(this)->second(); 1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only flattened strings have second part empty. 1809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return second->length() == 0; 1810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: 1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 1813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqAsciiString::SeqAsciiStringGet(int index) { 1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); 1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqAsciiString::SeqAsciiStringSet(int index, uint16_t value) { 1824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length() && value <= kMaxAsciiCharCode); 1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, 1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static_cast<byte>(value)); 1827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqAsciiString::GetCharsAddress() { 1831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FIELD_ADDR(this, kHeaderSize); 1832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* SeqAsciiString::GetChars() { 1836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<char*>(GetCharsAddress()); 1837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqTwoByteString::GetCharsAddress() { 1841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FIELD_ADDR(this, kHeaderSize); 1842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc16* SeqTwoByteString::GetChars() { 1846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize)); 1847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) { 1851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 1852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize); 1853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) { 1857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 1858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value); 1859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1860a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) { 18636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return SizeFor(length()); 1864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqAsciiString::SeqAsciiStringSize(InstanceType instance_type) { 18686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return SizeFor(length()); 1869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::first() { 1873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return String::cast(READ_FIELD(this, kFirstOffset)); 1874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_first() { 1878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kFirstOffset); 1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_first(String* value, WriteBarrierMode mode) { 1883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kFirstOffset, value); 1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CONDITIONAL_WRITE_BARRIER(this, kFirstOffset, mode); 1885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::second() { 1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return String::cast(READ_FIELD(this, kSecondOffset)); 1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_second() { 1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kSecondOffset); 1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_second(String* value, WriteBarrierMode mode) { 1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kSecondOffset, value); 1900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CONDITIONAL_WRITE_BARRIER(this, kSecondOffset, mode); 1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockExternalAsciiString::Resource* ExternalAsciiString::resource() { 1905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)); 1906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ExternalAsciiString::set_resource( 1910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExternalAsciiString::Resource* resource) { 1911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)) = resource; 1912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1913a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockExternalTwoByteString::Resource* ExternalTwoByteString::resource() { 1916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)); 1917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ExternalTwoByteString::set_resource( 1921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExternalTwoByteString::Resource* resource) { 1922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)) = resource; 1923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 19266ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSFunctionResultCache::MakeZeroSize() { 19276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block set(kFingerIndex, Smi::FromInt(kEntriesIndex)); 19286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block set(kCacheSizeIndex, Smi::FromInt(kEntriesIndex)); 19296ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 19306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19326ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSFunctionResultCache::Clear() { 19336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int cache_size = Smi::cast(get(kCacheSizeIndex))->value(); 19346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex)); 19356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block MemsetPointer(entries_start, Heap::the_hole_value(), cache_size); 19366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block MakeZeroSize(); 19376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 19386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 19396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte ByteArray::get(int index) { 1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); 1943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ByteArray::set(int index, byte value) { 1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value); 1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint ByteArray::get_int(int index) { 1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && (index * kIntSize) < this->length()); 1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_INT_FIELD(this, kHeaderSize + index * kIntSize); 1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockByteArray* ByteArray::FromDataStartAddress(Address address) { 1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_TAG_ALIGNED(address); 1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); 1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress ByteArray::GetDataStartAddress() { 1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; 1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint8_t* PixelArray::external_pointer() { 1970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); 1971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<uint8_t*>(ptr); 1972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PixelArray::set_external_pointer(uint8_t* value, WriteBarrierMode mode) { 1976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block intptr_t ptr = reinterpret_cast<intptr_t>(value); 1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); 1978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint8_t PixelArray::get(int index) { 1982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((index >= 0) && (index < this->length())); 1983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint8_t* ptr = external_pointer(); 1984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ptr[index]; 1985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid PixelArray::set(int index, uint8_t value) { 1989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((index >= 0) && (index < this->length())); 1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint8_t* ptr = external_pointer(); 1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ptr[index] = value; 1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 19953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid* ExternalArray::external_pointer() { 19963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); 19973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return reinterpret_cast<void*>(ptr); 19983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 19993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) { 20023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block intptr_t ptr = reinterpret_cast<intptr_t>(value); 20033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); 20043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockint8_t ExternalByteArray::get(int index) { 20083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int8_t* ptr = static_cast<int8_t*>(external_pointer()); 20103ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 20113ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20123ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20133ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20143ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalByteArray::set(int index, int8_t value) { 20153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int8_t* ptr = static_cast<int8_t*>(external_pointer()); 20173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 20183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockuint8_t ExternalUnsignedByteArray::get(int index) { 20223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); 20243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 20253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedByteArray::set(int index, uint8_t value) { 20293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); 20313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 20323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockint16_t ExternalShortArray::get(int index) { 20363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int16_t* ptr = static_cast<int16_t*>(external_pointer()); 20383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 20393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalShortArray::set(int index, int16_t value) { 20433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int16_t* ptr = static_cast<int16_t*>(external_pointer()); 20453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 20463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockuint16_t ExternalUnsignedShortArray::get(int index) { 20503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); 20523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 20533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedShortArray::set(int index, uint16_t value) { 20573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); 20593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 20603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockint32_t ExternalIntArray::get(int index) { 20643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int32_t* ptr = static_cast<int32_t*>(external_pointer()); 20663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 20673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalIntArray::set(int index, int32_t value) { 20713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int32_t* ptr = static_cast<int32_t*>(external_pointer()); 20733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 20743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockuint32_t ExternalUnsignedIntArray::get(int index) { 20783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); 20803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 20813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedIntArray::set(int index, uint32_t value) { 20853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); 20873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 20883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockfloat ExternalFloatArray::get(int index) { 20923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 20933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block float* ptr = static_cast<float*>(external_pointer()); 20943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 20953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 20963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 20983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalFloatArray::set(int index, float value) { 20993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 21003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block float* ptr = static_cast<float*>(external_pointer()); 21013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 21023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 21033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 21043bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 21059ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickint Map::visitor_id() { 21069ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick return READ_BYTE_FIELD(this, kVisitorIdOffset); 21079ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick} 21089ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick 21099ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick 21109ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickvoid Map::set_visitor_id(int id) { 21119ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick ASSERT(0 <= id && id < 256); 21129ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id)); 21139ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick} 21149ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick 21153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 2116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::instance_size() { 2117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2; 2118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::inobject_properties() { 2122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kInObjectPropertiesOffset); 2123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::pre_allocated_property_fields() { 2127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset); 2128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::SizeFromMap(Map* map) { 2132791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block int instance_size = map->instance_size(); 2133791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block if (instance_size != kVariableSizeSentinel) return instance_size; 2134791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // We can ignore the "symbol" bit becase it is only set for symbols 2135791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // and implies a string type. 2136791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block int instance_type = static_cast<int>(map->instance_type()) & ~kIsSymbolMask; 2137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only inline the most frequent cases. 2138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (instance_type == FIXED_ARRAY_TYPE) { 2139756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return FixedArray::BodyDescriptor::SizeOf(map, this); 2140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2141791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block if (instance_type == ASCII_STRING_TYPE) { 2142791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return SeqAsciiString::SizeFor( 2143791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block reinterpret_cast<SeqAsciiString*>(this)->length()); 2144791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block } 2145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (instance_type == BYTE_ARRAY_TYPE) { 2146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<ByteArray*>(this)->ByteArraySize(); 2147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2148791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block if (instance_type == STRING_TYPE) { 2149791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return SeqTwoByteString::SizeFor( 2150791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block reinterpret_cast<SeqTwoByteString*>(this)->length()); 2151791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block } 2152791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block ASSERT(instance_type == CODE_TYPE); 2153791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return reinterpret_cast<Code*>(this)->CodeSize(); 2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_size(int value) { 2158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_EQ(0, value & (kPointerSize - 1)); 2159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value >>= kPointerSizeLog2; 2160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= value && value < 256); 2161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value)); 2162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_inobject_properties(int value) { 2166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= value && value < 256); 2167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value)); 2168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_pre_allocated_property_fields(int value) { 2172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= value && value < 256); 2173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, 2174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPreAllocatedPropertyFieldsOffset, 2175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static_cast<byte>(value)); 2176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInstanceType Map::instance_type() { 2180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset)); 2181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_type(InstanceType value) { 2185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= value && value < 256); 2186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value); 2187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::unused_property_fields() { 2191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset); 2192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_unused_property_fields(int value) { 2196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255)); 2197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte Map::bit_field() { 2201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kBitFieldOffset); 2202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field(byte value) { 2206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kBitFieldOffset, value); 2207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte Map::bit_field2() { 2211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kBitField2Offset); 2212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field2(byte value) { 2216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kBitField2Offset, value); 2217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_non_instance_prototype(bool value) { 2221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (value) { 2222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_bit_field(bit_field() | (1 << kHasNonInstancePrototype)); 2223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype)); 2225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Map::has_non_instance_prototype() { 2230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((1 << kHasNonInstancePrototype) & bit_field()) != 0; 2231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 22346ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Map::set_function_with_prototype(bool value) { 22356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (value) { 22366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block set_bit_field2(bit_field2() | (1 << kFunctionWithPrototype)); 22376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } else { 22386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block set_bit_field2(bit_field2() & ~(1 << kFunctionWithPrototype)); 22396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 22406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 22416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22436ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Map::function_with_prototype() { 22446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return ((1 << kFunctionWithPrototype) & bit_field2()) != 0; 22456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 22466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 22476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_is_access_check_needed(bool access_check_needed) { 2249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (access_check_needed) { 2250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded)); 2251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded)); 2253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Map::is_access_check_needed() { 2258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0; 2259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 22628defd9ff6930b4e24729971a61cf7469daf119beSteve Blockvoid Map::set_is_extensible(bool value) { 22638defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (value) { 22648defd9ff6930b4e24729971a61cf7469daf119beSteve Block set_bit_field2(bit_field2() | (1 << kIsExtensible)); 22658defd9ff6930b4e24729971a61cf7469daf119beSteve Block } else { 22668defd9ff6930b4e24729971a61cf7469daf119beSteve Block set_bit_field2(bit_field2() & ~(1 << kIsExtensible)); 22678defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 22688defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 22698defd9ff6930b4e24729971a61cf7469daf119beSteve Block 22708defd9ff6930b4e24729971a61cf7469daf119beSteve Blockbool Map::is_extensible() { 22718defd9ff6930b4e24729971a61cf7469daf119beSteve Block return ((1 << kIsExtensible) & bit_field2()) != 0; 22728defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 22738defd9ff6930b4e24729971a61cf7469daf119beSteve Block 22748defd9ff6930b4e24729971a61cf7469daf119beSteve Block 22750d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Map::set_attached_to_shared_function_info(bool value) { 22760d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (value) { 22770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_bit_field2(bit_field2() | (1 << kAttachedToSharedFunctionInfo)); 22780d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 22790d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_bit_field2(bit_field2() & ~(1 << kAttachedToSharedFunctionInfo)); 22800d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 22810d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 22820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22830d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool Map::attached_to_shared_function_info() { 22840d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return ((1 << kAttachedToSharedFunctionInfo) & bit_field2()) != 0; 22850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 22860d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22880d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Map::set_is_shared(bool value) { 22890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (value) { 22900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_bit_field2(bit_field2() | (1 << kIsShared)); 22910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 22920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_bit_field2(bit_field2() & ~(1 << kIsShared)); 22930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 22940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 22950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 22960d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool Map::is_shared() { 22970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return ((1 << kIsShared) & bit_field2()) != 0; 22980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 22990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 23000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 23010d5e116f6aee03185f237311a943491bb079a768Kristian MonsenJSFunction* Map::unchecked_constructor() { 23020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return reinterpret_cast<JSFunction*>(READ_FIELD(this, kConstructorOffset)); 23030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 23040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 23058defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::flags() { 2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset)); 2308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Code::set_flags(Code::Flags flags) { 2312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STATIC_ASSERT(Code::NUMBER_OF_KINDS <= (kFlagsKindMask >> kFlagsKindShift)+1); 2313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Make sure that all call stubs have an arguments count. 23147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT((ExtractKindFromFlags(flags) != CALL_IC && 23157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ExtractKindFromFlags(flags) != KEYED_CALL_IC) || 2316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExtractArgumentsCountFromFlags(flags) >= 0); 2317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_INT_FIELD(this, kFlagsOffset, flags); 2318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::kind() { 2322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExtractKindFromFlags(flags()); 2323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInLoopFlag Code::ic_in_loop() { 2327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExtractICInLoopFromFlags(flags()); 2328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInlineCacheState Code::ic_state() { 2332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InlineCacheState result = ExtractICStateFromFlags(flags()); 2333a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only allow uninitialized or debugger states for non-IC code 2334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // objects. This is used in the debugger to determine whether or not 2335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // a call to code object has been replaced with a debug break call. 2336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_inline_cache_stub() || 2337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result == UNINITIALIZED || 2338a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result == DEBUG_BREAK || 2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result == DEBUG_PREPARE_STEP_IN); 2340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 2341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2342a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2343a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2344a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType Code::type() { 2345a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(ic_state() == MONOMORPHIC); 2346a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExtractTypeFromFlags(flags()); 2347a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2348a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2349a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2350a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::arguments_count() { 23517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB); 2352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExtractArgumentsCountFromFlags(flags()); 2353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 235680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenint Code::major_key() { 23576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(kind() == STUB || kind() == BINARY_OP_IC); 235880d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return READ_BYTE_FIELD(this, kStubMajorKeyOffset); 2359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 236280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid Code::set_major_key(int major) { 23636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(kind() == STUB || kind() == BINARY_OP_IC); 2364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= major && major < 256); 2365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kStubMajorKeyOffset, major); 2366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Code::is_inline_cache_stub() { 2370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Kind kind = this->kind(); 2371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND; 2372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::ComputeFlags(Kind kind, 2376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InLoopFlag in_loop, 2377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InlineCacheState ic_state, 2378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyType type, 23798defd9ff6930b4e24729971a61cf7469daf119beSteve Block int argc, 23808defd9ff6930b4e24729971a61cf7469daf119beSteve Block InlineCacheHolderFlag holder) { 2381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Compute the bit mask. 2382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int bits = kind << kFlagsKindShift; 2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (in_loop) bits |= kFlagsICInLoopMask; 2384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bits |= ic_state << kFlagsICStateShift; 2385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bits |= type << kFlagsTypeShift; 2386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bits |= argc << kFlagsArgumentsCountShift; 23878defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask; 2388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Cast to flags and validate result before returning it. 2389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Flags result = static_cast<Flags>(bits); 2390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(ExtractKindFromFlags(result) == kind); 2391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(ExtractICStateFromFlags(result) == ic_state); 2392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(ExtractICInLoopFromFlags(result) == in_loop); 2393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(ExtractTypeFromFlags(result) == type); 2394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(ExtractArgumentsCountFromFlags(result) == argc); 2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::ComputeMonomorphicFlags(Kind kind, 2400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyType type, 24018defd9ff6930b4e24729971a61cf7469daf119beSteve Block InlineCacheHolderFlag holder, 2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InLoopFlag in_loop, 2403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int argc) { 24048defd9ff6930b4e24729971a61cf7469daf119beSteve Block return ComputeFlags(kind, in_loop, MONOMORPHIC, type, argc, holder); 2405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::ExtractKindFromFlags(Flags flags) { 2409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int bits = (flags & kFlagsKindMask) >> kFlagsKindShift; 2410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Kind>(bits); 2411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInlineCacheState Code::ExtractICStateFromFlags(Flags flags) { 2415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int bits = (flags & kFlagsICStateMask) >> kFlagsICStateShift; 2416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<InlineCacheState>(bits); 2417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInLoopFlag Code::ExtractICInLoopFromFlags(Flags flags) { 2421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int bits = (flags & kFlagsICInLoopMask); 2422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return bits != 0 ? IN_LOOP : NOT_IN_LOOP; 2423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType Code::ExtractTypeFromFlags(Flags flags) { 2427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int bits = (flags & kFlagsTypeMask) >> kFlagsTypeShift; 2428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<PropertyType>(bits); 2429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::ExtractArgumentsCountFromFlags(Flags flags) { 2433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (flags & kFlagsArgumentsCountMask) >> kFlagsArgumentsCountShift; 2434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 24378defd9ff6930b4e24729971a61cf7469daf119beSteve BlockInlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) { 24388defd9ff6930b4e24729971a61cf7469daf119beSteve Block int bits = (flags & kFlagsCacheInPrototypeMapMask); 24398defd9ff6930b4e24729971a61cf7469daf119beSteve Block return bits != 0 ? PROTOTYPE_MAP : OWN_MAP; 24408defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 24418defd9ff6930b4e24729971a61cf7469daf119beSteve Block 24428defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::RemoveTypeFromFlags(Flags flags) { 2444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int bits = flags & ~kFlagsTypeMask; 2445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Flags>(bits); 2446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* Code::GetCodeFromTargetAddress(Address address) { 2450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize); 2451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // GetCodeFromTargetAddress might be called when marking objects during mark 2452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // sweep. reinterpret_cast is therefore used instead of the more appropriate 2453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code::cast. Code::cast does not work when the object's map is 2454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // marked. 2455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Code* result = reinterpret_cast<Code*>(code); 2456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 2457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2460791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve BlockObject* Code::GetObjectFromEntryAddress(Address location_of_address) { 2461791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return HeapObject:: 2462791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize); 2463791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block} 2464791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 2465791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 2466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Map::prototype() { 2467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kPrototypeOffset); 2468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_prototype(Object* value, WriteBarrierMode mode) { 2472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(value->IsNull() || value->IsJSObject()); 2473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kPrototypeOffset, value); 2474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CONDITIONAL_WRITE_BARRIER(this, kPrototypeOffset, mode); 2475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 24788defd9ff6930b4e24729971a61cf7469daf119beSteve BlockObject* Map::GetFastElementsMap() { 24798defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (has_fast_elements()) return this; 24808defd9ff6930b4e24729971a61cf7469daf119beSteve Block Object* obj = CopyDropTransitions(); 24818defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (obj->IsFailure()) return obj; 24828defd9ff6930b4e24729971a61cf7469daf119beSteve Block Map* new_map = Map::cast(obj); 24838defd9ff6930b4e24729971a61cf7469daf119beSteve Block new_map->set_has_fast_elements(true); 2484756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick Counters::map_slow_to_fast_elements.Increment(); 24858defd9ff6930b4e24729971a61cf7469daf119beSteve Block return new_map; 24868defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 24878defd9ff6930b4e24729971a61cf7469daf119beSteve Block 24888defd9ff6930b4e24729971a61cf7469daf119beSteve Block 24898defd9ff6930b4e24729971a61cf7469daf119beSteve BlockObject* Map::GetSlowElementsMap() { 24908defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (!has_fast_elements()) return this; 24918defd9ff6930b4e24729971a61cf7469daf119beSteve Block Object* obj = CopyDropTransitions(); 24928defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (obj->IsFailure()) return obj; 24938defd9ff6930b4e24729971a61cf7469daf119beSteve Block Map* new_map = Map::cast(obj); 24948defd9ff6930b4e24729971a61cf7469daf119beSteve Block new_map->set_has_fast_elements(false); 2495756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick Counters::map_fast_to_slow_elements.Increment(); 24968defd9ff6930b4e24729971a61cf7469daf119beSteve Block return new_map; 24978defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 24988defd9ff6930b4e24729971a61cf7469daf119beSteve Block 24998defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Map, instance_descriptors, DescriptorArray, 2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceDescriptorsOffset) 25026ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(Map, code_cache, Object, kCodeCacheOffset) 2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Map, constructor, Object, kConstructorOffset) 2504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) 2506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, literals, FixedArray, kLiteralsOffset) 2507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset) 2509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset) 2510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, global_receiver, JSObject, kGlobalReceiverOffset) 2511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSGlobalProxy, context, Object, kContextOffset) 2513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, getter, Object, kGetterOffset) 2515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, setter, Object, kSetterOffset) 2516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, data, Object, kDataOffset) 2517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, name, Object, kNameOffset) 2518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, flag, Smi, kFlagOffset) 2519d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockACCESSORS(AccessorInfo, load_stub_cache, Object, kLoadStubCacheOffset) 2520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, named_callback, Object, kNamedCallbackOffset) 2522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, indexed_callback, Object, kIndexedCallbackOffset) 2523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, data, Object, kDataOffset) 2524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, getter, Object, kGetterOffset) 2526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, setter, Object, kSetterOffset) 2527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, query, Object, kQueryOffset) 2528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset) 2529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset) 2530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, data, Object, kDataOffset) 2531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset) 2533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, data, Object, kDataOffset) 2534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, tag, Object, kTagOffset) 2536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset) 2537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, serial_number, Object, kSerialNumberOffset) 2539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset) 2540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, property_accessors, Object, 2541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPropertyAccessorsOffset) 2542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, prototype_template, Object, 2543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPrototypeTemplateOffset) 2544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset) 2545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, named_property_handler, Object, 2546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kNamedPropertyHandlerOffset) 2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object, 2548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIndexedPropertyHandlerOffset) 2549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_template, Object, 2550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceTemplateOffset) 2551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset) 2552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset) 2553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_call_handler, Object, 2554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceCallHandlerOffset) 2555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, access_check_info, Object, 2556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kAccessCheckInfoOffset) 2557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, flag, Smi, kFlagOffset) 2558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset) 2560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, internal_field_count, Object, 2561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInternalFieldCountOffset) 2562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset) 2564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SignatureInfo, args, Object, kArgsOffset) 2565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TypeSwitchInfo, types, Object, kTypesOffset) 2567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, source, Object, kSourceOffset) 2569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, name, Object, kNameOffset) 2570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, id, Object, kIdOffset) 2571a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, line_offset, Smi, kLineOffsetOffset) 2572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, column_offset, Smi, kColumnOffsetOffset) 2573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, data, Object, kDataOffset) 2574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, context_data, Object, kContextOffset) 2575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, wrapper, Proxy, kWrapperOffset) 2576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, type, Smi, kTypeOffset) 2577a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, compilation_type, Smi, kCompilationTypeOffset) 2578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, line_ends, Object, kLineEndsOffset) 2579d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockACCESSORS(Script, eval_from_shared, Object, kEvalFromSharedOffset) 2580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, eval_from_instructions_offset, Smi, 2581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kEvalFrominstructionsOffsetOffset) 2582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT 2584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex) 2585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex) 2586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, code, Code, kPatchedCodeIndex) 2587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex) 2588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, code_position, Smi, kCodePositionIndex) 2590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, source_position, Smi, kSourcePositionIndex) 2591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, statement_position, Smi, kStatementPositionIndex) 2592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex) 2593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 2594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, name, Object, kNameOffset) 25966ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset) 25970d5e116f6aee03185f237311a943491bb079a768Kristian MonsenACCESSORS(SharedFunctionInfo, initial_map, Object, kInitialMapOffset) 2598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, instance_class_name, Object, 2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceClassNameOffset) 26006ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset) 2601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset) 2602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset) 2603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset) 2604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, this_property_assignments, Object, 2605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kThisPropertyAssignmentsOffset) 2606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype, 2608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kHiddenPrototypeBit) 2609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit) 2610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check, 2611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kNeedsAccessCheckBit) 2612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression, 2613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIsExpressionBit) 2614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel, 2615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIsTopLevelBit) 2616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_GETTER(SharedFunctionInfo, compiler_hints, 2617a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block has_only_simple_this_property_assignments, 2618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kHasOnlySimpleThisPropertyAssignments) 2619d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockBOOL_ACCESSORS(SharedFunctionInfo, 2620d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block compiler_hints, 2621d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke try_full_codegen, 2622d91b9f7d46489a9ee00f9cb415630299c76a502bLeon Clarke kTryFullCodegen) 26237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, 26247f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch compiler_hints, 26257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch allows_lazy_compilation, 26267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kAllowLazyCompilation) 2627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2628756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 26297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_32_BIT 26307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset) 26317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count, 2632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kFormalParameterCountOffset) 26337f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties, 2634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kExpectedNofPropertiesOffset) 26357f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset) 26367f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, start_position_and_type, 2637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kStartPositionAndTypeOffset) 26387f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset) 26397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, function_token_position, 2640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kFunctionTokenPositionOffset) 26417f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, compiler_hints, 2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kCompilerHintsOffset) 26437f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count, 2644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kThisPropertyAssignmentsCountOffset) 26457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#else 26467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26477f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \ 26487f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch int holder::name() { \ 26497f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch int value = READ_INT_FIELD(this, offset); \ 26507f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(kHeapObjectTag == 1); \ 26517f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT((value & kHeapObjectTag) == 0); \ 26527f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return value >> 1; \ 26537f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } \ 26547f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch void holder::set_##name(int value) { \ 26557f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(kHeapObjectTag == 1); \ 26567f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT((value & 0xC0000000) == 0xC0000000 || \ 26577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch (value & 0xC0000000) == 0x000000000); \ 26587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch WRITE_INT_FIELD(this, \ 26597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch offset, \ 26607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch (value << 1) & ~kHeapObjectTag); \ 26617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } 26627f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \ 26647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch INT_ACCESSORS(holder, name, offset) 26657f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26687f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset) 26697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, formal_parameter_count, 26707f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kFormalParameterCountOffset) 26717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26727f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, expected_nof_properties, 26737f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kExpectedNofPropertiesOffset) 26747f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset) 26757f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, start_position_and_type, 26777f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kStartPositionAndTypeOffset) 26787f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, end_position, kEndPositionOffset) 2679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26807f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, function_token_position, 26817f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kFunctionTokenPositionOffset) 26827f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, compiler_hints, 26837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kCompilerHintsOffset) 26847f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 26857f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, this_property_assignments_count, 26867f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kThisPropertyAssignmentsCountOffset) 26877f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif 2688a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 26890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 26900d5e116f6aee03185f237311a943491bb079a768Kristian Monsenint SharedFunctionInfo::construction_count() { 26910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return READ_BYTE_FIELD(this, kConstructionCountOffset); 26920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 26930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 26940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 26950d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid SharedFunctionInfo::set_construction_count(int value) { 26960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(0 <= value && value < 256); 26970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen WRITE_BYTE_FIELD(this, kConstructionCountOffset, static_cast<byte>(value)); 26980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 26990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 27000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 27010d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool SharedFunctionInfo::live_objects_may_exist() { 27020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return (compiler_hints() & (1 << kLiveObjectsMayExist)) != 0; 27030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 27040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 27050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 27060d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid SharedFunctionInfo::set_live_objects_may_exist(bool value) { 27070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (value) { 27080d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_compiler_hints(compiler_hints() | (1 << kLiveObjectsMayExist)); 27090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 27100d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_compiler_hints(compiler_hints() & ~(1 << kLiveObjectsMayExist)); 27110d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 27120d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 27130d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 27140d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 27150d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool SharedFunctionInfo::IsInobjectSlackTrackingInProgress() { 27160d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return initial_map() != Heap::undefined_value(); 27170d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 27180d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 27190d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 27206ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset) 27216ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset) 27226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 27233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Script::HasValidSource() { 27243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block Object* src = this->source(); 27253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (!src->IsString()) return true; 27263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block String* src_str = String::cast(src); 27273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (!StringShape(src_str).IsExternal()) return true; 27283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (src_str->IsAsciiRepresentation()) { 27293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ExternalAsciiString::cast(src)->resource() != NULL; 27303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } else if (src_str->IsTwoByteRepresentation()) { 27313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ExternalTwoByteString::cast(src)->resource() != NULL; 27323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 27333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return true; 27343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 27353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 27363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::DontAdaptArguments() { 2738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(code()->kind() == Code::BUILTIN); 2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_formal_parameter_count(kDontAdaptArgumentsSentinel); 2740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SharedFunctionInfo::start_position() { 2744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return start_position_and_type() >> kStartPositionShift; 2745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_start_position(int start_position) { 2749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_start_position_and_type((start_position << kStartPositionShift) 2750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block | (start_position_and_type() & ~kStartPositionMask)); 2751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* SharedFunctionInfo::code() { 2755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Code::cast(READ_FIELD(this, kCodeOffset)); 2756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2759756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickCode* SharedFunctionInfo::unchecked_code() { 2760756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset)); 2761756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 2762756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2763756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) { 2765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kCodeOffset, value); 2766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, mode); 2767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 27703bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben MurdochSerializedScopeInfo* SharedFunctionInfo::scope_info() { 27713bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch return reinterpret_cast<SerializedScopeInfo*>( 27723bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch READ_FIELD(this, kScopeInfoOffset)); 27733bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch} 27743bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 27753bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 27763bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdochvoid SharedFunctionInfo::set_scope_info(SerializedScopeInfo* value, 27773bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch WriteBarrierMode mode) { 27783bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value)); 27793bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch CONDITIONAL_WRITE_BARRIER(this, kScopeInfoOffset, mode); 27803bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch} 27813bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 27823bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 2783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool SharedFunctionInfo::is_compiled() { 2784756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return code() != Builtins::builtin(Builtins::LazyCompile); 2785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 27886ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool SharedFunctionInfo::IsApiFunction() { 27896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return function_data()->IsFunctionTemplateInfo(); 27906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 27916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 27926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 27936ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockFunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() { 27946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(IsApiFunction()); 27956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return FunctionTemplateInfo::cast(function_data()); 27966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 27976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 27986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 27996ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool SharedFunctionInfo::HasCustomCallGenerator() { 280025f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen return function_data()->IsSmi(); 280125f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen} 280225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 280325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 280425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsenint SharedFunctionInfo::custom_call_generator_id() { 280525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen ASSERT(HasCustomCallGenerator()); 280625f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen return Smi::cast(function_data())->value(); 2807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2810756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint SharedFunctionInfo::code_age() { 2811756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask; 2812756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 2813756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2814756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2815756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid SharedFunctionInfo::set_code_age(int code_age) { 2816756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick set_compiler_hints(compiler_hints() | 2817756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ((code_age & kCodeAgeMask) << kCodeAgeShift)); 2818756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 2819756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2820756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::IsBuiltin() { 2822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return context()->global()->IsJSBuiltinsObject(); 2823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* JSFunction::code() { 2827791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return Code::cast(unchecked_code()); 2828756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 2829756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2830756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2831756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickCode* JSFunction::unchecked_code() { 2832791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return reinterpret_cast<Code*>( 2833791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset))); 2834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_code(Code* value) { 2838756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // Skip the write barrier because code is never in new space. 2839756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(!Heap::InNewSpace(value)); 2840791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block Address entry = value->entry(); 2841791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry)); 2842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockContext* JSFunction::context() { 2846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Context::cast(READ_FIELD(this, kContextOffset)); 2847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::unchecked_context() { 2851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kContextOffset); 2852a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2855756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickSharedFunctionInfo* JSFunction::unchecked_shared() { 2856756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return reinterpret_cast<SharedFunctionInfo*>( 2857756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick READ_FIELD(this, kSharedFunctionInfoOffset)); 2858756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 2859756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2860756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 2861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_context(Object* value) { 2862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(value == Heap::undefined_value() || value->IsContext()); 2863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kContextOffset, value); 2864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BARRIER(this, kContextOffset); 2865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, prototype_or_initial_map, Object, 2868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPrototypeOrInitialMapOffset) 2869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* JSFunction::initial_map() { 2872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Map::cast(prototype_or_initial_map()); 2873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_initial_map(Map* value) { 2877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_prototype_or_initial_map(value); 2878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2880a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_initial_map() { 2882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return prototype_or_initial_map()->IsMap(); 2883a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_instance_prototype() { 2887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return has_initial_map() || !prototype_or_initial_map()->IsTheHole(); 2888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_prototype() { 2892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map()->has_non_instance_prototype() || has_instance_prototype(); 2893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::instance_prototype() { 2897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(has_instance_prototype()); 2898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (has_initial_map()) return initial_map()->prototype(); 2899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // When there is no initial map and the prototype is a JSObject, the 2900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // initial map field is used for the prototype field. 2901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return prototype_or_initial_map(); 2902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2905a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::prototype() { 2906a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(has_prototype()); 2907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If the function's prototype property has been set to a non-JSObject 2908a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // value, that value is stored in the constructor field of the map. 2909a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (map()->has_non_instance_prototype()) return map()->constructor(); 2910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return instance_prototype(); 2911a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29136ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool JSFunction::should_have_prototype() { 29146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return map()->function_with_prototype(); 29156ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 29166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::is_compiled() { 2919756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return code() != Builtins::builtin(Builtins::LazyCompile); 2920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSFunction::NumberOfLiterals() { 2924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return literals()->length(); 2925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) { 2929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= id && id < kJSBuiltinsCount); 29306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return READ_FIELD(this, OffsetOfFunctionWithId(id)); 2931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id, 2935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value) { 2936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= id && id < kJSBuiltinsCount); 29376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block WRITE_FIELD(this, OffsetOfFunctionWithId(id), value); 29386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block WRITE_BARRIER(this, OffsetOfFunctionWithId(id)); 29396ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 29406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 29416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 29426ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCode* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) { 29436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(0 <= id && id < kJSBuiltinsCount); 29446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id))); 29456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 29466ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 29476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 29486ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id, 29496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Code* value) { 29506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(0 <= id && id < kJSBuiltinsCount); 29516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block WRITE_FIELD(this, OffsetOfCodeWithId(id), value); 29526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(!Heap::InNewSpace(value)); 2953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress Proxy::proxy() { 2957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return AddressFrom<Address>(READ_INTPTR_FIELD(this, kProxyOffset)); 2958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Proxy::set_proxy(Address value) { 2962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_INTPTR_FIELD(this, kProxyOffset, OffsetFrom(value)); 2963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSValue, value, Object, kValueOffset) 2967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSValue* JSValue::cast(Object* obj) { 2970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(obj->IsJSValue()); 2971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize); 2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<JSValue*>(obj); 2973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockINT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset) 2977ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon ClarkeACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset) 2978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::instruction_start() { 2981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FIELD_ADDR(this, kHeaderSize); 2982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2985ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarkebyte* Code::instruction_end() { 2986ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return instruction_start() + instruction_size(); 2987ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke} 2988ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 2989ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 2990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::body_size() { 2991ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return RoundUp(instruction_size(), kObjectAlignment); 2992ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke} 2993ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 2994ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 2995ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon ClarkeByteArray* Code::unchecked_relocation_info() { 2996ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset)); 2997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::relocation_start() { 3001ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return unchecked_relocation_info()->GetDataStartAddress(); 3002ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke} 3003ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 3004ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 3005ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarkeint Code::relocation_size() { 3006ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return unchecked_relocation_info()->length(); 3007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::entry() { 3011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return instruction_start(); 3012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Code::contains(byte* pc) { 3016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (instruction_start() <= pc) && 301780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen (pc <= instruction_start() + instruction_size()); 3018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSArray, length, Object, kLengthOffset) 3022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSRegExp, data, Object, kDataOffset) 3025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Type JSRegExp::TypeTag() { 3028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* data = this->data(); 3029a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (data->IsUndefined()) return JSRegExp::NOT_COMPILED; 3030a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex)); 3031a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<JSRegExp::Type>(smi->value()); 3032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3035a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSRegExp::CaptureCount() { 3036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (TypeTag()) { 3037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case ATOM: 3038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 3039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case IRREGEXP: 3040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value(); 3041a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: 3042a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 3043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return -1; 3044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3048a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Flags JSRegExp::GetFlags() { 3049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(this->data()->IsFixedArray()); 3050a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* data = this->data(); 3051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex)); 3052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Flags(smi->value()); 3053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* JSRegExp::Pattern() { 3057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(this->data()->IsFixedArray()); 3058a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* data = this->data(); 3059a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex)); 3060a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return pattern; 3061a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSRegExp::DataAt(int index) { 3065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(TypeTag() != NOT_COMPILED); 3066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FixedArray::cast(data())->get(index); 3067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSRegExp::SetDataAt(int index, Object* value) { 3071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(TypeTag() != NOT_COMPILED); 3072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= kDataIndex); // Only implementation data can be set this way. 3073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray::cast(data())->set(index, value); 3074a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSObject::ElementsKind JSObject::GetElementsKind() { 3078756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (map()->has_fast_elements()) { 3079756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(elements()->map() == Heap::fixed_array_map() || 3080756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick elements()->map() == Heap::fixed_cow_array_map()); 3081756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return FAST_ELEMENTS; 3082756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 30837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch HeapObject* array = elements(); 3084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (array->IsFixedArray()) { 3085756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // FAST_ELEMENTS or DICTIONARY_ELEMENTS are both stored in a 3086756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick // FixedArray, but FAST_ELEMENTS is already handled above. 3087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(array->IsDictionary()); 3088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return DICTIONARY_ELEMENTS; 3089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 30903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (array->IsExternalArray()) { 30913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block switch (array->map()->instance_type()) { 30923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block case EXTERNAL_BYTE_ARRAY_TYPE: 30933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return EXTERNAL_BYTE_ELEMENTS; 30943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE: 30953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return EXTERNAL_UNSIGNED_BYTE_ELEMENTS; 30963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block case EXTERNAL_SHORT_ARRAY_TYPE: 30973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return EXTERNAL_SHORT_ELEMENTS; 30983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE: 30993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return EXTERNAL_UNSIGNED_SHORT_ELEMENTS; 31003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block case EXTERNAL_INT_ARRAY_TYPE: 31013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return EXTERNAL_INT_ELEMENTS; 31023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE: 31033ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return EXTERNAL_UNSIGNED_INT_ELEMENTS; 31043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block default: 31053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT(array->map()->instance_type() == EXTERNAL_FLOAT_ARRAY_TYPE); 31063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return EXTERNAL_FLOAT_ELEMENTS; 31073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 31083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 3109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(array->IsPixelArray()); 3110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return PIXEL_ELEMENTS; 3111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasFastElements() { 3115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetElementsKind() == FAST_ELEMENTS; 3116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasDictionaryElements() { 3120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetElementsKind() == DICTIONARY_ELEMENTS; 3121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasPixelElements() { 3125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetElementsKind() == PIXEL_ELEMENTS; 3126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalArrayElements() { 31303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return (HasExternalByteElements() || 31313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HasExternalUnsignedByteElements() || 31323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HasExternalShortElements() || 31333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HasExternalUnsignedShortElements() || 31343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HasExternalIntElements() || 31353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HasExternalUnsignedIntElements() || 31363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HasExternalFloatElements()); 31373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 31383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalByteElements() { 31413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return GetElementsKind() == EXTERNAL_BYTE_ELEMENTS; 31423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 31433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalUnsignedByteElements() { 31463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return GetElementsKind() == EXTERNAL_UNSIGNED_BYTE_ELEMENTS; 31473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 31483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalShortElements() { 31513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return GetElementsKind() == EXTERNAL_SHORT_ELEMENTS; 31523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 31533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalUnsignedShortElements() { 31563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return GetElementsKind() == EXTERNAL_UNSIGNED_SHORT_ELEMENTS; 31573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 31583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalIntElements() { 31613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return GetElementsKind() == EXTERNAL_INT_ELEMENTS; 31623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 31633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalUnsignedIntElements() { 31663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return GetElementsKind() == EXTERNAL_UNSIGNED_INT_ELEMENTS; 31673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 31683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalFloatElements() { 31713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return GetElementsKind() == EXTERNAL_FLOAT_ELEMENTS; 31723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 31733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 31743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasNamedInterceptor() { 3176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map()->has_named_interceptor(); 3177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasIndexedInterceptor() { 3181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map()->has_indexed_interceptor(); 3182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31856ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool JSObject::AllowsSetElementsLength() { 31866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block bool result = elements()->IsFixedArray(); 31876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(result == (!HasPixelElements() && !HasExternalArrayElements())); 31886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return result; 31896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 31906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 31916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 3192756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickObject* JSObject::EnsureWritableFastElements() { 3193756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(HasFastElements()); 3194756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick FixedArray* elems = FixedArray::cast(elements()); 3195756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (elems->map() != Heap::fixed_cow_array_map()) return elems; 31960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Object* writable_elems = Heap::CopyFixedArrayWithMap(elems, 31970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen Heap::fixed_array_map()); 3198756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (writable_elems->IsFailure()) return writable_elems; 3199756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick set_elements(FixedArray::cast(writable_elems)); 3200756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick Counters::cow_arrays_converted.Increment(); 3201756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return writable_elems; 3202756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3203756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3204756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringDictionary* JSObject::property_dictionary() { 3206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!HasFastProperties()); 3207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringDictionary::cast(properties()); 3208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockNumberDictionary* JSObject::element_dictionary() { 3212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(HasDictionaryElements()); 3213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return NumberDictionary::cast(elements()); 3214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 32177f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool String::IsHashFieldComputed(uint32_t field) { 32187f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return (field & kHashNotComputedMask) == 0; 32197f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 32207f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 32217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 3222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::HasHashCode() { 32237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return IsHashFieldComputed(hash_field()); 3224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t String::Hash() { 3228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Fast case: has hash code already been computed? 3229d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block uint32_t field = hash_field(); 32307f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch if (IsHashFieldComputed(field)) return field >> kHashShift; 3231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Slow case: compute hash code and set it. 3232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ComputeAndSetHash(); 3233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringHasher::StringHasher(int length) 3237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : length_(length), 3238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_(0), 3239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block array_index_(0), 3240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize), 3241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_first_char_(true), 3242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_valid_(true) { } 3243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringHasher::has_trivial_hash() { 3246d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return length_ > String::kMaxHashCalcLength; 3247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid StringHasher::AddCharacter(uc32 c) { 3251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Use the Jenkins one-at-a-time hash function to update the hash 3252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // for the given character. 3253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ += c; 3254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ += (raw_running_hash_ << 10); 3255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ ^= (raw_running_hash_ >> 6); 3256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Incremental array index computation. 3257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_array_index_) { 3258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (c < '0' || c > '9') { 3259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_array_index_ = false; 3260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 3261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int d = c - '0'; 3262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_first_char_) { 3263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_first_char_ = false; 3264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (c == '0' && length_ > 1) { 3265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_array_index_ = false; 3266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 3267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (array_index_ > 429496729U - ((d + 2) >> 3)) { 3270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_array_index_ = false; 3271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 3272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block array_index_ = array_index_ * 10 + d; 3273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid StringHasher::AddCharacterNoIndex(uc32 c) { 3280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!is_array_index()); 3281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ += c; 3282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ += (raw_running_hash_ << 10); 3283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ ^= (raw_running_hash_ >> 6); 3284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t StringHasher::GetHash() { 3288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the calculated raw hash value and do some more bit ops to distribute 3289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the hash further. Ensure that we never return zero as the hash value. 3290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t result = raw_running_hash_; 3291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result += (result << 3); 3292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result ^= (result >> 11); 3293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result += (result << 15); 3294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (result == 0) { 3295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result = 27; 3296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 3297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 3298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::AsArrayIndex(uint32_t* index) { 3302d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block uint32_t field = hash_field(); 33037f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) { 33047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return false; 33057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } 3306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return SlowAsArrayIndex(index); 3307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::GetPrototype() { 3311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSObject::cast(this)->map()->prototype(); 3312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyAttributes JSObject::GetPropertyAttribute(String* key) { 3316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetPropertyAttributeWithReceiver(this, key); 3317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3319d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// TODO(504): this may be useful in other places too where JSGlobalProxy 3320d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// is used. 3321d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockObject* JSObject::BypassGlobalProxy() { 3322d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (IsJSGlobalProxy()) { 3323d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Object* proto = GetPrototype(); 3324d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (proto->IsNull()) return Heap::undefined_value(); 3325d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(proto->IsJSGlobalObject()); 3326d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return proto; 3327d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 3328d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return this; 3329d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 3330d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 3331d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 3332d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockbool JSObject::HasHiddenPropertiesObject() { 3333d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(!IsJSGlobalProxy()); 3334d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return GetPropertyAttributePostInterceptor(this, 3335d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Heap::hidden_symbol(), 3336d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block false) != ABSENT; 3337d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 3338d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 3339d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 3340d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockObject* JSObject::GetHiddenPropertiesObject() { 3341d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(!IsJSGlobalProxy()); 3342d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block PropertyAttributes attributes; 3343d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return GetLocalPropertyPostInterceptor(this, 3344d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Heap::hidden_symbol(), 3345d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block &attributes); 3346d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 3347d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 3348d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 3349d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockObject* JSObject::SetHiddenPropertiesObject(Object* hidden_obj) { 3350d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(!IsJSGlobalProxy()); 3351d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return SetPropertyPostInterceptor(Heap::hidden_symbol(), 3352d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block hidden_obj, 3353d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block DONT_ENUM); 3354d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 3355d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 3356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasElement(uint32_t index) { 3358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HasElementWithReceiver(this, index); 3359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_read() { 3363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(flag(), kAllCanReadBit); 3364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_read(bool value) { 3368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_flag(BooleanBit::set(flag(), kAllCanReadBit, value)); 3369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_write() { 3373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(flag(), kAllCanWriteBit); 3374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_write(bool value) { 3378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value)); 3379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::prohibits_overwriting() { 3383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(flag(), kProhibitsOverwritingBit); 3384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3386a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3387a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_prohibits_overwriting(bool value) { 3388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_flag(BooleanBit::set(flag(), kProhibitsOverwritingBit, value)); 3389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyAttributes AccessorInfo::property_attributes() { 3393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return AttributesField::decode(static_cast<uint32_t>(flag()->value())); 3394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_property_attributes(PropertyAttributes attributes) { 3398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(AttributesField::is_valid(attributes)); 3399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int rest_value = flag()->value() & ~AttributesField::mask(); 3400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_flag(Smi::FromInt(rest_value | AttributesField::encode(attributes))); 3401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Shape, typename Key> 3404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Dictionary<Shape, Key>::SetEntry(int entry, 3405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* key, 3406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value, 3407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyDetails details) { 3408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!key->IsString() || details.IsDeleted() || details.index() > 0); 3409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int index = HashTable<Shape, Key>::EntryToIndex(entry); 34104515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke AssertNoAllocation no_gc; 34114515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc); 3412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray::set(index, key, mode); 3413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray::set(index+1, value, mode); 3414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray::fast_set(this, index+2, details.AsSmi()); 3415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::ClearCodeCache() { 3419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // No write barrier is needed since empty_fixed_array is not in new space. 3420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Please note this function is used during marking: 3421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // - MarkCompactCollector::MarkUnmarkedObject 3422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!Heap::InNewSpace(Heap::raw_unchecked_empty_fixed_array())); 3423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kCodeCacheOffset, Heap::raw_unchecked_empty_fixed_array()); 3424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSArray::EnsureSize(int required_size) { 3428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(HasFastElements()); 34297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch FixedArray* elts = FixedArray::cast(elements()); 3430d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block const int kArraySizeThatFitsComfortablyInNewSpace = 128; 3431d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (elts->length() < required_size) { 3432d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Doubling in size would be overkill, but leave some slack to avoid 3433d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // constantly growing. 3434d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Expand(required_size + (required_size >> 3)); 3435d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // It's a performance benefit to keep a frequently used array in new-space. 3436d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } else if (!Heap::new_space()->Contains(elts) && 3437d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block required_size < kArraySizeThatFitsComfortablyInNewSpace) { 3438d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Expand will allocate a new backing store in new space even if the size 3439d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // we asked for isn't larger than what we had before. 3440d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Expand(required_size); 3441d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 3442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 34454515c472dc3e5ed2448a564600976759e569a0a8Leon Clarkevoid JSArray::set_length(Smi* length) { 34464515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER); 34474515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke} 34484515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 34494515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 3450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSArray::SetContent(FixedArray* storage) { 34514515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke set_length(Smi::FromInt(storage->length())); 3452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_elements(storage); 3453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* FixedArray::Copy() { 3457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (length() == 0) return this; 3458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Heap::CopyFixedArray(this); 3459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3462756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) { 3463756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return map->instance_size(); 3464756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3465756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3466756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3467756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Proxy::ProxyIterateBody(ObjectVisitor* v) { 3468756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitExternalReference( 3469756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Address *>(FIELD_ADDR(this, kProxyOffset))); 3470756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3471756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3472756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3473756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor> 3474756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid Proxy::ProxyIterateBody() { 3475756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick StaticVisitor::VisitExternalReference( 3476756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Address *>(FIELD_ADDR(this, kProxyOffset))); 3477756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3478756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3479756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3480756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) { 3481756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef v8::String::ExternalAsciiStringResource Resource; 3482756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitExternalAsciiString( 3483756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 3484756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3485756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3486756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3487756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor> 3488756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalAsciiString::ExternalAsciiStringIterateBody() { 3489756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef v8::String::ExternalAsciiStringResource Resource; 3490756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick StaticVisitor::VisitExternalAsciiString( 3491756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 3492756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3493756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3494756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3495756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) { 3496756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef v8::String::ExternalStringResource Resource; 3497756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitExternalTwoByteString( 3498756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 3499756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3500756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3501756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3502756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor> 3503756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody() { 3504756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef v8::String::ExternalStringResource Resource; 3505756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick StaticVisitor::VisitExternalTwoByteString( 3506756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 3507756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3508756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3509756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#define SLOT_ADDR(obj, offset) \ 3510756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Object**>((obj)->address() + offset) 3511756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3512756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<int start_offset, int end_offset, int size> 3513756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody( 3514756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick HeapObject* obj, 3515756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ObjectVisitor* v) { 3516756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, end_offset)); 3517756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3518756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3519756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3520756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<int start_offset> 3521756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj, 3522756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick int object_size, 3523756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ObjectVisitor* v) { 3524756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, object_size)); 3525756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3526756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3527756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#undef SLOT_ADDR 3528756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3529756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CAST_ACCESSOR 3531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef INT_ACCESSORS 3532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef SMI_ACCESSORS 3533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef ACCESSORS 3534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef FIELD_ADDR 3535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_FIELD 3536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_FIELD 3537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BARRIER 3538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CONDITIONAL_WRITE_BARRIER 3539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_MEMADDR_FIELD 3540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_MEMADDR_FIELD 3541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_DOUBLE_FIELD 3542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_DOUBLE_FIELD 3543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_INT_FIELD 3544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_INT_FIELD 3545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_SHORT_FIELD 3546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_SHORT_FIELD 3547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_BYTE_FIELD 3548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BYTE_FIELD 3549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 3552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3553a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_OBJECTS_INL_H_ 3554