13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 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 3869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch#include "elements.h" 3980d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "objects.h" 40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "contexts.h" 41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "conversions-inl.h" 4280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "heap.h" 4344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "isolate.h" 44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "property.h" 4580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#include "spaces.h" 463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "store-buffer.h" 4744f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "v8memory.h" 483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "factory.h" 493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "incremental-marking.h" 50592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails::PropertyDetails(Smi* smi) { 55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value_ = smi->value(); 56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* PropertyDetails::AsSmi() { 60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::FromInt(value_); 61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyDetails PropertyDetails::AsDeleted() { 651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1)); 66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return PropertyDetails(smi); 67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define TYPE_CHECKER(type, instancetype) \ 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool Object::Is##type() { \ 723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Object::IsHeapObject() && \ 733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HeapObject::cast(this)->map()->instance_type() == instancetype; \ 743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define CAST_ACCESSOR(type) \ 78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type* type::cast(Object* object) { \ 79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(object->Is##type()); \ 80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<type*>(object); \ 81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define INT_ACCESSORS(holder, name, offset) \ 85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int holder::name() { return READ_INT_FIELD(this, offset); } \ 86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); } 87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define ACCESSORS(holder, name, type, offset) \ 90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \ 91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void holder::set_##name(type* value, WriteBarrierMode mode) { \ 92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); \ 933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); \ 94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 96a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Getter that returns a tagged Smi and setter that writes a tagged Smi. 983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ACCESSORS_TO_SMI(holder, name, offset) \ 993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Smi* holder::name() { return Smi::cast(READ_FIELD(this, offset)); } \ 1003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void holder::set_##name(Smi* value, WriteBarrierMode mode) { \ 1015d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch WRITE_FIELD(this, offset, value); \ 1025d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch } 1035d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 1045d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 1053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Getter that returns a Smi as an int and writes an int as a Smi. 106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define SMI_ACCESSORS(holder, name, offset) \ 107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int holder::name() { \ 108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value = READ_FIELD(this, offset); \ 109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::cast(value)->value(); \ 110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } \ 111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void holder::set_##name(int value) { \ 112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, Smi::FromInt(value)); \ 113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_GETTER(holder, field, name, offset) \ 117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool holder::name() { \ 118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(field(), offset); \ 119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } \ 120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define BOOL_ACCESSORS(holder, field, name, offset) \ 123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool holder::name() { \ 124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(field(), offset); \ 125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } \ 126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block void holder::set_##name(bool value) { \ 127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_##field(BooleanBit::set(field(), offset, value)); \ 128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool IsMoreGeneralElementsKindTransition(ElementsKind from_kind, 1323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind to_kind) { 1333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to_kind == FAST_ELEMENTS) { 1343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return from_kind == FAST_SMI_ONLY_ELEMENTS || 1353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch from_kind == FAST_DOUBLE_ELEMENTS; 1363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return to_kind == FAST_DOUBLE_ELEMENTS && 1383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch from_kind == FAST_SMI_ONLY_ELEMENTS; 1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsFixedArrayBase() { 1443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return IsFixedArray() || IsFixedDoubleArray(); 1453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsInstanceOf(FunctionTemplateInfo* expected) { 149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // There is a constraint on the object; check. 150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!this->IsJSObject()) return false; 151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Fetch the constructor function of the object. 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* cons_obj = JSObject::cast(this)->map()->constructor(); 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!cons_obj->IsJSFunction()) return false; 154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JSFunction* fun = JSFunction::cast(cons_obj); 155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Iterate through the chain of inheriting function templates to 156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // see if the required one occurs. 157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (Object* type = fun->shared()->function_data(); 158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type->IsFunctionTemplateInfo(); 159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type = FunctionTemplateInfo::cast(type)->parent_template()) { 160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (type == expected) return true; 161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Didn't find the required type in the inheritance chain. 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return false; 164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSmi() { 168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_SMI_TAG(this); 169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHeapObject() { 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Internals::HasHeapObjectTag(this); 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::NonFailureIsHeapObject() { 1783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!this->IsFailure()); 1793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (reinterpret_cast<intptr_t>(this) & kSmiTagMask) != 0; 180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE) 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsString() { 187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() 188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE; 189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 19269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool Object::IsSpecObject() { 19369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Object::IsHeapObject() 19469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch && HeapObject::cast(this)->map()->instance_type() >= FIRST_SPEC_OBJECT_TYPE; 19569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 19669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 19769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsSpecFunction() { 1993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!Object::IsHeapObject()) return false; 2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InstanceType type = HeapObject::cast(this)->map()->instance_type(); 2013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return type == JS_FUNCTION_TYPE || type == JS_FUNCTION_PROXY_TYPE; 2023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSymbol() { 206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!this->IsHeapObject()) return false; 207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type = HeapObject::cast(this)->map()->instance_type(); 208e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // Because the symbol tag is non-zero and no non-string types have the 209e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // symbol bit set we can test for symbols with a very simple test 210e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke // operation. 21169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch STATIC_ASSERT(kSymbolTag != 0); 212e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke ASSERT(kNotStringTag + kIsSymbolMask > LAST_TYPE); 213e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return (type & kIsSymbolMask) != 0; 214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsConsString() { 21869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (!IsString()) return false; 21969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return StringShape(String::cast(this)).IsCons(); 22069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 22169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 22269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 22369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool Object::IsSlicedString() { 22469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (!IsString()) return false; 22569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return StringShape(String::cast(this)).IsSliced(); 226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqString() { 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsSequential(); 232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqAsciiString() { 236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsSequential() && 238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::cast(this)->IsAsciiRepresentation(); 239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSeqTwoByteString() { 243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsSequential() && 245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::cast(this)->IsTwoByteRepresentation(); 246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalString() { 250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsExternal(); 252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalAsciiString() { 256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsExternal() && 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::cast(this)->IsAsciiRepresentation(); 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsExternalTwoByteString() { 263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsString()) return false; 264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringShape(String::cast(this)).IsExternal() && 265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String::cast(this)->IsTwoByteRepresentation(); 266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool Object::HasValidElements() { 2693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Dictionary is covered under FixedArray. 2703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return IsFixedArray() || IsFixedDoubleArray() || IsExternalArray(); 2713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 273a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(String* str) 274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : type_(str->map()->instance_type()) { 275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_valid(); 276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((type_ & kIsNotStringMask) == kStringTag); 277a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 278a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(Map* map) 281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : type_(map->instance_type()) { 282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_valid(); 283a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((type_ & kIsNotStringMask) == kStringTag); 284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringShape::StringShape(InstanceType t) 288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : type_(static_cast<uint32_t>(t)) { 289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_valid(); 290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((type_ & kIsNotStringMask) == kStringTag); 291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSymbol() { 295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(valid()); 29669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch STATIC_ASSERT(kSymbolTag != 0); 297e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return (type_ & kIsSymbolMask) != 0; 298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsAsciiRepresentation() { 302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type = map()->instance_type(); 303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type & kStringEncodingMask) == kAsciiStringTag; 304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsTwoByteRepresentation() { 308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t type = map()->instance_type(); 309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type & kStringEncodingMask) == kTwoByteStringTag; 310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 31369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool String::IsAsciiRepresentationUnderneath() { 31469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch uint32_t type = map()->instance_type(); 31569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch STATIC_ASSERT(kIsIndirectStringTag != 0); 31669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0); 31769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(IsFlat()); 31869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch switch (type & (kIsIndirectStringMask | kStringEncodingMask)) { 31969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case kAsciiStringTag: 32069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return true; 32169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case kTwoByteStringTag: 32269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return false; 32369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch default: // Cons or sliced string. Need to go deeper. 32469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return GetUnderlying()->IsAsciiRepresentation(); 32569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 32669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 32769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 32869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 32969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool String::IsTwoByteRepresentationUnderneath() { 33069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch uint32_t type = map()->instance_type(); 33169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch STATIC_ASSERT(kIsIndirectStringTag != 0); 33269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0); 33369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(IsFlat()); 33469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch switch (type & (kIsIndirectStringMask | kStringEncodingMask)) { 33569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case kAsciiStringTag: 33669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return false; 33769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case kTwoByteStringTag: 33869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return true; 33969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch default: // Cons or sliced string. Need to go deeper. 34069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return GetUnderlying()->IsTwoByteRepresentation(); 34169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 34269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 34369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 34469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3459dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsenbool String::HasOnlyAsciiChars() { 3469dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen uint32_t type = map()->instance_type(); 3479dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen return (type & kStringEncodingMask) == kAsciiStringTag || 3489dcf7e2f83591d471e88bf7d230651900b8e424bKristian Monsen (type & kAsciiDataHintMask) == kAsciiDataHintTag; 3496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 3506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 3516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 352a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsCons() { 353a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type_ & kStringRepresentationMask) == kConsStringTag; 354a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 355a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool StringShape::IsSliced() { 35869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return (type_ & kStringRepresentationMask) == kSlicedStringTag; 35969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 36069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 36169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 36269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbool StringShape::IsIndirect() { 36369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return (type_ & kIsIndirectStringMask) == kIsIndirectStringTag; 36469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 36569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 36669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternal() { 368a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type_ & kStringRepresentationMask) == kExternalStringTag; 369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequential() { 373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type_ & kStringRepresentationMask) == kSeqStringTag; 374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringRepresentationTag StringShape::representation_tag() { 378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t tag = (type_ & kStringRepresentationMask); 379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<StringRepresentationTag>(tag); 380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 38369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint32_t StringShape::encoding_tag() { 38469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return type_ & kStringEncodingMask; 38569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 38669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 38769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 388a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t StringShape::full_representation_tag() { 389a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return (type_ & (kStringRepresentationMask | kStringEncodingMask)); 390a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSTATIC_CHECK((kStringRepresentationMask | kStringEncodingMask) == 394a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Internals::kFullStringRepresentationMask); 395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequentialAscii() { 398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return full_representation_tag() == (kSeqStringTag | kAsciiStringTag); 399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsSequentialTwoByte() { 403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return full_representation_tag() == (kSeqStringTag | kTwoByteStringTag); 404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 405a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternalAscii() { 408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return full_representation_tag() == (kExternalStringTag | kAsciiStringTag); 409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 412a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringShape::IsExternalTwoByte() { 413a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag); 414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSTATIC_CHECK((kExternalStringTag | kTwoByteStringTag) == 418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Internals::kExternalTwoByteRepresentationTag); 419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 421a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc32 FlatStringReader::Get(int index) { 422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= index && index <= length_); 423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_ascii_) { 424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<const byte*>(start_)[index]; 425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<const uc16*>(start_)[index]; 427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsNumber() { 432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsSmi() || IsHeapNumber(); 433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE) 4373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) 438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsFiller() { 4413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!Object::IsHeapObject()) return false; 4423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InstanceType instance_type = HeapObject::cast(this)->map()->instance_type(); 4433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE; 44485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 445592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 446592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalPixelArray, EXTERNAL_PIXEL_ARRAY_TYPE) 4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Object::IsExternalArray() { 4513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (!Object::IsHeapObject()) 4523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return false; 4533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block InstanceType instance_type = 4543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block HeapObject::cast(this)->map()->instance_type(); 455e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && 456e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke instance_type <= LAST_EXTERNAL_ARRAY_TYPE); 4573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 4583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalByteArray, EXTERNAL_BYTE_ARRAY_TYPE) 4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalUnsignedByteArray, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) 4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalShortArray, EXTERNAL_SHORT_ARRAY_TYPE) 4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalUnsignedShortArray, EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) 4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalIntArray, EXTERNAL_INT_ARRAY_TYPE) 4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalUnsignedIntArray, EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) 4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalFloatArray, EXTERNAL_FLOAT_ARRAY_TYPE) 4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(ExternalDoubleArray, EXTERNAL_DOUBLE_ARRAY_TYPE) 468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 469257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4705913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsFailure() { 471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_FAILURE_TAG(this); 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4755913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsRetryAfterGC() { 476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_FAILURE_TAG(this) 477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC; 478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4815913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsOutOfMemory() { 482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_FAILURE_TAG(this) 4831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block && Failure::cast(this)->IsOutOfMemoryException(); 484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4875913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsException() { 488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this == Failure::Exception(); 489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4925913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reckbool MaybeObject::IsTheHole() { 49344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return !IsFailure() && ToObjectUnchecked()->IsTheHole(); 4945913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck} 4955913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 4965913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 4975913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckFailure* Failure::cast(MaybeObject* obj) { 4985913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck ASSERT(HAS_FAILURE_TAG(obj)); 4995913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck return reinterpret_cast<Failure*>(obj); 5005913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck} 5015913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 5025913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 5033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool Object::IsJSReceiver() { 5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); 5053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return IsHeapObject() && 5063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_RECEIVER_TYPE; 5073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 5083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 5093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSObject() { 5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); 5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return IsHeapObject() && 5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE; 5143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 5153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 5163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 5173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool Object::IsJSProxy() { 5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!Object::IsHeapObject()) return false; 5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InstanceType type = HeapObject::cast(this)->map()->instance_type(); 5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return FIRST_JS_PROXY_TYPE <= type && type <= LAST_JS_PROXY_TYPE; 52185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 52285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 52385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSFunctionProxy, JS_FUNCTION_PROXY_TYPE) 5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSSet, JS_SET_TYPE) 5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSMap, JS_MAP_TYPE) 5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE) 5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE) 5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(Map, MAP_TYPE) 5303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE) 5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE) 5323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 5333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsDescriptorArray() { 535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsFixedArray(); 536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Object::IsDeoptimizationInputData() { 540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Must be a fixed array. 541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!IsFixedArray()) return false; 542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // There's no sure way to detect the difference between a fixed array and 544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // a deoptimization data array. Since this is used for asserts we can 545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // check that the length is zero or else the fixed size plus a multiple of 546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the entry size. 547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length = FixedArray::cast(this)->length(); 548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (length == 0) return true; 549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch length -= DeoptimizationInputData::kFirstDeoptEntryIndex; 551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return length >= 0 && 552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch length % DeoptimizationInputData::kDeoptEntrySize == 0; 553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Object::IsDeoptimizationOutputData() { 557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!IsFixedArray()) return false; 558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // There's actually no way to see the difference between a fixed array and 559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // a deoptimization data array. Since this is used for asserts we can check 560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // that the length is plausible though. 561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (FixedArray::cast(this)->length() % 2 != 0) return false; 562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return true; 563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsTypeFeedbackCells() { 5673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!IsFixedArray()) return false; 5683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // There's actually no way to see the difference between a fixed array and 5693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // a cache cells array. Since this is used for asserts we can check that 5703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the length is plausible though. 5713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (FixedArray::cast(this)->length() % 2 != 0) return false; 5723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 5733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 5743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsContext() { 57744f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (Object::IsHeapObject()) { 5783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Map* map = HeapObject::cast(this)->map(); 5793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Heap* heap = map->GetHeap(); 5803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return (map == heap->function_context_map() || 5813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch map == heap->catch_context_map() || 5823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch map == heap->with_context_map() || 58369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch map == heap->global_context_map() || 58469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch map == heap->block_context_map()); 58544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 58644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; 587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsGlobalContext() { 59144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Object::IsHeapObject() && 59244f0eee88ff00398ff7f715fab053374d808c90dSteve Block HeapObject::cast(this)->map() == 59344f0eee88ff00398ff7f715fab053374d808c90dSteve Block HeapObject::cast(this)->GetHeap()->global_context_map(); 594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 5973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsScopeInfo() { 59869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Object::IsHeapObject() && 59969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HeapObject::cast(this)->map() == 6003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HeapObject::cast(this)->GetHeap()->scope_info_map(); 60169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 60269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 60369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 6043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE) 605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> inline bool Is<JSFunction>(Object* obj) { 608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return obj->IsJSFunction(); 609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(Code, CODE_TYPE) 6133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(Oddball, ODDBALL_TYPE) 6143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSGlobalPropertyCell, JS_GLOBAL_PROPERTY_CELL_TYPE) 6153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE) 6163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSValue, JS_VALUE_TYPE) 6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSDate, JS_DATE_TYPE) 6183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE) 619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStringWrapper() { 622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsJSValue() && JSValue::cast(this)->value()->IsString(); 623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 624a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 625a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(Foreign, FOREIGN_TYPE) 627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsBoolean() { 63044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return IsOddball() && 63144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0); 632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6353ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSArray, JS_ARRAY_TYPE) 6363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE) 637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <> inline bool Is<JSArray>(Object* obj) { 640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return obj->IsJSArray(); 641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsHashTable() { 64544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Object::IsHeapObject() && 64644f0eee88ff00398ff7f715fab053374d808c90dSteve Block HeapObject::cast(this)->map() == 64744f0eee88ff00398ff7f715fab053374d808c90dSteve Block HeapObject::cast(this)->GetHeap()->hash_table_map(); 648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsDictionary() { 6523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return IsHashTable() && 6533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch this != HeapObject::cast(this)->GetHeap()->symbol_table(); 654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsSymbolTable() { 65844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return IsHashTable() && this == 65944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HeapObject::cast(this)->GetHeap()->raw_unchecked_symbol_table(); 660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 6636ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Object::IsJSFunctionResultCache() { 6646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (!IsFixedArray()) return false; 6656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block FixedArray* self = FixedArray::cast(this); 6666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block int length = self->length(); 6676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (length < JSFunctionResultCache::kEntriesIndex) return false; 6686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if ((length - JSFunctionResultCache::kEntriesIndex) 6696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block % JSFunctionResultCache::kEntrySize != 0) { 6706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return false; 6716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 6726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#ifdef DEBUG 6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (FLAG_verify_heap) { 6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<JSFunctionResultCache*>(this)-> 6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch JSFunctionResultCacheVerify(); 6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#endif 6786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return true; 6796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 6806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 6816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 68280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenbool Object::IsNormalizedMapCache() { 68380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen if (!IsFixedArray()) return false; 68480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen if (FixedArray::cast(this)->length() != NormalizedMapCache::kEntries) { 68580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return false; 68680d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen } 68780d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#ifdef DEBUG 6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (FLAG_verify_heap) { 6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<NormalizedMapCache*>(this)->NormalizedMapCacheVerify(); 6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 69180d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen#endif 69280d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return true; 69380d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen} 69480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 69580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen 696a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsCompilationCacheTable() { 697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHashTable(); 698a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 699a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 700a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7016ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Object::IsCodeCacheHashTable() { 7026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return IsHashTable(); 7036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 7046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 7056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 7063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool Object::IsPolymorphicCodeCacheHashTable() { 7073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return IsHashTable(); 7083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 7093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 711a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsMapCache() { 712a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHashTable(); 713a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 714a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 715a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 716a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsPrimitive() { 717a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsOddball() || IsNumber() || IsString(); 718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsJSGlobalProxy() { 722a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool result = IsHeapObject() && 723a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (HeapObject::cast(this)->map()->instance_type() == 724a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JS_GLOBAL_PROXY_TYPE); 725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!result || IsAccessCheckNeeded()); 726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsGlobalObject() { 731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsHeapObject()) return false; 732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InstanceType type = HeapObject::cast(this)->map()->instance_type(); 734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return type == JS_GLOBAL_OBJECT_TYPE || 735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block type == JS_BUILTINS_OBJECT_TYPE; 736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7393ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE) 7403ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochTYPE_CHECKER(JSBuiltinsObject, JS_BUILTINS_OBJECT_TYPE) 741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsUndetectableObject() { 744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHeapObject() 745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->is_undetectable(); 746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsAccessCheckNeeded() { 750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsHeapObject() 751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->is_access_check_needed(); 752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStruct() { 756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!IsHeapObject()) return false; 757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (HeapObject::cast(this)->map()->instance_type()) { 758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true; 759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STRUCT_LIST(MAKE_STRUCT_CASE) 760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CASE 761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: return false; 762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 764a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_PREDICATE(NAME, Name, name) \ 767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool Object::Is##Name() { \ 768a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Object::IsHeapObject() \ 769a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \ 770a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 771a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STRUCT_LIST(MAKE_STRUCT_PREDICATE) 772a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_PREDICATE 773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsUndefined() { 77644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUndefined; 777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsNull() { 78144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return IsOddball() && Oddball::cast(this)->kind() == Oddball::kNull; 78244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 78344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 78444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 78544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool Object::IsTheHole() { 78644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTheHole; 787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsTrue() { 79144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTrue; 792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsFalse() { 79644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse; 797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 800086aeeaae12517475c22695a200be45495516549Ben Murdochbool Object::IsArgumentsMarker() { 80144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker; 802086aeeaae12517475c22695a200be45495516549Ben Murdoch} 803086aeeaae12517475c22695a200be45495516549Ben Murdoch 804086aeeaae12517475c22695a200be45495516549Ben Murdoch 805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockdouble Object::Number() { 806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(IsNumber()); 807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return IsSmi() 808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ? static_cast<double>(reinterpret_cast<Smi*>(this)->value()) 809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : reinterpret_cast<HeapNumber*>(this)->value(); 810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Object::IsNaN() { 8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this->IsHeapNumber() && isnan(HeapNumber::cast(this)->value()); 8153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8185913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* Object::ToSmi() { 819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (IsSmi()) return this; 820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (IsHeapNumber()) { 821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block double value = HeapNumber::cast(this)->value(); 822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int int_value = FastD2I(value); 823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (value == FastI2D(int_value) && Smi::IsValid(int_value)) { 824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::FromInt(int_value); 825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Failure::Exception(); 828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::HasSpecificClassOf(String* name) { 832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this->IsJSObject() && (JSObject::cast(this)->class_name() == name); 833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8365913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* Object::GetElement(uint32_t index) { 837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // GetElement can trigger a getter which can cause allocation. 838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // This was not always the case. This ASSERT is here to catch 839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // leftover incorrect uses. 84044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(HEAP->IsAllocationAllowed()); 841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetElementWithReceiver(this, index); 842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8455913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckObject* Object::GetElementNoExceptionThrown(uint32_t index) { 8465913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck MaybeObject* maybe = GetElementWithReceiver(this, index); 8475913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck ASSERT(!maybe->IsFailure()); 8485913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck Object* result = NULL; // Initialization to please compiler. 8495913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck maybe->ToObject(&result); 8505913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck return result; 8515913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck} 8525913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 8535913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 8545913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* Object::GetProperty(String* key) { 855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyAttributes attributes; 856a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetPropertyWithReceiver(this, key, &attributes); 857a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 858a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8605913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* Object::GetProperty(String* key, PropertyAttributes* attributes) { 861a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetPropertyWithReceiver(this, key, attributes); 862a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define FIELD_ADDR(p, offset) \ 866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag) 867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_FIELD(p, offset) \ 869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset))) 870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_FIELD(p, offset, value) \ 872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value) 873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define WRITE_BARRIER(heap, object, offset, value) \ 8753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap->incremental_marking()->RecordWrite( \ 8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object, HeapObject::RawField(object, offset), value); \ 8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (heap->InNewSpace(value)) { \ 8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap->RecordWrite(object->address(), offset); \ 8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 8803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \ 8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (mode == UPDATE_WRITE_BARRIER) { \ 8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap->incremental_marking()->RecordWrite( \ 8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch object, HeapObject::RawField(object, offset), value); \ 8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (heap->InNewSpace(value)) { \ 8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap->RecordWrite(object->address(), offset); \ 8873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } \ 888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 89044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifndef V8_TARGET_ARCH_MIPS 89144f0eee88ff00398ff7f715fab053374d808c90dSteve Block #define READ_DOUBLE_FIELD(p, offset) \ 89244f0eee88ff00398ff7f715fab053374d808c90dSteve Block (*reinterpret_cast<double*>(FIELD_ADDR(p, offset))) 89344f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else // V8_TARGET_ARCH_MIPS 89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Prevent gcc from using load-double (mips ldc1) on (possibly) 89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // non-64-bit aligned HeapNumber::value. 8963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static inline double read_double_field(void* p, int offset) { 89744f0eee88ff00398ff7f715fab053374d808c90dSteve Block union conversion { 89844f0eee88ff00398ff7f715fab053374d808c90dSteve Block double d; 89944f0eee88ff00398ff7f715fab053374d808c90dSteve Block uint32_t u[2]; 90044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } c; 90144f0eee88ff00398ff7f715fab053374d808c90dSteve Block c.u[0] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))); 90244f0eee88ff00398ff7f715fab053374d808c90dSteve Block c.u[1] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4))); 90344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return c.d; 90444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 90544f0eee88ff00398ff7f715fab053374d808c90dSteve Block #define READ_DOUBLE_FIELD(p, offset) read_double_field(p, offset) 90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif // V8_TARGET_ARCH_MIPS 90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block#ifndef V8_TARGET_ARCH_MIPS 90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block #define WRITE_DOUBLE_FIELD(p, offset, value) \ 91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value) 91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block#else // V8_TARGET_ARCH_MIPS 91244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Prevent gcc from using store-double (mips sdc1) on (possibly) 91344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // non-64-bit aligned HeapNumber::value. 9143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static inline void write_double_field(void* p, int offset, 91544f0eee88ff00398ff7f715fab053374d808c90dSteve Block double value) { 91644f0eee88ff00398ff7f715fab053374d808c90dSteve Block union conversion { 91744f0eee88ff00398ff7f715fab053374d808c90dSteve Block double d; 91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block uint32_t u[2]; 91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } c; 92044f0eee88ff00398ff7f715fab053374d808c90dSteve Block c.d = value; 92144f0eee88ff00398ff7f715fab053374d808c90dSteve Block (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) = c.u[0]; 92244f0eee88ff00398ff7f715fab053374d808c90dSteve Block (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4))) = c.u[1]; 92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 92444f0eee88ff00398ff7f715fab053374d808c90dSteve Block #define WRITE_DOUBLE_FIELD(p, offset, value) \ 92544f0eee88ff00398ff7f715fab053374d808c90dSteve Block write_double_field(p, offset, value) 92644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#endif // V8_TARGET_ARCH_MIPS 927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INT_FIELD(p, offset) \ 930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<int*>(FIELD_ADDR(p, offset))) 931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INT_FIELD(p, offset, value) \ 933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value) 934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_INTPTR_FIELD(p, offset) \ 936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset))) 937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_INTPTR_FIELD(p, offset, value) \ 939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value) 940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_UINT32_FIELD(p, offset) \ 942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) 943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_UINT32_FIELD(p, offset, value) \ 945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value) 946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define READ_INT64_FIELD(p, offset) \ 9483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset))) 9493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 9503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define WRITE_INT64_FIELD(p, offset, value) \ 9513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value) 9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_SHORT_FIELD(p, offset) \ 954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset))) 955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_SHORT_FIELD(p, offset, value) \ 957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value) 958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define READ_BYTE_FIELD(p, offset) \ 960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset))) 961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define WRITE_BYTE_FIELD(p, offset, value) \ 963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value) 964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject** HeapObject::RawField(HeapObject* obj, int byte_offset) { 967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return &READ_FIELD(obj, byte_offset); 968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Smi::value() { 972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Internals::SmiValue(this); 973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* Smi::FromInt(int value) { 977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(Smi::IsValid(value)); 9783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int smi_shift_bits = kSmiTagSize + kSmiShiftSize; 979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block intptr_t tagged_value = 9803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag; 981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Smi*>(tagged_value); 982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* Smi::FromIntptr(intptr_t value) { 986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(Smi::IsValid(value)); 9873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int smi_shift_bits = kSmiTagSize + kSmiShiftSize; 9883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag); 989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure::Type Failure::type() const { 993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Type>(value() & kFailureTypeTagMask); 994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Failure::IsInternalError() const { 998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return type() == INTERNAL_ERROR; 999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Failure::IsOutOfMemoryException() const { 1003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return type() == OUT_OF_MEMORY_EXCEPTION; 1004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1006a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAllocationSpace Failure::allocation_space() const { 1008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_EQ(RETRY_AFTER_GC, type()); 1009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<AllocationSpace>((value() >> kFailureTypeTagSize) 1010a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block & kSpaceTagMask); 1011a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1012a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::InternalError() { 1015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Construct(INTERNAL_ERROR); 1016a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1017a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1018a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1019a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::Exception() { 1020a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Construct(EXCEPTION); 1021a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1022a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1023a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1024a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockFailure* Failure::OutOfMemoryException() { 1025a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Construct(OUT_OF_MEMORY_EXCEPTION); 1026a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1027a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockintptr_t Failure::value() const { 10306ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return static_cast<intptr_t>( 10316ded16be15dd865a9b21ea304d5273c8be299c87Steve Block reinterpret_cast<uintptr_t>(this) >> kFailureTagSize); 1032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1033a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1035f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochFailure* Failure::RetryAfterGC() { 1036f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return RetryAfterGC(NEW_SPACE); 1037f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch} 1038f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 1039f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 1040f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochFailure* Failure::RetryAfterGC(AllocationSpace space) { 1041f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch ASSERT((space & ~kSpaceTagMask) == 0); 1042f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return Construct(RETRY_AFTER_GC, space); 1043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 10463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockFailure* Failure::Construct(Type type, intptr_t value) { 10476ded16be15dd865a9b21ea304d5273c8be299c87Steve Block uintptr_t info = 10486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block (static_cast<uintptr_t>(value) << kFailureTypeTagSize) | type; 1049a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info); 10503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return reinterpret_cast<Failure*>((info << kFailureTagSize) | kFailureTag); 1051a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1052a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1053a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Smi::IsValid(intptr_t value) { 1055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 1056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block bool in_range = (value >= kMinValue) && (value <= kMaxValue); 1057a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 10583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 10593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#ifdef V8_TARGET_ARCH_X64 10603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block // To be representable as a long smi, the value must be a 32-bit integer. 10613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block bool result = (value == static_cast<int32_t>(value)); 10623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block#else 1063a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // To be representable as an tagged small integer, the two 1064a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // most-significant bits of 'value' must be either 00 or 11 due to 1065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // sign-extension. To check this we add 01 to the two 1066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // most-significant bits, and check if the most-significant bit is 0 1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // 1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // CAUTION: The original code below: 1069a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // bool result = ((value + 0x40000000) & 0x80000000) == 0; 1070a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // may lead to incorrect results according to the C language spec, and 1071a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // in fact doesn't work correctly with gcc4.1.1 in some cases: The 1072a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // compiler may produce undefined results in case of signed integer 1073a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // overflow. The computation must be done w/ unsigned ints. 10743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block bool result = (static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U); 1075a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 1076a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(result == in_range); 1077a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 1078a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1079a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1080a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromMap(Map* map) { 1082a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return MapWord(reinterpret_cast<uintptr_t>(map)); 1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* MapWord::ToMap() { 1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Map*>(value_); 1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1089a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool MapWord::IsForwardingAddress() { 1092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HAS_SMI_TAG(reinterpret_cast<Object*>(value_)); 1093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord MapWord::FromForwardingAddress(HeapObject* object) { 1097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag; 1098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return MapWord(reinterpret_cast<uintptr_t>(raw)); 1099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* MapWord::ToForwardingAddress() { 1103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(IsForwardingAddress()); 1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return HeapObject::FromAddress(reinterpret_cast<Address>(value_)); 1105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef DEBUG 1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::VerifyObjectField(int offset) { 1110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block VerifyPointer(READ_FIELD(this, offset)); 1111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 11127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 11137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochvoid HeapObject::VerifySmiField(int offset) { 11147f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(READ_FIELD(this, offset)->IsSmi()); 11157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 1117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 111944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockHeap* HeapObject::GetHeap() { 11203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Heap* heap = 11213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MemoryChunk::FromAddress(reinterpret_cast<Address>(this))->heap(); 11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(heap != NULL); 11233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(heap->isolate() == Isolate::Current()); 11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return heap; 112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 112844f0eee88ff00398ff7f715fab053374d808c90dSteve BlockIsolate* HeapObject::GetIsolate() { 112944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return GetHeap()->isolate(); 113044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 113144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 113244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* HeapObject::map() { 1134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map_word().ToMap(); 1135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map(Map* value) { 1139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_map_word(MapWord::FromMap(value)); 11403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value != NULL) { 11413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // TODO(1600) We are passing NULL as a slot because maps can never be on 11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // evacuation candidate. 11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value->GetHeap()->incremental_marking()->RecordWrite(this, NULL, value); 11443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 11453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 11463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 11483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Unsafe accessor omitting write barrier. 11493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HeapObject::set_map_no_write_barrier(Map* value) { 11503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_map_word(MapWord::FromMap(value)); 1151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMapWord HeapObject::map_word() { 1155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset))); 1156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::set_map_word(MapWord map_word) { 11607f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch // WRITE_FIELD does not invoke write barrier, but there is no need 1161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // here. 1162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kMapOffset, reinterpret_cast<Object*>(map_word.value_)); 1163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHeapObject* HeapObject::FromAddress(Address address) { 1167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_TAG_ALIGNED(address); 1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); 1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress HeapObject::address() { 1173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Address>(this) - kHeapObjectTag; 1174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::Size() { 1178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return SizeFromMap(map()); 1179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) { 1183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)), 1184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block reinterpret_cast<Object**>(FIELD_ADDR(this, end))); 1185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid HeapObject::IteratePointer(ObjectVisitor* v, int offset) { 1189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block v->VisitPointer(reinterpret_cast<Object**>(FIELD_ADDR(this, offset))); 1190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochdouble HeapNumber::value() { 11943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return READ_DOUBLE_FIELD(this, kValueOffset); 1195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 11983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HeapNumber::set_value(double value) { 11993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_DOUBLE_FIELD(this, kValueOffset, value); 1200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint HeapNumber::get_exponent() { 12043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return ((READ_INT_FIELD(this, kExponentOffset) & kExponentMask) >> 12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kExponentShift) - kExponentBias; 12066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 12076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 12086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint HeapNumber::get_sign() { 12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return READ_INT_FIELD(this, kExponentOffset) & kSignMask; 12116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 12126ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 12136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset) 12153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochObject** FixedArray::GetFirstElementAddress() { 12183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0))); 1219c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 1220c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 1221c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 12223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool FixedArray::ContainsOnlySmisOrHoles() { 12233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* the_hole = GetHeap()->the_hole_value(); 12243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object** current = GetFirstElementAddress(); 12253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < length(); ++i) { 12263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* candidate = *current++; 12273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!candidate->IsSmi() && candidate != the_hole) return false; 12283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 1230c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 1231c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 1232c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 12333ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFixedArrayBase* JSObject::elements() { 12343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* array = READ_FIELD(this, kElementsOffset); 12353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return static_cast<FixedArrayBase*>(array); 1236592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1237592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 12383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::ValidateSmiOnlyElements() { 12393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#if DEBUG 12403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (map()->elements_kind() == FAST_SMI_ONLY_ELEMENTS) { 12413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Heap* heap = GetHeap(); 12423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Don't use elements, since integrity checks will fail if there 12433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // are filler pointers in the array. 12443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedArray* fixed_array = 12453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<FixedArray*>(READ_FIELD(this, kElementsOffset)); 12463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Map* map = fixed_array->map(); 12473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Arrays that have been shifted in place can't be verified. 12483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (map != heap->raw_unchecked_one_pointer_filler_map() && 12493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map != heap->raw_unchecked_two_pointer_filler_map() && 12503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map != heap->free_space_map()) { 12513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < fixed_array->length(); i++) { 12523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* current = fixed_array->get(i); 12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(current->IsSmi() || current->IsTheHole()); 12543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 12583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 1259592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 12603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSObject::EnsureCanContainHeapObjectElements() { 12623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#if DEBUG 12633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ValidateSmiOnlyElements(); 12643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 12653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if ((map()->elements_kind() != FAST_ELEMENTS)) { 12663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return TransitionElementsKind(FAST_ELEMENTS); 12673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 1269592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1270592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1271592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 12723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSObject::EnsureCanContainElements(Object** objects, 12733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch uint32_t count, 12743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EnsureElementsMode mode) { 12753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind current_kind = map()->elements_kind(); 12763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind target_kind = current_kind; 12773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(mode != ALLOW_COPIED_DOUBLE_ELEMENTS); 12783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (current_kind == FAST_ELEMENTS) return this; 12793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Heap* heap = GetHeap(); 12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* the_hole = heap->the_hole_value(); 12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* heap_number_map = heap->heap_number_map(); 12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (uint32_t i = 0; i < count; ++i) { 12843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* current = *objects++; 12853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!current->IsSmi() && current != the_hole) { 12863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && 12873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HeapObject::cast(current)->map() == heap_number_map) { 12883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch target_kind = FAST_DOUBLE_ELEMENTS; 12893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 12903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch target_kind = FAST_ELEMENTS; 12913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 12923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (target_kind != current_kind) { 12973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return TransitionElementsKind(target_kind); 12983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 1300592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1301592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1302592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 13033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSObject::EnsureCanContainElements(FixedArrayBase* elements, 13043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EnsureElementsMode mode) { 13053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (elements->map() != GetHeap()->fixed_double_array_map()) { 13063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(elements->map() == GetHeap()->fixed_array_map() || 13073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements->map() == GetHeap()->fixed_cow_array_map()); 13083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (mode == ALLOW_COPIED_DOUBLE_ELEMENTS) { 13093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mode = DONT_ALLOW_DOUBLE_ELEMENTS; 13103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object** objects = FixedArray::cast(elements)->GetFirstElementAddress(); 13123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return EnsureCanContainElements(objects, elements->length(), mode); 13133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(mode == ALLOW_COPIED_DOUBLE_ELEMENTS); 13163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (GetElementsKind() == FAST_SMI_ONLY_ELEMENTS) { 13173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return TransitionElementsKind(FAST_DOUBLE_ELEMENTS); 13183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 1321592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 1322592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13243ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSObject::GetElementsTransitionMap(Isolate* isolate, 13253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind to_kind) { 13263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Map* current_map = map(); 13273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind from_kind = current_map->elements_kind(); 13285d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 13293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (from_kind == to_kind) return current_map; 13305d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 13313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Context* global_context = isolate->context()->global_context(); 13323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (current_map == global_context->smi_js_array_map()) { 13333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to_kind == FAST_ELEMENTS) { 13343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return global_context->object_js_array_map(); 13353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (to_kind == FAST_DOUBLE_ELEMENTS) { 13373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return global_context->double_js_array_map(); 13383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(to_kind == DICTIONARY_ELEMENTS); 13403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetElementsTransitionMapSlow(to_kind); 13445d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch} 13455d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 13465d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 13473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::set_map_and_elements(Map* new_map, 13483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedArrayBase* value, 13493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WriteBarrierMode mode) { 13503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(value->HasValidElements()); 13513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 13523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ValidateSmiOnlyElements(); 13533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 13543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (new_map != NULL) { 13553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (mode == UPDATE_WRITE_BARRIER) { 13563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_map(new_map); 13573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 13583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(mode == SKIP_WRITE_BARRIER); 13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_map_no_write_barrier(new_map); 13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT((map()->has_fast_elements() || 13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map()->has_fast_smi_only_elements() || 13643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (value == GetHeap()->empty_fixed_array())) == 136544f0eee88ff00398ff7f715fab053374d808c90dSteve Block (value->map() == GetHeap()->fixed_array_map() || 136644f0eee88ff00398ff7f715fab053374d808c90dSteve Block value->map() == GetHeap()->fixed_cow_array_map())); 13673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT((value == GetHeap()->empty_fixed_array()) || 13683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (map()->has_fast_double_elements() == value->IsFixedDoubleArray())); 1369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kElementsOffset, value); 13703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode); 13713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 13743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) { 13753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_map_and_elements(NULL, value, mode); 1376c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 1377c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 1378c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 1379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_properties() { 138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array())); 138144f0eee88ff00398ff7f715fab053374d808c90dSteve Block WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array()); 1382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1384a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1385a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::initialize_elements() { 13869413bcbe2192ed4d701281130490e0ba336debdcBen Murdoch ASSERT(map()->has_fast_elements() || 13879413bcbe2192ed4d701281130490e0ba336debdcBen Murdoch map()->has_fast_smi_only_elements() || 13889413bcbe2192ed4d701281130490e0ba336debdcBen Murdoch map()->has_fast_double_elements()); 138944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array())); 139044f0eee88ff00398ff7f715fab053374d808c90dSteve Block WRITE_FIELD(this, kElementsOffset, GetHeap()->empty_fixed_array()); 1391a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1392a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1393a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13945913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* JSObject::ResetElements() { 13955913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck Object* obj; 13963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind elements_kind = FLAG_smi_only_arrays 13973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? FAST_SMI_ONLY_ELEMENTS 13983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : FAST_ELEMENTS; 13993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MaybeObject* maybe_obj = GetElementsTransitionMap(GetIsolate(), 14003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements_kind); 14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!maybe_obj->ToObject(&obj)) return maybe_obj; 14028defd9ff6930b4e24729971a61cf7469daf119beSteve Block set_map(Map::cast(obj)); 14038defd9ff6930b4e24729971a61cf7469daf119beSteve Block initialize_elements(); 14048defd9ff6930b4e24729971a61cf7469daf119beSteve Block return this; 14058defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 14068defd9ff6930b4e24729971a61cf7469daf119beSteve Block 14078defd9ff6930b4e24729971a61cf7469daf119beSteve Block 1408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_string, String, kToStringOffset) 1409a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Oddball, to_number, Object, kToNumberOffset) 1410a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1411a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 141244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbyte Oddball::kind() { 14133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Smi::cast(READ_FIELD(this, kKindOffset))->value(); 141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 141544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 141644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 141744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Oddball::set_kind(byte value) { 14183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_FIELD(this, kKindOffset, Smi::FromInt(value)); 141944f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 142044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 142144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1422a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSGlobalPropertyCell::value() { 1423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kValueOffset); 1424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) { 1428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // The write barrier is not used for global property cells. 1429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!val->IsJSGlobalPropertyCell()); 1430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kValueOffset, val); 1431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1434a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSObject::GetHeaderSize() { 1435a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InstanceType type = map()->instance_type(); 1436a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check for the most common kind of JavaScript object before 1437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // falling into the generic switch. This speeds up the internal 1438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // field operations considerably on average. 1439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize; 1440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (type) { 1441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_GLOBAL_PROXY_TYPE: 1442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSGlobalProxy::kSize; 1443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_GLOBAL_OBJECT_TYPE: 1444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSGlobalObject::kSize; 1445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_BUILTINS_OBJECT_TYPE: 1446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSBuiltinsObject::kSize; 1447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_FUNCTION_TYPE: 1448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSFunction::kSize; 1449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_VALUE_TYPE: 1450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSValue::kSize; 14513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case JS_DATE_TYPE: 14523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return JSDate::kSize; 1453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_ARRAY_TYPE: 14543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return JSArray::kSize; 145569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case JS_WEAK_MAP_TYPE: 145669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return JSWeakMap::kSize; 1457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_REGEXP_TYPE: 14583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return JSRegExp::kSize; 1459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case JS_CONTEXT_EXTENSION_OBJECT_TYPE: 1460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSObject::kHeaderSize; 14611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block case JS_MESSAGE_OBJECT_TYPE: 14621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return JSMessageObject::kSize; 1463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: 1464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 1465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 1466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSObject::GetInternalFieldCount() { 1471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(1 << kPointerSizeLog2 == kPointerSize); 1472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Make sure to adjust for the number of in-object properties. These 1473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // properties do contribute to the size, but are not internal fields. 1474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) - 1475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block map()->inobject_properties(); 1476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 147944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint JSObject::GetInternalFieldOffset(int index) { 148044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(index < GetInternalFieldCount() && index >= 0); 148144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return GetHeaderSize() + (kPointerSize * index); 148244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 148344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 148444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::GetInternalField(int index) { 1486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < GetInternalFieldCount() && index >= 0); 1487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Internal objects do follow immediately after the header, whereas in-object 1488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // properties are at the end of the object. Therefore there is no need 1489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to adjust the index here. 1490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index)); 1491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSObject::SetInternalField(int index, Object* value) { 1495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < GetInternalFieldCount() && index >= 0); 1496a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Internal objects do follow immediately after the header, whereas in-object 1497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // properties are at the end of the object. Therefore there is no need 1498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // to adjust the index here. 1499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = GetHeaderSize() + (kPointerSize * index); 1500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_BARRIER(GetHeap(), this, offset, value); 15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::SetInternalField(int index, Smi* value) { 15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(index < GetInternalFieldCount() && index >= 0); 15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Internal objects do follow immediately after the header, whereas in-object 15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // properties are at the end of the object. Therefore there is no need 15093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // to adjust the index here. 15103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int offset = GetHeaderSize() + (kPointerSize * index); 15113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_FIELD(this, offset, value); 1512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Access fast-case object properties at index. The use of these routines 1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// is needed to correctly distinguish between properties stored in-object and 1517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// properties stored in the properties array. 1518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::FastPropertyAt(int index) { 1519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adjust for the number of properties stored in the object. 1520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block index -= map()->inobject_properties(); 1521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (index < 0) { 1522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = map()->instance_size() + (index * kPointerSize); 1523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, offset); 1524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < properties()->length()); 1526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return properties()->get(index); 1527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::FastPropertyAtPut(int index, Object* value) { 1532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adjust for the number of properties stored in the object. 1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block index -= map()->inobject_properties(); 1534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (index < 0) { 1535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = map()->instance_size() + (index * kPointerSize); 1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_BARRIER(GetHeap(), this, offset, value); 1538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < properties()->length()); 1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block properties()->set(index, value); 1541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return value; 1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1545a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 154644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint JSObject::GetInObjectPropertyOffset(int index) { 154744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Adjust for the number of properties stored in the object. 154844f0eee88ff00398ff7f715fab053374d808c90dSteve Block index -= map()->inobject_properties(); 154944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(index < 0); 155044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return map()->instance_size() + (index * kPointerSize); 155144f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 155244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 155344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1554a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAt(int index) { 1555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adjust for the number of properties stored in the object. 1556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block index -= map()->inobject_properties(); 1557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < 0); 1558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = map()->instance_size() + (index * kPointerSize); 1559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, offset); 1560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1563a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSObject::InObjectPropertyAtPut(int index, 1564a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value, 1565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode) { 1566a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Adjust for the number of properties stored in the object. 1567a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block index -= map()->inobject_properties(); 1568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index < 0); 1569a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = map()->instance_size() + (index * kPointerSize); 1570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 15713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); 1572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return value; 1573a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1575a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1576a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 15773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSObject::InitializeBody(Map* map, 15783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* pre_allocated_value, 15793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* filler_value) { 15803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!filler_value->IsHeapObject() || 15813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !GetHeap()->InNewSpace(filler_value)); 15823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!pre_allocated_value->IsHeapObject() || 15833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch !GetHeap()->InNewSpace(pre_allocated_value)); 15843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int size = map->instance_size(); 15853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int offset = kHeaderSize; 15863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (filler_value != pre_allocated_value) { 15873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int pre_allocated = map->pre_allocated_property_fields(); 15883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(pre_allocated * kPointerSize + kHeaderSize <= size); 15893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch for (int i = 0; i < pre_allocated; i++) { 15903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_FIELD(this, offset, pre_allocated_value); 15913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch offset += kPointerSize; 15923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch while (offset < size) { 15953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_FIELD(this, offset, filler_value); 15963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch offset += kPointerSize; 1597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 16018defd9ff6930b4e24729971a61cf7469daf119beSteve Blockbool JSObject::HasFastProperties() { 16028defd9ff6930b4e24729971a61cf7469daf119beSteve Block return !properties()->IsDictionary(); 16038defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 16048defd9ff6930b4e24729971a61cf7469daf119beSteve Block 16058defd9ff6930b4e24729971a61cf7469daf119beSteve Block 16068defd9ff6930b4e24729971a61cf7469daf119beSteve Blockint JSObject::MaxFastProperties() { 16078defd9ff6930b4e24729971a61cf7469daf119beSteve Block // Allow extra fast properties if the object has more than 16088defd9ff6930b4e24729971a61cf7469daf119beSteve Block // kMaxFastProperties in-object properties. When this is the case, 16098defd9ff6930b4e24729971a61cf7469daf119beSteve Block // it is very unlikely that the object is being used as a dictionary 16108defd9ff6930b4e24729971a61cf7469daf119beSteve Block // and there is a good chance that allowing more map transitions 16118defd9ff6930b4e24729971a61cf7469daf119beSteve Block // will be worth it. 16128defd9ff6930b4e24729971a61cf7469daf119beSteve Block return Max(map()->inobject_properties(), kMaxFastProperties); 16138defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 16148defd9ff6930b4e24729971a61cf7469daf119beSteve Block 16158defd9ff6930b4e24729971a61cf7469daf119beSteve Block 1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Struct::InitializeBody(int object_size) { 161744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Object* value = GetHeap()->undefined_value(); 1618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { 1619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1620a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1621a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 16247f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool Object::ToArrayIndex(uint32_t* index) { 16257f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch if (IsSmi()) { 16267f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch int value = Smi::cast(this)->value(); 1627a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (value < 0) return false; 1628a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *index = value; 1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 1630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 16317f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch if (IsHeapNumber()) { 16327f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch double value = HeapNumber::cast(this)->value(); 1633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t uint_value = static_cast<uint32_t>(value); 1634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (value == static_cast<double>(uint_value)) { 1635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block *index = uint_value; 1636a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 1637a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return false; 1640a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Object::IsStringObjectWithCharacterAt(uint32_t index) { 1644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!this->IsJSValue()) return false; 1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JSValue* js_value = JSValue::cast(this); 1647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!js_value->value()->IsString()) return false; 1648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String* str = String::cast(js_value->value()); 1650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (index >= (uint32_t)str->length()) return false; 1651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return true; 1653a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 16563fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochFixedArrayBase* FixedArrayBase::cast(Object* object) { 16573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray()); 16583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return reinterpret_cast<FixedArrayBase*>(object); 16593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* FixedArray::get(int index) { 1663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kHeaderSize + index * kPointerSize); 1665a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1668a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Smi* value) { 166944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(map() != HEAP->fixed_cow_array_map()); 167069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(index >= 0 && index < this->length()); 1671a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(reinterpret_cast<Object*>(value)->IsSmi()); 1672a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = kHeaderSize + index * kPointerSize; 1673a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 1674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1676a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, Object* value) { 167844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(map() != HEAP->fixed_cow_array_map()); 1679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 1680a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int offset = kHeaderSize + index * kPointerSize; 1681a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, offset, value); 16823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_BARRIER(GetHeap(), this, offset, value); 1683a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1684a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1685a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 16863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline bool FixedDoubleArray::is_the_hole_nan(double value) { 16873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return BitCast<uint64_t, double>(value) == kHoleNanInt64; 16883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline double FixedDoubleArray::hole_nan_as_double() { 16923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return BitCast<double, uint64_t>(kHoleNanInt64); 16933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 16943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 16963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochinline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() { 16973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(BitCast<uint64_t>(OS::nan_value()) != kHoleNanInt64); 16983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT((BitCast<uint64_t>(OS::nan_value()) >> 32) != kHoleNanUpper32); 16993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return OS::nan_value(); 17003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 170369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochdouble FixedDoubleArray::get_scalar(int index) { 17043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(map() != HEAP->fixed_cow_array_map() && 17053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch map() != HEAP->fixed_array_map()); 17063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(index >= 0 && index < this->length()); 17073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize); 17083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(!is_the_hole_nan(result)); 17093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return result; 17103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint64_t FixedDoubleArray::get_representation(int index) { 17133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(map() != HEAP->fixed_cow_array_map() && 17143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map() != HEAP->fixed_array_map()); 17153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(index >= 0 && index < this->length()); 17163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize); 17173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 171969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* FixedDoubleArray::get(int index) { 172069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (is_the_hole(index)) { 172169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return GetHeap()->the_hole_value(); 172269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } else { 172369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return GetHeap()->NumberFromDouble(get_scalar(index)); 172469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 172569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 172669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 172769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 17283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid FixedDoubleArray::set(int index, double value) { 17293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(map() != HEAP->fixed_cow_array_map() && 17303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch map() != HEAP->fixed_array_map()); 17313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int offset = kHeaderSize + index * kDoubleSize; 17323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (isnan(value)) value = canonical_not_the_hole_nan_as_double(); 17333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch WRITE_DOUBLE_FIELD(this, offset, value); 17343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid FixedDoubleArray::set_the_hole(int index) { 17383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(map() != HEAP->fixed_cow_array_map() && 17393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch map() != HEAP->fixed_array_map()); 17403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int offset = kHeaderSize + index * kDoubleSize; 17413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double()); 17423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool FixedDoubleArray::is_the_hole(int index) { 17463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int offset = kHeaderSize + index * kDoubleSize; 17473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset)); 17483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 17493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17514515c472dc3e5ed2448a564600976759e569a0a8Leon ClarkeWriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) { 17523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Heap* heap = GetHeap(); 17533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; 17543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; 1755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return UPDATE_WRITE_BARRIER; 1756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set(int index, 1760a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value, 1761a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WriteBarrierMode mode) { 176285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch ASSERT(map() != HEAP->fixed_cow_array_map()); 176385b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch ASSERT(index >= 0 && index < this->length()); 1764c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch int offset = kHeaderSize + index * kPointerSize; 17653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_FIELD(this, offset, value); 17663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); 17673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 17683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 17703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array, 17713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index, 17723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* value) { 17733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map()); 17743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(index >= 0 && index < array->length()); 17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int offset = kHeaderSize + index * kPointerSize; 17763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_FIELD(array, offset, value); 17773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Heap* heap = array->GetHeap(); 17783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (heap->InNewSpace(value)) { 17793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap->RecordWrite(array->address(), offset); 17803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1781c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 1782c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 1783c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 17843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid FixedArray::NoWriteBarrierSet(FixedArray* array, 17853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int index, 17863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* value) { 178744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map()); 1788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < array->length()); 178944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->InNewSpace(value)); 1790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); 1791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_undefined(int index) { 179544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(map() != HEAP->fixed_cow_array_map()); 179644f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_undefined(GetHeap(), index); 179744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 179844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 179944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 180044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid FixedArray::set_undefined(Heap* heap, int index) { 1801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 180244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!heap->InNewSpace(heap->undefined_value())); 1803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kHeaderSize + index * kPointerSize, 180444f0eee88ff00398ff7f715fab053374d808c90dSteve Block heap->undefined_value()); 1805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_null(int index) { 180944f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_null(GetHeap(), index); 181044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 181144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 181244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 181344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid FixedArray::set_null(Heap* heap, int index) { 1814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 181544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!heap->InNewSpace(heap->null_value())); 181644f0eee88ff00398ff7f715fab053374d808c90dSteve Block WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value()); 1817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid FixedArray::set_the_hole(int index) { 182144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(map() != HEAP->fixed_cow_array_map()); 1822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 182344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->InNewSpace(HEAP->the_hole_value())); 182444f0eee88ff00398ff7f715fab053374d808c90dSteve Block WRITE_FIELD(this, 182544f0eee88ff00398ff7f715fab053374d808c90dSteve Block kHeaderSize + index * kPointerSize, 182644f0eee88ff00398ff7f715fab053374d808c90dSteve Block GetHeap()->the_hole_value()); 1827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1830756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedArray::set_unchecked(int index, Smi* value) { 1831756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(reinterpret_cast<Object*>(value)->IsSmi()); 1832756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick int offset = kHeaderSize + index * kPointerSize; 1833756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick WRITE_FIELD(this, offset, value); 1834756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 1835756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1836756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 183744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid FixedArray::set_unchecked(Heap* heap, 183844f0eee88ff00398ff7f715fab053374d808c90dSteve Block int index, 1839f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch Object* value, 1840f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch WriteBarrierMode mode) { 1841f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch int offset = kHeaderSize + index * kPointerSize; 1842f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch WRITE_FIELD(this, offset, value); 18433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode); 1844f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch} 1845f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 1846f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 184744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid FixedArray::set_null_unchecked(Heap* heap, int index) { 1848756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ASSERT(index >= 0 && index < this->length()); 184944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->InNewSpace(heap->null_value())); 185044f0eee88ff00398ff7f715fab053374d808c90dSteve Block WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value()); 1851756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 1852756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1853756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 18546ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockObject** FixedArray::data_start() { 18556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return HeapObject::RawField(this, kHeaderSize); 18566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 18576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 18586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1859a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsEmpty() { 1860257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(this->IsSmi() || 1861257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch this->length() > kFirstIndex || 186244f0eee88ff00398ff7f715fab053374d808c90dSteve Block this == HEAP->empty_descriptor_array()); 1863257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return this->IsSmi() || length() <= kFirstIndex; 1864257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1865257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint DescriptorArray::bit_field3_storage() { 1868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object* storage = READ_FIELD(this, kBitField3StorageOffset); 1869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Smi::cast(storage)->value(); 1870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 1871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid DescriptorArray::set_bit_field3_storage(int value) { 1873257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!IsEmpty()); 1874257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value)); 1875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 18783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid DescriptorArray::NoIncrementalWriteBarrierSwap(FixedArray* array, 18793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int first, 18803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int second) { 1881a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* tmp = array->get(first); 18823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoIncrementalWriteBarrierSet(array, first, array->get(second)); 18833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoIncrementalWriteBarrierSet(array, second, tmp); 1884a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1885a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1886a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1887a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint DescriptorArray::Search(String* name) { 1888a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block SLOW_ASSERT(IsSortedNoDuplicates()); 1889a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Check for empty descriptor array. 1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int nof = number_of_descriptors(); 1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (nof == 0) return kNotFound; 1893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Fast case: do linear search for small arrays. 1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block const int kMaxElementsForLinearSearch = 8; 1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (StringShape(name).IsSymbol() && nof < kMaxElementsForLinearSearch) { 1897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return LinearSearch(name, nof); 1898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Slow case: perform binary search. 1901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BinarySearch(name, 0, nof - 1); 1902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1904a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1905756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint DescriptorArray::SearchWithCache(String* name) { 190644f0eee88ff00398ff7f715fab053374d808c90dSteve Block int number = GetIsolate()->descriptor_lookup_cache()->Lookup(this, name); 1907756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick if (number == DescriptorLookupCache::kAbsent) { 1908756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick number = Search(name); 190944f0eee88ff00398ff7f715fab053374d808c90dSteve Block GetIsolate()->descriptor_lookup_cache()->Update(this, name, number); 1910756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick } 1911756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return number; 1912756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 1913756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1914756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 1915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* DescriptorArray::GetKey(int descriptor_number) { 1916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return String::cast(get(ToKeyIndex(descriptor_number))); 1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* DescriptorArray::GetValue(int descriptor_number) { 1922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetContentArray()->get(ToValueIndex(descriptor_number)); 1924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockSmi* DescriptorArray::GetDetails(int descriptor_number) { 1928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::cast(GetContentArray()->get(ToDetailsIndex(descriptor_number))); 1930a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType DescriptorArray::GetType(int descriptor_number) { 1934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 1935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return PropertyDetails(GetDetails(descriptor_number)).type(); 1936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint DescriptorArray::GetFieldIndex(int descriptor_number) { 1940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Descriptor::IndexFromValue(GetValue(descriptor_number)); 1941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSFunction* DescriptorArray::GetConstantFunction(int descriptor_number) { 1945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return JSFunction::cast(GetValue(descriptor_number)); 1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* DescriptorArray::GetCallbacksObject(int descriptor_number) { 1950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(GetType(descriptor_number) == CALLBACKS); 1951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetValue(descriptor_number); 1952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) { 1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(GetType(descriptor_number) == CALLBACKS); 1957257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number)); 19583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return reinterpret_cast<AccessorDescriptor*>(p->foreign_address()); 1959a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1960a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1961a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1962a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsProperty(int descriptor_number) { 19633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Entry entry(this, descriptor_number); 19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return IsPropertyDescriptor(&entry); 1965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 19683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool DescriptorArray::IsTransitionOnly(int descriptor_number) { 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (GetType(descriptor_number)) { 19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case MAP_TRANSITION: 19713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case CONSTANT_TRANSITION: 19723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case ELEMENTS_TRANSITION: 19733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case CALLBACKS: { 19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* value = GetValue(descriptor_number); 19763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!value->IsAccessorPair()) return false; 19773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AccessorPair* accessors = AccessorPair::cast(value); 19783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return accessors->getter()->IsMap() && accessors->setter()->IsMap(); 19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case NORMAL: 19813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case FIELD: 19823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case CONSTANT_FUNCTION: 19833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case HANDLER: 19843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case INTERCEPTOR: 19853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case NULL_DESCRIPTOR: 19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 19873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 19883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch UNREACHABLE(); // Keep the compiler happy. 19893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 1990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsNullDescriptor(int descriptor_number) { 1994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetType(descriptor_number) == NULL_DESCRIPTOR; 1995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1996a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1997a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1998a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool DescriptorArray::IsDontEnum(int descriptor_number) { 1999a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return PropertyDetails(GetDetails(descriptor_number)).IsDontEnum(); 2000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2002a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid DescriptorArray::Get(int descriptor_number, Descriptor* desc) { 2004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block desc->Init(GetKey(descriptor_number), 2005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block GetValue(descriptor_number), 20068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch PropertyDetails(GetDetails(descriptor_number))); 2007a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2008a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2009a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid DescriptorArray::Set(int descriptor_number, 20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Descriptor* desc, 20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const WhitenessWitness&) { 2013a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Range check. 2014a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(descriptor_number < number_of_descriptors()); 2015a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 20163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoIncrementalWriteBarrierSet(this, 20173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ToKeyIndex(descriptor_number), 20183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch desc->GetKey()); 20193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedArray* content_array = GetContentArray(); 20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoIncrementalWriteBarrierSet(content_array, 20213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ToValueIndex(descriptor_number), 20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch desc->GetValue()); 20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoIncrementalWriteBarrierSet(content_array, 20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ToDetailsIndex(descriptor_number), 20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch desc->GetDetails().AsSmi()); 20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 20273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2028a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 20293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid DescriptorArray::NoIncrementalWriteBarrierSwapDescriptors( 20303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int first, int second) { 20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoIncrementalWriteBarrierSwap(this, ToKeyIndex(first), ToKeyIndex(second)); 2032a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray* content_array = GetContentArray(); 20333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoIncrementalWriteBarrierSwap(content_array, 20343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ToValueIndex(first), 20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ToValueIndex(second)); 20363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NoIncrementalWriteBarrierSwap(content_array, 20373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ToDetailsIndex(first), 20383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ToDetailsIndex(second)); 2039592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 2040592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2041592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 20423ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array) 20433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : marking_(array->GetHeap()->incremental_marking()) { 20443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch marking_->EnterNoMarkingScope(); 20453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (array->number_of_descriptors() > 0) { 20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT); 20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(Marking::Color(array->GetContentArray()) == Marking::WHITE_OBJECT); 20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2049592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 2050592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2051592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 20523ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDescriptorArray::WhitenessWitness::~WhitenessWitness() { 20533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch marking_->LeaveNoMarkingScope(); 2054a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2055a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2056a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 205744f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktemplate<typename Shape, typename Key> 205869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint HashTable<Shape, Key>::ComputeCapacity(int at_least_space_for) { 205969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch const int kMinCapacity = 32; 206069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch int capacity = RoundUpToPowerOf2(at_least_space_for * 2); 206169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (capacity < kMinCapacity) { 206269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch capacity = kMinCapacity; // Guarantee min capacity. 206369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 206469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return capacity; 206569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 206669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 206769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 206869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochtemplate<typename Shape, typename Key> 206944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint HashTable<Shape, Key>::FindEntry(Key key) { 207044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return FindEntry(GetIsolate(), key); 207144f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 207244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 207344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 207444f0eee88ff00398ff7f715fab053374d808c90dSteve Block// Find entry for key otherwise return kNotFound. 207544f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktemplate<typename Shape, typename Key> 207644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint HashTable<Shape, Key>::FindEntry(Isolate* isolate, Key key) { 207744f0eee88ff00398ff7f715fab053374d808c90dSteve Block uint32_t capacity = Capacity(); 2078c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch uint32_t entry = FirstProbe(HashTable<Shape, Key>::Hash(key), capacity); 207944f0eee88ff00398ff7f715fab053374d808c90dSteve Block uint32_t count = 1; 208044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // EnsureCapacity will guarantee the hash table is never full. 208144f0eee88ff00398ff7f715fab053374d808c90dSteve Block while (true) { 208244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Object* element = KeyAt(entry); 2083c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch // Empty entry. 2084c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch if (element == isolate->heap()->raw_unchecked_undefined_value()) break; 20853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (element != isolate->heap()->raw_unchecked_the_hole_value() && 208644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Shape::IsMatch(key, element)) return entry; 208744f0eee88ff00398ff7f715fab053374d808c90dSteve Block entry = NextProbe(entry, count++, capacity); 208844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 208944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return kNotFound; 209044f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 209144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 209244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2093c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochbool SeededNumberDictionary::requires_slow_elements() { 2094a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* max_index_object = get(kMaxNumberKeyIndex); 2095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!max_index_object->IsSmi()) return false; 2096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0 != 2097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask); 2098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2100c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t SeededNumberDictionary::max_number_key() { 2101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!requires_slow_elements()); 2102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* max_index_object = get(kMaxNumberKeyIndex); 2103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (!max_index_object->IsSmi()) return 0; 2104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value()); 2105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return value >> kRequiresSlowElementsTagSize; 2106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2108c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochvoid SeededNumberDictionary::set_requires_slow_elements() { 21094515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask)); 2110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ------------------------------------ 2114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Cast operations 2115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(FixedArray) 21183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochCAST_ACCESSOR(FixedDoubleArray) 2119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(DescriptorArray) 2120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochCAST_ACCESSOR(DeoptimizationInputData) 2121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochCAST_ACCESSOR(DeoptimizationOutputData) 21223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(TypeFeedbackCells) 2123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SymbolTable) 21246ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCAST_ACCESSOR(JSFunctionResultCache) 212580d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian MonsenCAST_ACCESSOR(NormalizedMapCache) 21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(ScopeInfo) 2127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(CompilationCacheTable) 21286ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCAST_ACCESSOR(CodeCacheHashTable) 21293fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochCAST_ACCESSOR(PolymorphicCodeCacheHashTable) 2130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(MapCache) 2131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(String) 2132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqString) 2133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqAsciiString) 2134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SeqTwoByteString) 213569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochCAST_ACCESSOR(SlicedString) 2136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ConsString) 2137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalString) 2138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalAsciiString) 2139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ExternalTwoByteString) 21403fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochCAST_ACCESSOR(JSReceiver) 2141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSObject) 2142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Smi) 2143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(HeapObject) 2144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(HeapNumber) 2145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Oddball) 2146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalPropertyCell) 2147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(SharedFunctionInfo) 2148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Map) 2149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSFunction) 2150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(GlobalObject) 2151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalProxy) 2152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSGlobalObject) 2153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSBuiltinsObject) 2154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Code) 2155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSArray) 2156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(JSRegExp) 2157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochCAST_ACCESSOR(JSProxy) 21583fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochCAST_ACCESSOR(JSFunctionProxy) 21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(JSSet) 21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(JSMap) 216169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochCAST_ACCESSOR(JSWeakMap) 2162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochCAST_ACCESSOR(Foreign) 2163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(ByteArray) 21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochCAST_ACCESSOR(FreeSpace) 21653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalArray) 21663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalByteArray) 21673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedByteArray) 21683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalShortArray) 21693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedShortArray) 21703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalIntArray) 21713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalUnsignedIntArray) 21723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockCAST_ACCESSOR(ExternalFloatArray) 2173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochCAST_ACCESSOR(ExternalDoubleArray) 217444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockCAST_ACCESSOR(ExternalPixelArray) 2175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCAST_ACCESSOR(Struct) 2176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) 2179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block STRUCT_LIST(MAKE_STRUCT_CAST) 2180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef MAKE_STRUCT_CAST 2181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate <typename Shape, typename Key> 2184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) { 2185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(obj->IsHashTable()); 2186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<HashTable*>(obj); 2187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 21903fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochSMI_ACCESSORS(FixedArrayBase, length, kLengthOffset) 21913ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(FreeSpace, size, kSizeOffset) 2192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 21936ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockSMI_ACCESSORS(String, length, kLengthOffset) 2194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2196d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockuint32_t String::hash_field() { 2197d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return READ_UINT32_FIELD(this, kHashFieldOffset); 2198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2201d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockvoid String::set_hash_field(uint32_t value) { 2202d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block WRITE_UINT32_FIELD(this, kHashFieldOffset, value); 22037f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_64_BIT 22047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0); 22057f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif 2206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2209d0582a6c46733687d045e4188a1bcd0123c758a1Steve Blockbool String::Equals(String* other) { 2210d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (other == this) return true; 2211d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (StringShape(this).IsSymbol() && StringShape(other).IsSymbol()) { 2212d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return false; 2213d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 2214d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return SlowEquals(other); 2215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 22185913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* String::TryFlatten(PretenureFlag pretenure) { 2219f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke if (!StringShape(this).IsCons()) return this; 2220f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke ConsString* cons = ConsString::cast(this); 222169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (cons->IsFlat()) return cons->first(); 22226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return SlowTryFlatten(pretenure); 2223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2226f7060e27768c550ace7ec48ad8c093466db52dfaLeon ClarkeString* String::TryFlattenGetString(PretenureFlag pretenure) { 22275913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck MaybeObject* flat = TryFlatten(pretenure); 22285913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck Object* successfully_flattened; 222969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (!flat->ToObject(&successfully_flattened)) return this; 223069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return String::cast(successfully_flattened); 2231f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke} 2232f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2233f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke 2234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t String::Get(int index) { 2235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 2236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (StringShape(this).full_representation_tag()) { 2237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kSeqStringTag | kAsciiStringTag: 2238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return SeqAsciiString::cast(this)->SeqAsciiStringGet(index); 2239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kSeqStringTag | kTwoByteStringTag: 2240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index); 2241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kConsStringTag | kAsciiStringTag: 2242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kConsStringTag | kTwoByteStringTag: 2243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ConsString::cast(this)->ConsStringGet(index); 2244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kExternalStringTag | kAsciiStringTag: 2245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index); 2246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case kExternalStringTag | kTwoByteStringTag: 2247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index); 224869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case kSlicedStringTag | kAsciiStringTag: 224969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch case kSlicedStringTag | kTwoByteStringTag: 225069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return SlicedString::cast(this)->SlicedStringGet(index); 2251a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: 2252a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block break; 2253a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2254a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 2256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 2257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid String::Set(int index, uint16_t value) { 2261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 2262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(StringShape(this).IsSequential()); 2263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return this->IsAsciiRepresentation() 2265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ? SeqAsciiString::cast(this)->SeqAsciiStringSet(index, value) 2266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value); 2267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::IsFlat() { 227169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch if (!StringShape(this).IsCons()) return true; 227269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return ConsString::cast(this)->second()->length() == 0; 227369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 227469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 227569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 227669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochString* String::GetUnderlying() { 227769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // Giving direct access to underlying string only makes sense if the 227869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // wrapping string is already flattened. 227969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(this->IsFlat()); 228069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(StringShape(this).IsIndirect()); 228169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset); 228269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch const int kUnderlyingOffset = SlicedString::kParentOffset; 228369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return String::cast(READ_FIELD(this, kUnderlyingOffset)); 2284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqAsciiString::SeqAsciiStringGet(int index) { 2288a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 2289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); 2290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2292a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2293a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqAsciiString::SeqAsciiStringSet(int index, uint16_t value) { 2294a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length() && value <= kMaxAsciiCharCode); 2295a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, 2296a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static_cast<byte>(value)); 2297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqAsciiString::GetCharsAddress() { 2301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FIELD_ADDR(this, kHeaderSize); 2302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockchar* SeqAsciiString::GetChars() { 2306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<char*>(GetCharsAddress()); 2307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress SeqTwoByteString::GetCharsAddress() { 2311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FIELD_ADDR(this, kHeaderSize); 2312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2314a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2315a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuc16* SeqTwoByteString::GetChars() { 2316a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize)); 2317a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) { 2321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 2322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize); 2323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2326a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) { 2327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < length()); 2328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value); 2329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2332a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) { 23336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return SizeFor(length()); 2334a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2337a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SeqAsciiString::SeqAsciiStringSize(InstanceType instance_type) { 23386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return SizeFor(length()); 2339a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2340a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2341a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 234269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochString* SlicedString::parent() { 234369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return String::cast(READ_FIELD(this, kParentOffset)); 234469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 234569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 234669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 234769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid SlicedString::set_parent(String* parent) { 23483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(parent->IsSeqString() || parent->IsExternalString()); 234969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch WRITE_FIELD(this, kParentOffset, parent); 235069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 235169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 235269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 235369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochSMI_ACCESSORS(SlicedString, offset, kOffsetOffset) 235469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 235569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2356a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::first() { 2357a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return String::cast(READ_FIELD(this, kFirstOffset)); 2358a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2359a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2360a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2361a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_first() { 2362a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kFirstOffset); 2363a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2364a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2365a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2366a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_first(String* value, WriteBarrierMode mode) { 2367a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kFirstOffset, value); 23683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode); 2369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* ConsString::second() { 2373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return String::cast(READ_FIELD(this, kSecondOffset)); 2374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* ConsString::unchecked_second() { 2378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kSecondOffset); 2379a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2380a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2381a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2382a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ConsString::set_second(String* value, WriteBarrierMode mode) { 2383a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kSecondOffset, value); 23843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode); 23853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool ExternalString::is_short() { 23893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch InstanceType type = map()->instance_type(); 23903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (type & kShortExternalStringMask) == kShortExternalStringTag; 2391592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 2392592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2393592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 23943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst ExternalAsciiString::Resource* ExternalAsciiString::resource() { 2395a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)); 2396a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid ExternalAsciiString::update_data_cache() { 24003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_short()) return; 24013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const char** data_field = 24023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset)); 24033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *data_field = resource()->data(); 24043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ExternalAsciiString::set_resource( 24083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const ExternalAsciiString::Resource* resource) { 24093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *reinterpret_cast<const Resource**>( 24103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FIELD_ADDR(this, kResourceOffset)) = resource; 24113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (resource != NULL) update_data_cache(); 24123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* ExternalAsciiString::GetChars() { 24163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return resource()->data(); 2417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 24203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochuint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) { 24213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(index >= 0 && index < length()); 24223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetChars()[index]; 24233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst ExternalTwoByteString::Resource* ExternalTwoByteString::resource() { 2427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)); 2428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 24313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid ExternalTwoByteString::update_data_cache() { 24323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (is_short()) return; 24333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const uint16_t** data_field = 24343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset)); 24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *data_field = resource()->data(); 24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ExternalTwoByteString::set_resource( 24403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const ExternalTwoByteString::Resource* resource) { 24413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch *reinterpret_cast<const Resource**>( 24423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FIELD_ADDR(this, kResourceOffset)) = resource; 24433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (resource != NULL) update_data_cache(); 24443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint16_t* ExternalTwoByteString::GetChars() { 24483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return resource()->data(); 24493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochuint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) { 24533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(index >= 0 && index < length()); 24543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetChars()[index]; 24553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 24563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 24583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData( 24593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch unsigned start) { 24603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetChars() + start; 2461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 24646ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSFunctionResultCache::MakeZeroSize() { 2465b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set_finger_index(kEntriesIndex); 2466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set_size(kEntriesIndex); 24676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 24686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24706ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSFunctionResultCache::Clear() { 2471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int cache_size = size(); 24726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex)); 24733e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu MemsetPointer(entries_start, 247444f0eee88ff00398ff7f715fab053374d808c90dSteve Block GetHeap()->the_hole_value(), 24753e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu cache_size - kEntriesIndex); 24766ded16be15dd865a9b21ea304d5273c8be299c87Steve Block MakeZeroSize(); 24776ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 24786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2480b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint JSFunctionResultCache::size() { 2481b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Smi::cast(get(kCacheSizeIndex))->value(); 2482b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2483b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2484b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2485b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid JSFunctionResultCache::set_size(int size) { 2486b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set(kCacheSizeIndex, Smi::FromInt(size)); 2487b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2488b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2489b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2490b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochint JSFunctionResultCache::finger_index() { 2491b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return Smi::cast(get(kFingerIndex))->value(); 2492b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2493b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2494b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2495b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochvoid JSFunctionResultCache::set_finger_index(int finger_index) { 2496b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set(kFingerIndex, Smi::FromInt(finger_index)); 2497b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2498b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2499b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte ByteArray::get(int index) { 2501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 2502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); 2503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid ByteArray::set(int index, byte value) { 2507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && index < this->length()); 2508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value); 2509a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2510a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint ByteArray::get_int(int index) { 2513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= 0 && (index * kIntSize) < this->length()); 2514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_INT_FIELD(this, kHeaderSize + index * kIntSize); 2515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockByteArray* ByteArray::FromDataStartAddress(Address address) { 2519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_TAG_ALIGNED(address); 2520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); 2521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockAddress ByteArray::GetDataStartAddress() { 2525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; 2526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 252944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockuint8_t* ExternalPixelArray::external_pixel_pointer() { 253044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return reinterpret_cast<uint8_t*>(external_pointer()); 2531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 253469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint8_t ExternalPixelArray::get_scalar(int index) { 2535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((index >= 0) && (index < this->length())); 253644f0eee88ff00398ff7f715fab053374d808c90dSteve Block uint8_t* ptr = external_pixel_pointer(); 2537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ptr[index]; 2538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 254169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalPixelArray::get(int index) { 254269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Smi::FromInt(static_cast<int>(get_scalar(index))); 254369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 254469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 254569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 254644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid ExternalPixelArray::set(int index, uint8_t value) { 2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT((index >= 0) && (index < this->length())); 254844f0eee88ff00398ff7f715fab053374d808c90dSteve Block uint8_t* ptr = external_pixel_pointer(); 2549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ptr[index] = value; 2550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 25533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid* ExternalArray::external_pointer() { 25543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); 25553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return reinterpret_cast<void*>(ptr); 25563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 25573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 25583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 25593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) { 25603ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block intptr_t ptr = reinterpret_cast<intptr_t>(value); 25613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); 25623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 25633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 25643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 256569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint8_t ExternalByteArray::get_scalar(int index) { 25663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 25673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int8_t* ptr = static_cast<int8_t*>(external_pointer()); 25683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 25693ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 25703ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 25713ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 257269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalByteArray::get(int index) { 257369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Smi::FromInt(static_cast<int>(get_scalar(index))); 257469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 257569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 257669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 25773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalByteArray::set(int index, int8_t value) { 25783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 25793ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int8_t* ptr = static_cast<int8_t*>(external_pointer()); 25803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 25813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 25823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 25833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 258469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint8_t ExternalUnsignedByteArray::get_scalar(int index) { 25853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 25863ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); 25873ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 25883ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 25893ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 25903ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 259169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalUnsignedByteArray::get(int index) { 259269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Smi::FromInt(static_cast<int>(get_scalar(index))); 259369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 259469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 259569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 25963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedByteArray::set(int index, uint8_t value) { 25973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 25983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); 25993ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 26003ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26013ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26023ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 260369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint16_t ExternalShortArray::get_scalar(int index) { 26043ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26053ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int16_t* ptr = static_cast<int16_t*>(external_pointer()); 26063ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 26073ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26083ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26093ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 261069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalShortArray::get(int index) { 261169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Smi::FromInt(static_cast<int>(get_scalar(index))); 261269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 261369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 261469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 26153ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalShortArray::set(int index, int16_t value) { 26163ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26173ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int16_t* ptr = static_cast<int16_t*>(external_pointer()); 26183ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 26193ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26203ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 262269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint16_t ExternalUnsignedShortArray::get_scalar(int index) { 26233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); 26253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 26263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 262969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalUnsignedShortArray::get(int index) { 263069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return Smi::FromInt(static_cast<int>(get_scalar(index))); 263169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 263269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 263369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 26343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedShortArray::set(int index, uint16_t value) { 26353ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26363ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); 26373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 26383ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26393ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26403ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 264169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochint32_t ExternalIntArray::get_scalar(int index) { 26423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int32_t* ptr = static_cast<int32_t*>(external_pointer()); 26443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 26453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 264869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalIntArray::get(int index) { 264969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return GetHeap()->NumberFromInt32(get_scalar(index)); 265069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 265169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 265269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 26533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalIntArray::set(int index, int32_t value) { 26543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26553ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block int32_t* ptr = static_cast<int32_t*>(external_pointer()); 26563ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 26573ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26583ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26593ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 266069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochuint32_t ExternalUnsignedIntArray::get_scalar(int index) { 26613ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26623ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); 26633ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 26643ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26653ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26663ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 266769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalUnsignedIntArray::get(int index) { 266869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return GetHeap()->NumberFromUint32(get_scalar(index)); 266969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 267069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 267169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 26723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalUnsignedIntArray::set(int index, uint32_t value) { 26733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); 26753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 26763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26773ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26783ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 267969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochfloat ExternalFloatArray::get_scalar(int index) { 26803ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26813ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block float* ptr = static_cast<float*>(external_pointer()); 26823ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ptr[index]; 26833ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26843ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26853ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 268669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalFloatArray::get(int index) { 268769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return GetHeap()->NumberFromDouble(get_scalar(index)); 268869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 268969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 269069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 26913ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockvoid ExternalFloatArray::set(int index, float value) { 26923ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ASSERT((index >= 0) && (index < this->length())); 26933ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block float* ptr = static_cast<float*>(external_pointer()); 26943ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block ptr[index] = value; 26953ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 26963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 26973bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 269869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochdouble ExternalDoubleArray::get_scalar(int index) { 2699257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT((index >= 0) && (index < this->length())); 2700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch double* ptr = static_cast<double*>(external_pointer()); 2701257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return ptr[index]; 2702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 270569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochMaybeObject* ExternalDoubleArray::get(int index) { 270669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return GetHeap()->NumberFromDouble(get_scalar(index)); 270769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 270869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 270969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 2710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid ExternalDoubleArray::set(int index, double value) { 2711257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT((index >= 0) && (index < this->length())); 2712257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch double* ptr = static_cast<double*>(external_pointer()); 2713257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ptr[index] = value; 2714257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2716257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 27179ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickint Map::visitor_id() { 27189ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick return READ_BYTE_FIELD(this, kVisitorIdOffset); 27199ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick} 27209ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick 27219ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick 27229ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrickvoid Map::set_visitor_id(int id) { 27239ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick ASSERT(0 <= id && id < 256); 27249ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id)); 27259ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick} 27269ac36c9faca11611ada13b4054edbaa0738661d0Iain Merrick 27273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 2728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::instance_size() { 2729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2; 2730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2731a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2732a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2733a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::inobject_properties() { 2734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kInObjectPropertiesOffset); 2735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::pre_allocated_property_fields() { 2739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset); 2740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint HeapObject::SizeFromMap(Map* map) { 2744791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block int instance_size = map->instance_size(); 2745791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block if (instance_size != kVariableSizeSentinel) return instance_size; 2746791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // We can ignore the "symbol" bit becase it is only set for symbols 2747791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block // and implies a string type. 2748791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block int instance_type = static_cast<int>(map->instance_type()) & ~kIsSymbolMask; 2749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only inline the most frequent cases. 2750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (instance_type == FIXED_ARRAY_TYPE) { 2751756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return FixedArray::BodyDescriptor::SizeOf(map, this); 2752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2753791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block if (instance_type == ASCII_STRING_TYPE) { 2754791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return SeqAsciiString::SizeFor( 2755791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block reinterpret_cast<SeqAsciiString*>(this)->length()); 2756791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block } 2757a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (instance_type == BYTE_ARRAY_TYPE) { 2758a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<ByteArray*>(this)->ByteArraySize(); 2759a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 27603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (instance_type == FREE_SPACE_TYPE) { 27613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return reinterpret_cast<FreeSpace*>(this)->size(); 27623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2763791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block if (instance_type == STRING_TYPE) { 2764791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return SeqTwoByteString::SizeFor( 2765791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block reinterpret_cast<SeqTwoByteString*>(this)->length()); 2766791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block } 27673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { 27683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return FixedDoubleArray::SizeFor( 27693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch reinterpret_cast<FixedDoubleArray*>(this)->length()); 27703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2771791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block ASSERT(instance_type == CODE_TYPE); 2772791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return reinterpret_cast<Code*>(this)->CodeSize(); 2773a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2774a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2775a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2776a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_size(int value) { 2777a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT_EQ(0, value & (kPointerSize - 1)); 2778a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block value >>= kPointerSizeLog2; 2779a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= value && value < 256); 2780a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value)); 2781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_inobject_properties(int value) { 2785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= value && value < 256); 2786a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value)); 2787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2790a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_pre_allocated_property_fields(int value) { 2791a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= value && value < 256); 2792a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, 2793a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPreAllocatedPropertyFieldsOffset, 2794a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block static_cast<byte>(value)); 2795a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2796a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2797a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2798a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInstanceType Map::instance_type() { 2799a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset)); 2800a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2801a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2802a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2803a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_instance_type(InstanceType value) { 2804a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value); 2805a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2806a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2807a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2808a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Map::unused_property_fields() { 2809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset); 2810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2813a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_unused_property_fields(int value) { 2814a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255)); 2815a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2816a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2817a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2818a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte Map::bit_field() { 2819a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kBitFieldOffset); 2820a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2821a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2822a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2823a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field(byte value) { 2824a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kBitFieldOffset, value); 2825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2827a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2828a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte Map::bit_field2() { 2829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_BYTE_FIELD(this, kBitField2Offset); 2830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_bit_field2(byte value) { 2834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kBitField2Offset, value); 2835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2836a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2837a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2838a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_non_instance_prototype(bool value) { 2839a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (value) { 2840a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_bit_field(bit_field() | (1 << kHasNonInstancePrototype)); 2841a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2842a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype)); 2843a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2844a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2845a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2846a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2847a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Map::has_non_instance_prototype() { 2848a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((1 << kHasNonInstancePrototype) & bit_field()) != 0; 2849a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2850a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2851a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28526ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid Map::set_function_with_prototype(bool value) { 28536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block if (value) { 28546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block set_bit_field2(bit_field2() | (1 << kFunctionWithPrototype)); 28556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } else { 28566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block set_bit_field2(bit_field2() & ~(1 << kFunctionWithPrototype)); 28576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block } 28586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 28596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 28606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 28616ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool Map::function_with_prototype() { 28626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return ((1 << kFunctionWithPrototype) & bit_field2()) != 0; 28636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 28646ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 28656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_is_access_check_needed(bool access_check_needed) { 2867a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (access_check_needed) { 2868a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded)); 2869a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 2870a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded)); 2871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 2872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2873a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Map::is_access_check_needed() { 2876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0; 2877a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2878a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 28808defd9ff6930b4e24729971a61cf7469daf119beSteve Blockvoid Map::set_is_extensible(bool value) { 28818defd9ff6930b4e24729971a61cf7469daf119beSteve Block if (value) { 28828defd9ff6930b4e24729971a61cf7469daf119beSteve Block set_bit_field2(bit_field2() | (1 << kIsExtensible)); 28838defd9ff6930b4e24729971a61cf7469daf119beSteve Block } else { 28848defd9ff6930b4e24729971a61cf7469daf119beSteve Block set_bit_field2(bit_field2() & ~(1 << kIsExtensible)); 28858defd9ff6930b4e24729971a61cf7469daf119beSteve Block } 28868defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 28878defd9ff6930b4e24729971a61cf7469daf119beSteve Block 28888defd9ff6930b4e24729971a61cf7469daf119beSteve Blockbool Map::is_extensible() { 28898defd9ff6930b4e24729971a61cf7469daf119beSteve Block return ((1 << kIsExtensible) & bit_field2()) != 0; 28908defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 28918defd9ff6930b4e24729971a61cf7469daf119beSteve Block 28928defd9ff6930b4e24729971a61cf7469daf119beSteve Block 28930d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Map::set_attached_to_shared_function_info(bool value) { 28940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (value) { 28950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_bit_field2(bit_field2() | (1 << kAttachedToSharedFunctionInfo)); 28960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 28970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen set_bit_field2(bit_field2() & ~(1 << kAttachedToSharedFunctionInfo)); 28980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 28990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 29000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 29010d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool Map::attached_to_shared_function_info() { 29020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return ((1 << kAttachedToSharedFunctionInfo) & bit_field2()) != 0; 29030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 29040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 29050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 29060d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid Map::set_is_shared(bool value) { 29070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen if (value) { 2908257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_bit_field3(bit_field3() | (1 << kIsShared)); 29090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } else { 2910257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_bit_field3(bit_field3() & ~(1 << kIsShared)); 29110d5e116f6aee03185f237311a943491bb079a768Kristian Monsen } 29120d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 29130d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 29140d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool Map::is_shared() { 2915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return ((1 << kIsShared) & bit_field3()) != 0; 29160d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 29170d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 29180d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 29190d5e116f6aee03185f237311a943491bb079a768Kristian MonsenJSFunction* Map::unchecked_constructor() { 29200d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return reinterpret_cast<JSFunction*>(READ_FIELD(this, kConstructorOffset)); 29210d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 29220d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 29238defd9ff6930b4e24729971a61cf7469daf119beSteve Block 2924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::flags() { 2925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset)); 2926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Code::set_flags(Code::Flags flags) { 2930589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1); 2931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Make sure that all call stubs have an arguments count. 29327f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT((ExtractKindFromFlags(flags) != CALL_IC && 29337f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ExtractKindFromFlags(flags) != KEYED_CALL_IC) || 2934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ExtractArgumentsCountFromFlags(flags) >= 0); 2935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_INT_FIELD(this, kFlagsOffset, flags); 2936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::kind() { 2940a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExtractKindFromFlags(flags()); 2941a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2942a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2943a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInlineCacheState Code::ic_state() { 2945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InlineCacheState result = ExtractICStateFromFlags(flags()); 2946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Only allow uninitialized or debugger states for non-IC code 2947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // objects. This is used in the debugger to determine whether or not 2948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // a call to code object has been replaced with a debug break call. 2949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(is_inline_cache_stub() || 2950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result == UNINITIALIZED || 2951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result == DEBUG_BREAK || 2952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result == DEBUG_PREPARE_STEP_IN); 2953a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 2954a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2955a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2957b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochCode::ExtraICState Code::extra_ic_state() { 2958b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(is_inline_cache_stub()); 2959b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return ExtractExtraICStateFromFlags(flags()); 2960b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} 2961b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType Code::type() { 2964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExtractTypeFromFlags(flags()); 2965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::arguments_count() { 29697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB); 2970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ExtractArgumentsCountFromFlags(flags()); 2971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 297480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenint Code::major_key() { 2975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == STUB || 2976257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kind() == UNARY_OP_IC || 2977257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kind() == BINARY_OP_IC || 297869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kind() == COMPARE_IC || 297969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kind() == TO_BOOLEAN_IC); 298080d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsen return READ_BYTE_FIELD(this, kStubMajorKeyOffset); 2981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 298480d68eab642096c1a48b6474d6ec33064b0ad1f5Kristian Monsenvoid Code::set_major_key(int major) { 2985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == STUB || 2986257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kind() == UNARY_OP_IC || 2987257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kind() == BINARY_OP_IC || 298869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kind() == COMPARE_IC || 298969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kind() == TO_BOOLEAN_IC); 2990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(0 <= major && major < 256); 2991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_BYTE_FIELD(this, kStubMajorKeyOffset, major); 2992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 29953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::is_pregenerated() { 29963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return kind() == STUB && IsPregeneratedField::decode(flags()); 29973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 29983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::set_is_pregenerated(bool value) { 30013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(kind() == STUB); 30023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Flags f = flags(); 30033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch f = static_cast<Flags>(IsPregeneratedField::update(f, value)); 30043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_flags(f); 30053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 30063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Code::optimizable() { 3009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == FUNCTION); 3010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return READ_BYTE_FIELD(this, kOptimizableOffset) == 1; 3011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_optimizable(bool value) { 3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == FUNCTION); 3016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0); 3017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Code::has_deoptimization_support() { 3021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == FUNCTION); 3022589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 3023589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return FullCodeFlagsHasDeoptimizationSupportField::decode(flags); 3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_has_deoptimization_support(bool value) { 3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == FUNCTION); 3029589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 3030589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value); 3031589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch WRITE_BYTE_FIELD(this, kFullCodeFlags, flags); 3032589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 3033589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 3034589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 3035589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochbool Code::has_debug_break_slots() { 3036589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ASSERT(kind() == FUNCTION); 3037589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 3038589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return FullCodeFlagsHasDebugBreakSlotsField::decode(flags); 3039589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 3040589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 3041589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 3042589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid Code::set_has_debug_break_slots(bool value) { 3043589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ASSERT(kind() == FUNCTION); 3044589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 3045589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch flags = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value); 3046589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch WRITE_BYTE_FIELD(this, kFullCodeFlags, flags); 3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::is_compiled_optimizable() { 30513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(kind() == FUNCTION); 30523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 30533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return FullCodeFlagsIsCompiledOptimizable::decode(flags); 30543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 30553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::set_compiled_optimizable(bool value) { 30583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(kind() == FUNCTION); 30593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 30603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value); 30613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_BYTE_FIELD(this, kFullCodeFlags, flags); 30623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 30633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::has_self_optimization_header() { 30663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(kind() == FUNCTION); 30673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 30683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return FullCodeFlagsHasSelfOptimizationHeader::decode(flags); 30693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 30703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::set_self_optimization_header(bool value) { 30733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(kind() == FUNCTION); 30743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 30753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch flags = FullCodeFlagsHasSelfOptimizationHeader::update(flags, value); 30763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_BYTE_FIELD(this, kFullCodeFlags, flags); 30773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 30783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 30793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochint Code::allow_osr_at_loop_nesting_level() { 3081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == FUNCTION); 3082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return READ_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset); 3083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_allow_osr_at_loop_nesting_level(int level) { 3087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == FUNCTION); 3088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(level >= 0 && level <= kMaxLoopNestingMarker); 3089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch WRITE_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset, level); 3090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30938f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdochint Code::profiler_ticks() { 30948f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch ASSERT(kind() == FUNCTION); 30958f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch return READ_BYTE_FIELD(this, kProfilerTicksOffset); 30968f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch} 30978f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 30988f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 30998f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdochvoid Code::set_profiler_ticks(int ticks) { 31008f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch ASSERT(kind() == FUNCTION); 31018f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch ASSERT(ticks < 256); 31028f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch WRITE_BYTE_FIELD(this, kProfilerTicksOffset, ticks); 31038f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch} 31048f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 31058f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 3106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochunsigned Code::stack_slots() { 3107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == OPTIMIZED_FUNCTION); 3108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return READ_UINT32_FIELD(this, kStackSlotsOffset); 3109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_stack_slots(unsigned slots) { 3113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == OPTIMIZED_FUNCTION); 3114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch WRITE_UINT32_FIELD(this, kStackSlotsOffset, slots); 3115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockunsigned Code::safepoint_table_offset() { 3119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == OPTIMIZED_FUNCTION); 31201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return READ_UINT32_FIELD(this, kSafepointTableOffsetOffset); 3121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Code::set_safepoint_table_offset(unsigned offset) { 3125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == OPTIMIZED_FUNCTION); 3126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize))); 31271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block WRITE_UINT32_FIELD(this, kSafepointTableOffsetOffset, offset); 3128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockunsigned Code::stack_check_table_offset() { 3132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == FUNCTION); 31331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return READ_UINT32_FIELD(this, kStackCheckTableOffsetOffset); 3134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid Code::set_stack_check_table_offset(unsigned offset) { 3138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(kind() == FUNCTION); 3139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize))); 31401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block WRITE_UINT32_FIELD(this, kStackCheckTableOffsetOffset, offset); 3141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochCheckType Code::check_type() { 3145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(is_call_stub() || is_keyed_call_stub()); 3146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch byte type = READ_BYTE_FIELD(this, kCheckTypeOffset); 3147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return static_cast<CheckType>(type); 3148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_check_type(CheckType value) { 3152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(is_call_stub() || is_keyed_call_stub()); 3153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch WRITE_BYTE_FIELD(this, kCheckTypeOffset, value); 3154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbyte Code::unary_op_type() { 3158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(is_unary_op_stub()); 3159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return READ_BYTE_FIELD(this, kUnaryOpTypeOffset); 3160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 3161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3162257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Code::set_unary_op_type(byte value) { 3164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(is_unary_op_stub()); 3165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch WRITE_BYTE_FIELD(this, kUnaryOpTypeOffset, value); 3166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 3167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbyte Code::binary_op_type() { 3170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(is_binary_op_stub()); 3171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return READ_BYTE_FIELD(this, kBinaryOpTypeOffset); 3172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Code::set_binary_op_type(byte value) { 3176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(is_binary_op_stub()); 3177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value); 3178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbyte Code::binary_op_result_type() { 3182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(is_binary_op_stub()); 3183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return READ_BYTE_FIELD(this, kBinaryOpReturnTypeOffset); 3184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3187257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Code::set_binary_op_result_type(byte value) { 3188257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(is_binary_op_stub()); 3189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch WRITE_BYTE_FIELD(this, kBinaryOpReturnTypeOffset, value); 3190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbyte Code::compare_state() { 3194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(is_compare_ic_stub()); 3195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return READ_BYTE_FIELD(this, kCompareStateOffset); 3196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Code::set_compare_state(byte value) { 3200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(is_compare_ic_stub()); 3201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch WRITE_BYTE_FIELD(this, kCompareStateOffset, value); 3202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 320569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochbyte Code::to_boolean_state() { 320669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(is_to_boolean_ic_stub()); 320769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return READ_BYTE_FIELD(this, kToBooleanTypeOffset); 320869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 320969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 321069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 321169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid Code::set_to_boolean_state(byte value) { 321269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(is_to_boolean_ic_stub()); 321369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch WRITE_BYTE_FIELD(this, kToBooleanTypeOffset, value); 321469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 321569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 32163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 32173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::has_function_cache() { 32183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(kind() == STUB); 32193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return READ_BYTE_FIELD(this, kHasFunctionCacheOffset) != 0; 32203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 32213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 32223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 32233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Code::set_has_function_cache(bool flag) { 32243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(kind() == STUB); 32253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_BYTE_FIELD(this, kHasFunctionCacheOffset, flag); 32263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 32273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 32283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Code::is_inline_cache_stub() { 3230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Kind kind = this->kind(); 3231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND; 3232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::ComputeFlags(Kind kind, 3236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block InlineCacheState ic_state, 3237b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ExtraICState extra_ic_state, 3238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyType type, 32398defd9ff6930b4e24729971a61cf7469daf119beSteve Block int argc, 32408defd9ff6930b4e24729971a61cf7469daf119beSteve Block InlineCacheHolderFlag holder) { 3241257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Extra IC state is only allowed for call IC stubs or for store IC 3242257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // stubs. 3243b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(extra_ic_state == kNoExtraICState || 3244589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch kind == CALL_IC || 3245589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch kind == STORE_IC || 3246589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch kind == KEYED_STORE_IC); 3247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Compute the bit mask. 3248589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch int bits = KindField::encode(kind) 3249589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch | ICStateField::encode(ic_state) 3250589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch | TypeField::encode(type) 3251589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch | ExtraICStateField::encode(extra_ic_state) 3252589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch | (argc << kArgumentsCountShift) 3253589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch | CacheHolderField::encode(holder); 3254589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return static_cast<Flags>(bits); 3255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::ComputeMonomorphicFlags(Kind kind, 3259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyType type, 3260b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ExtraICState extra_ic_state, 32618defd9ff6930b4e24729971a61cf7469daf119beSteve Block InlineCacheHolderFlag holder, 3262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int argc) { 3263589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder); 3264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Kind Code::ExtractKindFromFlags(Flags flags) { 3268589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return KindField::decode(flags); 3269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockInlineCacheState Code::ExtractICStateFromFlags(Flags flags) { 3273589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return ICStateField::decode(flags); 3274a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3275a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3276a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3277b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben MurdochCode::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) { 3278589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return ExtraICStateField::decode(flags); 3279a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3280a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3281a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3282a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyType Code::ExtractTypeFromFlags(Flags flags) { 3283589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return TypeField::decode(flags); 3284a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3287a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::ExtractArgumentsCountFromFlags(Flags flags) { 3288589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return (flags & kArgumentsCountMask) >> kArgumentsCountShift; 3289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 32928defd9ff6930b4e24729971a61cf7469daf119beSteve BlockInlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) { 3293589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return CacheHolderField::decode(flags); 32948defd9ff6930b4e24729971a61cf7469daf119beSteve Block} 32958defd9ff6930b4e24729971a61cf7469daf119beSteve Block 32968defd9ff6930b4e24729971a61cf7469daf119beSteve Block 3297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode::Flags Code::RemoveTypeFromFlags(Flags flags) { 3298589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch int bits = flags & ~TypeField::kMask; 3299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<Flags>(bits); 3300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3302a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3303a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* Code::GetCodeFromTargetAddress(Address address) { 3304a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize); 3305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // GetCodeFromTargetAddress might be called when marking objects during mark 3306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // sweep. reinterpret_cast is therefore used instead of the more appropriate 3307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Code::cast. Code::cast does not work when the object's map is 3308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // marked. 3309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Code* result = reinterpret_cast<Code*>(code); 3310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 3311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3313a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3314791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve BlockObject* Code::GetObjectFromEntryAddress(Address location_of_address) { 3315791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return HeapObject:: 3316791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize); 3317791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block} 3318791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 3319791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block 3320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* Map::prototype() { 3321a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kPrototypeOffset); 3322a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3323a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3324a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3325a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Map::set_prototype(Object* value, WriteBarrierMode mode) { 33263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(value->IsNull() || value->IsJSReceiver()); 3327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kPrototypeOffset, value); 33283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode); 33291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 33301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 33311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochDescriptorArray* Map::instance_descriptors() { 3333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset); 3334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (object->IsSmi()) { 33353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetHeap()->empty_descriptor_array(); 3336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 3337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return DescriptorArray::cast(object); 3338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 3340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Map::init_instance_descriptors() { 3343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, Smi::FromInt(0)); 3344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 3345257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3346257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Map::clear_instance_descriptors() { 3348257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object* object = READ_FIELD(this, 3349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kInstanceDescriptorsOrBitField3Offset); 3350257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!object->IsSmi()) { 3351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch WRITE_FIELD( 3352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch this, 3353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kInstanceDescriptorsOrBitField3Offset, 3354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Smi::FromInt(DescriptorArray::cast(object)->bit_field3_storage())); 3355257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3356257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 3357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3358257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3359257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Map::set_instance_descriptors(DescriptorArray* value, 3360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch WriteBarrierMode mode) { 3361257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object* object = READ_FIELD(this, 3362257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kInstanceDescriptorsOrBitField3Offset); 33633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Heap* heap = GetHeap(); 33643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value == heap->empty_descriptor_array()) { 3365257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch clear_instance_descriptors(); 3366257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return; 3367257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 3368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (object->IsSmi()) { 3369257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value->set_bit_field3_storage(Smi::cast(object)->value()); 3370257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 3371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value->set_bit_field3_storage( 3372257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DescriptorArray::cast(object)->bit_field3_storage()); 3373257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3374257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3375257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!is_shared()); 3376257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value); 33773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER( 33783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode); 3379257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 3380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3381257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3382257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint Map::bit_field3() { 3383257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object* object = READ_FIELD(this, 3384257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kInstanceDescriptorsOrBitField3Offset); 3385257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (object->IsSmi()) { 3386257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Smi::cast(object)->value(); 3387257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 3388257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return DescriptorArray::cast(object)->bit_field3_storage(); 3389257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 3391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Map::set_bit_field3(int value) { 3394257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(Smi::IsValid(value)); 3395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Object* object = READ_FIELD(this, 3396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kInstanceDescriptorsOrBitField3Offset); 3397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (object->IsSmi()) { 3398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch WRITE_FIELD(this, 3399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kInstanceDescriptorsOrBitField3Offset, 3400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Smi::FromInt(value)); 3401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 3402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DescriptorArray::cast(object)->set_bit_field3_storage(value); 3403257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 3405257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3406257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 34073ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFixedArray* Map::unchecked_prototype_transitions() { 34083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return reinterpret_cast<FixedArray*>( 34093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch READ_FIELD(this, kPrototypeTransitionsOffset)); 34103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 34113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34136ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(Map, code_cache, Object, kCodeCacheOffset) 3414053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve BlockACCESSORS(Map, prototype_transitions, FixedArray, kPrototypeTransitionsOffset) 3415a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Map, constructor, Object, kConstructorOffset) 3416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) 34183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSFunction, literals_or_bindings, FixedArray, kLiteralsOffset) 34193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSFunction, 34203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch next_function_link, 34213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object, 34223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kNextFunctionLinkOffset) 3423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset) 3425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset) 3426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(GlobalObject, global_receiver, JSObject, kGlobalReceiverOffset) 3427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3428a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSGlobalProxy, context, Object, kContextOffset) 3429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, getter, Object, kGetterOffset) 3431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, setter, Object, kSetterOffset) 3432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, data, Object, kDataOffset) 3433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessorInfo, name, Object, kNameOffset) 34343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(AccessorInfo, flag, kFlagOffset) 34353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34363ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(AccessorPair, getter, Object, kGetterOffset) 34373ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(AccessorPair, setter, Object, kSetterOffset) 3438c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 3439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, named_callback, Object, kNamedCallbackOffset) 3440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, indexed_callback, Object, kIndexedCallbackOffset) 3441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(AccessCheckInfo, data, Object, kDataOffset) 3442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, getter, Object, kGetterOffset) 3444a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, setter, Object, kSetterOffset) 3445a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, query, Object, kQueryOffset) 3446a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset) 3447a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset) 3448a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(InterceptorInfo, data, Object, kDataOffset) 3449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset) 3451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(CallHandlerInfo, data, Object, kDataOffset) 3452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, tag, Object, kTagOffset) 3454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset) 3455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, serial_number, Object, kSerialNumberOffset) 3457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset) 3458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, property_accessors, Object, 3459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPropertyAccessorsOffset) 3460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, prototype_template, Object, 3461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPrototypeTemplateOffset) 3462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset) 3463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, named_property_handler, Object, 3464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kNamedPropertyHandlerOffset) 3465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object, 3466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIndexedPropertyHandlerOffset) 3467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_template, Object, 3468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceTemplateOffset) 3469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset) 3470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset) 3471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, instance_call_handler, Object, 3472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceCallHandlerOffset) 3473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(FunctionTemplateInfo, access_check_info, Object, 3474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kAccessCheckInfoOffset) 34753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(FunctionTemplateInfo, flag, kFlagOffset) 3476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3477a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset) 3478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(ObjectTemplateInfo, internal_field_count, Object, 3479a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInternalFieldCountOffset) 3480a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3481a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset) 3482a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SignatureInfo, args, Object, kArgsOffset) 3483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(TypeSwitchInfo, types, Object, kTypesOffset) 3485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, source, Object, kSourceOffset) 3487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, name, Object, kNameOffset) 3488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, id, Object, kIdOffset) 34893ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, line_offset, kLineOffsetOffset) 34903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, column_offset, kColumnOffsetOffset) 3491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, data, Object, kDataOffset) 3492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, context_data, Object, kContextOffset) 3493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochACCESSORS(Script, wrapper, Foreign, kWrapperOffset) 34943ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, type, kTypeOffset) 34953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, compilation_type, kCompilationTypeOffset) 34963ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, compilation_state, kCompilationStateOffset) 3497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(Script, line_ends, Object, kLineEndsOffset) 3498d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockACCESSORS(Script, eval_from_shared, Object, kEvalFromSharedOffset) 34993ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(Script, eval_from_instructions_offset, 35003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kEvalFrominstructionsOffsetOffset) 3501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifdef ENABLE_DEBUGGER_SUPPORT 3503a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex) 3504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex) 3505a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, code, Code, kPatchedCodeIndex) 3506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex) 3507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(BreakPointInfo, code_position, kCodePositionIndex) 35093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(BreakPointInfo, source_position, kSourcePositionIndex) 35103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS_TO_SMI(BreakPointInfo, statement_position, kStatementPositionIndex) 3511a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex) 3512a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif 3513a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, name, Object, kNameOffset) 35153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset) 35163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(SharedFunctionInfo, initial_map, Object, kInitialMapOffset) 3517a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, instance_class_name, Object, 3518a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kInstanceClassNameOffset) 35196ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset) 3520a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset) 3521a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset) 3522a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset) 3523a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(SharedFunctionInfo, this_property_assignments, Object, 3524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kThisPropertyAssignmentsOffset) 35258f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben MurdochSMI_ACCESSORS(SharedFunctionInfo, ic_age, kICAgeOffset) 3526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 35273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3528a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype, 3529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kHiddenPrototypeBit) 3530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit) 3531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check, 3532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kNeedsAccessCheckBit) 353369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochBOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype, 353469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch kReadOnlyPrototypeBit) 3535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression, 3536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIsExpressionBit) 3537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockBOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel, 3538a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kIsTopLevelBit) 35393fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_GETTER(SharedFunctionInfo, 35403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch compiler_hints, 3541a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block has_only_simple_this_property_assignments, 3542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kHasOnlySimpleThisPropertyAssignments) 3543d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockBOOL_ACCESSORS(SharedFunctionInfo, 3544d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block compiler_hints, 35457f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch allows_lazy_compilation, 35467f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch kAllowLazyCompilation) 35473fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, 35483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch compiler_hints, 35493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch uses_arguments, 35503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kUsesArguments) 35513fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, 35523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch compiler_hints, 35533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch has_duplicate_parameters, 35543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kHasDuplicateParameters) 3555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3556756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 35577f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#if V8_HOST_ARCH_32_BIT 35587f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset) 35597f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count, 3560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kFormalParameterCountOffset) 35617f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties, 3562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kExpectedNofPropertiesOffset) 35637f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset) 35647f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, start_position_and_type, 3565a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kStartPositionAndTypeOffset) 35667f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset) 35677f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, function_token_position, 3568a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kFunctionTokenPositionOffset) 35697f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, compiler_hints, 3570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kCompilerHintsOffset) 35717f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochSMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count, 3572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kThisPropertyAssignmentsCountOffset) 3573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochSMI_ACCESSORS(SharedFunctionInfo, opt_count, kOptCountOffset) 35743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset) 35753ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(SharedFunctionInfo, deopt_counter, kDeoptCounterOffset) 35767f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#else 35777f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 35787f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \ 35793e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu STATIC_ASSERT(holder::offset % kPointerSize == 0); \ 35807f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch int holder::name() { \ 35817f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch int value = READ_INT_FIELD(this, offset); \ 35827f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(kHeapObjectTag == 1); \ 35837f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT((value & kHeapObjectTag) == 0); \ 35847f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return value >> 1; \ 35857f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } \ 35867f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch void holder::set_##name(int value) { \ 35877f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT(kHeapObjectTag == 1); \ 35887f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch ASSERT((value & 0xC0000000) == 0xC0000000 || \ 35897f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch (value & 0xC0000000) == 0x000000000); \ 35907f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch WRITE_INT_FIELD(this, \ 35917f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch offset, \ 35927f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch (value << 1) & ~kHeapObjectTag); \ 35937f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } 35947f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 35953e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \ 35963e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu STATIC_ASSERT(holder::offset % kPointerSize == kIntSize); \ 35977f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch INT_ACCESSORS(holder, name, offset) 35987f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 35997f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 36007f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset) 36013e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, 36023e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu formal_parameter_count, 36033e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu kFormalParameterCountOffset) 36047f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 36053e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, 36063e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu expected_nof_properties, 36073e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu kExpectedNofPropertiesOffset) 36087f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset) 36097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 36103e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, end_position, kEndPositionOffset) 36113e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, 36123e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu start_position_and_type, 36133e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu kStartPositionAndTypeOffset) 36143e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 36153e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, 36163e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu function_token_position, 36173e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu kFunctionTokenPositionOffset) 36183e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, 36193e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu compiler_hints, 36203e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu kCompilerHintsOffset) 36213e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu 36223e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui ZhuPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, 36233e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu this_property_assignments_count, 36243e5fa29ddb82551500b118e9bf37af3966277b70Teng-Hui Zhu kThisPropertyAssignmentsCountOffset) 3625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, opt_count, kOptCountOffset) 36263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36273ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset) 36283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochPSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, deopt_counter, kDeoptCounterOffset) 36297f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch#endif 3630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 36310d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36320d5e116f6aee03185f237311a943491bb079a768Kristian Monsenint SharedFunctionInfo::construction_count() { 36330d5e116f6aee03185f237311a943491bb079a768Kristian Monsen return READ_BYTE_FIELD(this, kConstructionCountOffset); 36340d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 36350d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36360d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36370d5e116f6aee03185f237311a943491bb079a768Kristian Monsenvoid SharedFunctionInfo::set_construction_count(int value) { 36380d5e116f6aee03185f237311a943491bb079a768Kristian Monsen ASSERT(0 <= value && value < 256); 36390d5e116f6aee03185f237311a943491bb079a768Kristian Monsen WRITE_BYTE_FIELD(this, kConstructionCountOffset, static_cast<byte>(value)); 36400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 36410d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36433fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, 36443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch compiler_hints, 36453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch live_objects_may_exist, 36463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kLiveObjectsMayExist) 36470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36490d5e116f6aee03185f237311a943491bb079a768Kristian Monsenbool SharedFunctionInfo::IsInobjectSlackTrackingInProgress() { 36503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return initial_map() != GetHeap()->undefined_value(); 36510d5e116f6aee03185f237311a943491bb079a768Kristian Monsen} 36520d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36530d5e116f6aee03185f237311a943491bb079a768Kristian Monsen 36543fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_GETTER(SharedFunctionInfo, 36553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch compiler_hints, 36563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch optimization_disabled, 36573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kOptimizationDisabled) 3658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid SharedFunctionInfo::set_optimization_disabled(bool disable) { 3661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_compiler_hints(BooleanBit::set(compiler_hints(), 3662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kOptimizationDisabled, 3663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch disable)); 3664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If disabling optimizations we reflect that in the code object so 3665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it will not be counted as optimizable code. 3666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if ((code()->kind() == Code::FUNCTION) && disable) { 3667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch code()->set_optimizable(false); 3668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 36723ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochLanguageMode SharedFunctionInfo::language_mode() { 36733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int hints = compiler_hints(); 36743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (BooleanBit::get(hints, kExtendedModeFunction)) { 36753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(BooleanBit::get(hints, kStrictModeFunction)); 36763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return EXTENDED_MODE; 36773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 36783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return BooleanBit::get(hints, kStrictModeFunction) 36793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? STRICT_MODE : CLASSIC_MODE; 36803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 36813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid SharedFunctionInfo::set_language_mode(LanguageMode language_mode) { 36843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We only allow language mode transitions that go set the same language mode 36853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // again or go up in the chain: 36863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // CLASSIC_MODE -> STRICT_MODE -> EXTENDED_MODE. 36873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(this->language_mode() == CLASSIC_MODE || 36883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch this->language_mode() == language_mode || 36893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch language_mode == EXTENDED_MODE); 36903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int hints = compiler_hints(); 36913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hints = BooleanBit::set( 36923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hints, kStrictModeFunction, language_mode != CLASSIC_MODE); 36933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hints = BooleanBit::set( 36943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch hints, kExtendedModeFunction, language_mode == EXTENDED_MODE); 36953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_compiler_hints(hints); 36963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 36973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool SharedFunctionInfo::is_classic_mode() { 37003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return !BooleanBit::get(compiler_hints(), kStrictModeFunction); 37013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 37023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 37033ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBOOL_GETTER(SharedFunctionInfo, compiler_hints, is_extended_mode, 37043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kExtendedModeFunction) 37053fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative) 37063fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, 37073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch name_should_print_as_anonymous, 37083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kNameShouldPrintAsAnonymous) 37093fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, bound, kBoundFunction) 37103fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_anonymous, kIsAnonymous) 37113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_function, kIsFunction) 37123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_optimize, 37133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kDontOptimize) 37143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochBOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_inline, kDontInline) 3715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 37166ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset) 37176ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset) 37186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 37193fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochACCESSORS(PolymorphicCodeCache, cache, Object, kCacheOffset) 37203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 37213ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool Script::HasValidSource() { 37223ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block Object* src = this->source(); 37233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (!src->IsString()) return true; 37243ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block String* src_str = String::cast(src); 37253ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (!StringShape(src_str).IsExternal()) return true; 37263ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block if (src_str->IsAsciiRepresentation()) { 37273ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ExternalAsciiString::cast(src)->resource() != NULL; 37283ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } else if (src_str->IsTwoByteRepresentation()) { 37293ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return ExternalTwoByteString::cast(src)->resource() != NULL; 37303ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block } 37313ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block return true; 37323ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 37333ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 37343ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 3735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::DontAdaptArguments() { 3736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(code()->kind() == Code::BUILTIN); 3737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_formal_parameter_count(kDontAdaptArgumentsSentinel); 3738a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3739a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3740a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint SharedFunctionInfo::start_position() { 3742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return start_position_and_type() >> kStartPositionShift; 3743a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3744a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3745a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3746a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_start_position(int start_position) { 3747a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_start_position_and_type((start_position << kStartPositionShift) 3748a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block | (start_position_and_type() & ~kStartPositionMask)); 3749a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3750a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3751a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* SharedFunctionInfo::code() { 3753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Code::cast(READ_FIELD(this, kCodeOffset)); 3754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3755a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3756a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3757756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickCode* SharedFunctionInfo::unchecked_code() { 3758756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset)); 3759756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3760756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3761756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3762a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) { 3763a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kCodeOffset, value); 37643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode); 3765a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3766a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3767a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochScopeInfo* SharedFunctionInfo::scope_info() { 37693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset)); 37703bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch} 37713bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 37723bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 37733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid SharedFunctionInfo::set_scope_info(ScopeInfo* value, 37743bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch WriteBarrierMode mode) { 37753bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value)); 37763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CONDITIONAL_WRITE_BARRIER(GetHeap(), 37773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch this, 37783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kScopeInfoOffset, 37793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<Object*>(value), 37803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mode); 37813bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch} 37823bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 37833bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch 3784a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool SharedFunctionInfo::is_compiled() { 378544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return code() != 378644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate::Current()->builtins()->builtin(Builtins::kLazyCompile); 3787a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3788a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3789a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 37906ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool SharedFunctionInfo::IsApiFunction() { 37916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return function_data()->IsFunctionTemplateInfo(); 37926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 37936ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 37946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 37956ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockFunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() { 37966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block ASSERT(IsApiFunction()); 37976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return FunctionTemplateInfo::cast(function_data()); 37986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 37996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 38006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 3801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool SharedFunctionInfo::HasBuiltinFunctionId() { 380225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen return function_data()->IsSmi(); 380325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen} 380425f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 380525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen 3806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochBuiltinFunctionId SharedFunctionInfo::builtin_function_id() { 3807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasBuiltinFunctionId()); 3808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value()); 3809a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3812756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint SharedFunctionInfo::code_age() { 3813756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask; 3814756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3815756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3816756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3817756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid SharedFunctionInfo::set_code_age(int code_age) { 38183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int hints = compiler_hints() & ~(kCodeAgeMask << kCodeAgeShift); 38193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_compiler_hints(hints | ((code_age & kCodeAgeMask) << kCodeAgeShift)); 3820756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3821756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3822756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool SharedFunctionInfo::has_deoptimization_support() { 3824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Code* code = this->code(); 3825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return code->kind() == Code::FUNCTION && code->has_deoptimization_support(); 3826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3829a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::IsBuiltin() { 3830a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return context()->global()->IsJSBuiltinsObject(); 3831a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3832a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool JSFunction::NeedsArgumentsAdaption() { 3835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return shared()->formal_parameter_count() != 3836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SharedFunctionInfo::kDontAdaptArgumentsSentinel; 3837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool JSFunction::IsOptimized() { 3841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return code()->kind() == Code::OPTIMIZED_FUNCTION; 3842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 38458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochbool JSFunction::IsOptimizable() { 38468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return code()->kind() == Code::FUNCTION && code()->optimizable(); 38478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 38488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 38498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool JSFunction::IsMarkedForLazyRecompilation() { 385144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return code() == GetIsolate()->builtins()->builtin(Builtins::kLazyRecompile); 3852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockCode* JSFunction::code() { 3856791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return Code::cast(unchecked_code()); 3857756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3858756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3859756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3860756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickCode* JSFunction::unchecked_code() { 3861791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block return reinterpret_cast<Code*>( 3862791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset))); 3863a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3864a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_code(Code* value) { 386744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->InNewSpace(value)); 3868791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block Address entry = value->entry(); 3869791712a13f1814dd3ab5d1a5ab8ff5dbc476f6d6Steve Block WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry)); 38703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GetHeap()->incremental_marking()->RecordWriteOfCodeEntry( 38713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch this, 38723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HeapObject::RawField(this, kCodeEntryOffset), 38733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch value); 3874a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3875a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3876a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid JSFunction::ReplaceCode(Code* code) { 3878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool was_optimized = IsOptimized(); 3879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION; 3880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_code(code); 3882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Add/remove the function from the list of optimized functions for this 3884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // context based on the state change. 3885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!was_optimized && is_optimized) { 3886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch context()->global_context()->AddOptimizedFunction(this); 3887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (was_optimized && !is_optimized) { 3889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch context()->global_context()->RemoveOptimizedFunction(this); 3890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 3892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3894a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockContext* JSFunction::context() { 3895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Context::cast(READ_FIELD(this, kContextOffset)); 3896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3897a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3898a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3899a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::unchecked_context() { 3900a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return READ_FIELD(this, kContextOffset); 3901a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3902a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3903a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3904756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain MerrickSharedFunctionInfo* JSFunction::unchecked_shared() { 3905756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return reinterpret_cast<SharedFunctionInfo*>( 3906756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick READ_FIELD(this, kSharedFunctionInfoOffset)); 3907756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 3908756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3909756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 3910a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_context(Object* value) { 391144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(value->IsUndefined() || value->IsContext()); 3912a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block WRITE_FIELD(this, kContextOffset, value); 39133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_BARRIER(GetHeap(), this, kContextOffset, value); 3914a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3915a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3916a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSFunction, prototype_or_initial_map, Object, 3917a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block kPrototypeOrInitialMapOffset) 3918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3920a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockMap* JSFunction::initial_map() { 3921a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Map::cast(prototype_or_initial_map()); 3922a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3923a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSFunction::set_initial_map(Map* value) { 3926a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_prototype_or_initial_map(value); 3927a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3928a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3929a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39303ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSFunction::set_initial_map_and_cache_transitions( 39313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Map* initial_map) { 39323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Context* global_context = context()->global_context(); 39333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* array_function = 39343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch global_context->get(Context::ARRAY_FUNCTION_INDEX); 39353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (array_function->IsJSFunction() && 39363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch this == JSFunction::cast(array_function)) { 39373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(initial_map->elements_kind() == FAST_SMI_ONLY_ELEMENTS); 39383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 39393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MaybeObject* maybe_map = initial_map->CopyDropTransitions(); 39403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Map* new_double_map = NULL; 39413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!maybe_map->To<Map>(&new_double_map)) return maybe_map; 39423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new_double_map->set_elements_kind(FAST_DOUBLE_ELEMENTS); 39433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch maybe_map = initial_map->AddElementsTransition(FAST_DOUBLE_ELEMENTS, 39443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new_double_map); 39453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (maybe_map->IsFailure()) return maybe_map; 39463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 39473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch maybe_map = new_double_map->CopyDropTransitions(); 39483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Map* new_object_map = NULL; 39493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!maybe_map->To<Map>(&new_object_map)) return maybe_map; 39503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new_object_map->set_elements_kind(FAST_ELEMENTS); 39513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch maybe_map = new_double_map->AddElementsTransition(FAST_ELEMENTS, 39523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch new_object_map); 39533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (maybe_map->IsFailure()) return maybe_map; 39543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 39553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch global_context->set_smi_js_array_map(initial_map); 39563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch global_context->set_double_js_array_map(new_double_map); 39573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch global_context->set_object_js_array_map(new_object_map); 39583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 39593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_initial_map(initial_map); 39603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 39613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 39623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 39633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_initial_map() { 3965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return prototype_or_initial_map()->IsMap(); 3966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3968a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3969a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_instance_prototype() { 3970a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return has_initial_map() || !prototype_or_initial_map()->IsTheHole(); 3971a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3972a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3973a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3974a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::has_prototype() { 3975a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map()->has_non_instance_prototype() || has_instance_prototype(); 3976a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3978a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3979a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::instance_prototype() { 3980a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(has_instance_prototype()); 3981a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (has_initial_map()) return initial_map()->prototype(); 3982a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // When there is no initial map and the prototype is a JSObject, the 3983a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // initial map field is used for the prototype field. 3984a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return prototype_or_initial_map(); 3985a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3986a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3987a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 3988a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSFunction::prototype() { 3989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(has_prototype()); 3990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // If the function's prototype property has been set to a non-JSObject 3991a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // value, that value is stored in the constructor field of the map. 3992a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (map()->has_non_instance_prototype()) return map()->constructor(); 3993a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return instance_prototype(); 3994a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 3995a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 39966ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockbool JSFunction::should_have_prototype() { 39976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return map()->function_with_prototype(); 39986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 39996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 4000a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4001a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSFunction::is_compiled() { 400244f0eee88ff00398ff7f715fab053374d808c90dSteve Block return code() != GetIsolate()->builtins()->builtin(Builtins::kLazyCompile); 4003a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4004a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4005a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 40063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFixedArray* JSFunction::literals() { 40073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!shared()->bound()); 40083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return literals_or_bindings(); 40093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 40103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 40113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 40123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSFunction::set_literals(FixedArray* literals) { 40133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!shared()->bound()); 40143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_literals_or_bindings(literals); 40153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 40163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 40173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 40183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochFixedArray* JSFunction::function_bindings() { 40193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(shared()->bound()); 40203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return literals_or_bindings(); 40213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 40223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 40233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 40243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid JSFunction::set_function_bindings(FixedArray* bindings) { 40253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(shared()->bound()); 40263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Bound function literal may be initialized to the empty fixed array 40273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // before the bindings are set. 40283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(bindings == GetHeap()->empty_fixed_array() || 40293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bindings->map() == GetHeap()->fixed_cow_array_map()); 40303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_literals_or_bindings(bindings); 40313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 40323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 40333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4034a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSFunction::NumberOfLiterals() { 40353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!shared()->bound()); 4036a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return literals()->length(); 4037a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4038a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4039a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4040a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) { 4041b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(id < kJSBuiltinsCount); // id is unsigned. 40426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return READ_FIELD(this, OffsetOfFunctionWithId(id)); 4043a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4044a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id, 4047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value) { 4048b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(id < kJSBuiltinsCount); // id is unsigned. 40496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block WRITE_FIELD(this, OffsetOfFunctionWithId(id), value); 40503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value); 40516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 40526ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 40536ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 40546ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockCode* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) { 4055b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(id < kJSBuiltinsCount); // id is unsigned. 40566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id))); 40576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 40586ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 40596ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 40606ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockvoid JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id, 40616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block Code* value) { 4062b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch ASSERT(id < kJSBuiltinsCount); // id is unsigned. 40636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block WRITE_FIELD(this, OffsetOfCodeWithId(id), value); 406444f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->InNewSpace(value)); 4065a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4066a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4068257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochACCESSORS(JSProxy, handler, Object, kHandlerOffset) 40693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSProxy, hash, Object, kHashOffset) 4070589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochACCESSORS(JSFunctionProxy, call_trap, Object, kCallTrapOffset) 4071589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset) 4072589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 4073589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 4074589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid JSProxy::InitializeBody(int object_size, Object* value) { 4075589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ASSERT(!value->IsHeapObject() || !GetHeap()->InNewSpace(value)); 4076589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { 4077589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch WRITE_FIELD(this, offset, value); 4078589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 4079589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch} 4080257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4081257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 40823ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSSet, table, Object, kTableOffset) 40833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSMap, table, Object, kTableOffset) 40843ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSWeakMap, table, Object, kTableOffset) 40853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSWeakMap, next, Object, kNextOffset) 408669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 408769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 40883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochAddress Foreign::foreign_address() { 40893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return AddressFrom<Address>(READ_INTPTR_FIELD(this, kForeignAddressOffset)); 409069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 409169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 409269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 40933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid Foreign::set_foreign_address(Address value) { 40943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch WRITE_INTPTR_FIELD(this, kForeignAddressOffset, OffsetFrom(value)); 4095a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4096a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4097a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4098a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSValue, value, Object, kValueOffset) 4099a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSValue* JSValue::cast(Object* obj) { 4102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(obj->IsJSValue()); 4103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize); 4104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return reinterpret_cast<JSValue*>(obj); 4105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 41083ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, value, Object, kValueOffset) 41093ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset) 41103ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, year, Object, kYearOffset) 41113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, month, Object, kMonthOffset) 41123ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, day, Object, kDayOffset) 41133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, weekday, Object, kWeekdayOffset) 41143ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, hour, Object, kHourOffset) 41153ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, min, Object, kMinOffset) 41163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(JSDate, sec, Object, kSecOffset) 41173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 41183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 41193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochJSDate* JSDate::cast(Object* obj) { 41203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(obj->IsJSDate()); 41213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(HeapObject::cast(obj)->Size() == JSDate::kSize); 41223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return reinterpret_cast<JSDate*>(obj); 41233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 41243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 41253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 41261e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, type, String, kTypeOffset) 41271e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset) 41281e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, script, Object, kScriptOffset) 41291e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset) 41301e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset) 41311e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockSMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset) 41321e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockSMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset) 41331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 41341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 41351e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockJSMessageObject* JSMessageObject::cast(Object* obj) { 41361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(obj->IsJSMessageObject()); 41371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize); 41381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return reinterpret_cast<JSMessageObject*>(obj); 41391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 41401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 41411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockINT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset) 4143ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon ClarkeACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset) 41443ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset) 4145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset) 41463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(Code, type_feedback_info, Object, kTypeFeedbackInfoOffset) 41473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset) 41483ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochINT_ACCESSORS(Code, ic_age, kICAgeOffset) 4149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::instruction_start() { 4151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FIELD_ADDR(this, kHeaderSize); 4152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4155ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarkebyte* Code::instruction_end() { 4156ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return instruction_start() + instruction_size(); 4157ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke} 4158ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 4159ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 4160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint Code::body_size() { 4161ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return RoundUp(instruction_size(), kObjectAlignment); 4162ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke} 4163ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 4164ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 4165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochFixedArray* Code::unchecked_deoptimization_data() { 4166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<FixedArray*>( 4167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch READ_FIELD(this, kDeoptimizationDataOffset)); 4168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 4169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4171ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon ClarkeByteArray* Code::unchecked_relocation_info() { 4172ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset)); 4173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::relocation_start() { 4177ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return unchecked_relocation_info()->GetDataStartAddress(); 4178ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke} 4179ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 4180ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 4181ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarkeint Code::relocation_size() { 4182ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke return unchecked_relocation_info()->length(); 4183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbyte* Code::entry() { 4187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return instruction_start(); 4188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 41913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool Code::contains(byte* inner_pointer) { 41923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return (address() <= inner_pointer) && (inner_pointer <= address() + Size()); 4193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSArray, length, Object, kLengthOffset) 4197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockACCESSORS(JSRegExp, data, Object, kDataOffset) 4200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Type JSRegExp::TypeTag() { 4203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* data = this->data(); 4204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (data->IsUndefined()) return JSRegExp::NOT_COMPILED; 4205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex)); 4206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return static_cast<JSRegExp::Type>(smi->value()); 4207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochJSRegExp::Type JSRegExp::TypeTagUnchecked() { 4211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Smi* smi = Smi::cast(DataAtUnchecked(kTagIndex)); 4212257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return static_cast<JSRegExp::Type>(smi->value()); 4213257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 4214257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4215257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockint JSRegExp::CaptureCount() { 4217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block switch (TypeTag()) { 4218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case ATOM: 4219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return 0; 4220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block case IRREGEXP: 4221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value(); 4222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block default: 4223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block UNREACHABLE(); 4224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return -1; 4225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockJSRegExp::Flags JSRegExp::GetFlags() { 4230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(this->data()->IsFixedArray()); 4231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* data = this->data(); 4232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex)); 4233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return Flags(smi->value()); 4234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockString* JSRegExp::Pattern() { 4238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(this->data()->IsFixedArray()); 4239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* data = this->data(); 4240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex)); 4241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return pattern; 4242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4244a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4245a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockObject* JSRegExp::DataAt(int index) { 4246a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(TypeTag() != NOT_COMPILED); 4247a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return FixedArray::cast(data())->get(index); 4248a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4249a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4250a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochObject* JSRegExp::DataAtUnchecked(int index) { 4252257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch FixedArray* fa = reinterpret_cast<FixedArray*>(data()); 4253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int offset = FixedArray::kHeaderSize + index * kPointerSize; 4254257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return READ_FIELD(fa, offset); 4255257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 4256257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4257257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSRegExp::SetDataAt(int index, Object* value) { 4259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(TypeTag() != NOT_COMPILED); 4260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(index >= kDataIndex); // Only implementation data can be set this way. 4261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray::cast(data())->set(index, value); 4262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4265257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid JSRegExp::SetDataAtUnchecked(int index, Object* value, Heap* heap) { 4266257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(index >= kDataIndex); // Only implementation data can be set this way. 4267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch FixedArray* fa = reinterpret_cast<FixedArray*>(data()); 4268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (value->IsSmi()) { 4269257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch fa->set_unchecked(index, Smi::cast(value)); 4270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 42713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // We only do this during GC, so we don't need to notify the write barrier. 4272257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch fa->set_unchecked(heap, index, value, SKIP_WRITE_BARRIER); 4273257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 4275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4277589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben MurdochElementsKind JSObject::GetElementsKind() { 42783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ElementsKind kind = map()->elements_kind(); 42793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#if DEBUG 42803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedArrayBase* fixed_array = 42813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset)); 42823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Map* map = fixed_array->map(); 42833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(((kind == FAST_ELEMENTS || kind == FAST_SMI_ONLY_ELEMENTS) && 42843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (map == GetHeap()->fixed_array_map() || 42853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map == GetHeap()->fixed_cow_array_map())) || 42863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (kind == FAST_DOUBLE_ELEMENTS && 42873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (fixed_array->IsFixedDoubleArray() || 42883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fixed_array == GetHeap()->empty_fixed_array())) || 42893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (kind == DICTIONARY_ELEMENTS && 42903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fixed_array->IsFixedArray() && 42913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch fixed_array->IsDictionary()) || 42923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (kind > DICTIONARY_ELEMENTS)); 42933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT((kind != NON_STRICT_ARGUMENTS_ELEMENTS) || 42943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (elements()->IsFixedArray() && elements()->length() >= 2)); 42953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 42963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return kind; 4297a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4298a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4299a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 430069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen MurdochElementsAccessor* JSObject::GetElementsAccessor() { 430169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return ElementsAccessor::ForKind(GetElementsKind()); 430269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 430369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 430469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 4305a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasFastElements() { 4306a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetElementsKind() == FAST_ELEMENTS; 4307a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4308a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4309a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 43103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSObject::HasFastSmiOnlyElements() { 43113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetElementsKind() == FAST_SMI_ONLY_ELEMENTS; 43123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 43133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSObject::HasFastTypeElements() { 43163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind elements_kind = GetElementsKind(); 43173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind == FAST_SMI_ONLY_ELEMENTS || 43183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch elements_kind == FAST_ELEMENTS; 43193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 43203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool JSObject::HasFastDoubleElements() { 43233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return GetElementsKind() == FAST_DOUBLE_ELEMENTS; 43243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 43253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 43263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4327a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasDictionaryElements() { 4328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetElementsKind() == DICTIONARY_ELEMENTS; 4329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4330a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4331a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 43323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSObject::HasNonStrictArgumentsElements() { 43333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS; 43343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 43353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43373ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Blockbool JSObject::HasExternalArrayElements() { 433844f0eee88ff00398ff7f715fab053374d808c90dSteve Block HeapObject* array = elements(); 433944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(array != NULL); 434044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return array->IsExternalArray(); 43413ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 43423ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 43433ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 434444f0eee88ff00398ff7f715fab053374d808c90dSteve Block#define EXTERNAL_ELEMENTS_CHECK(name, type) \ 434544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool JSObject::HasExternal##name##Elements() { \ 434644f0eee88ff00398ff7f715fab053374d808c90dSteve Block HeapObject* array = elements(); \ 434744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(array != NULL); \ 434844f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!array->IsHeapObject()) \ 434944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; \ 435044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return array->map()->instance_type() == type; \ 43513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 43523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 43533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 435444f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE) 435544f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) 435644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE) 435744f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(UnsignedShort, 435844f0eee88ff00398ff7f715fab053374d808c90dSteve Block EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) 435944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE) 436044f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(UnsignedInt, 436144f0eee88ff00398ff7f715fab053374d808c90dSteve Block EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) 436244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Float, 436344f0eee88ff00398ff7f715fab053374d808c90dSteve Block EXTERNAL_FLOAT_ARRAY_TYPE) 4364257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochEXTERNAL_ELEMENTS_CHECK(Double, 4365257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch EXTERNAL_DOUBLE_ARRAY_TYPE) 436644f0eee88ff00398ff7f715fab053374d808c90dSteve BlockEXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE) 43673ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 43683ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 4369a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasNamedInterceptor() { 4370a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map()->has_named_interceptor(); 4371a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4372a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4373a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4374a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool JSObject::HasIndexedInterceptor() { 4375a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return map()->has_indexed_interceptor(); 4376a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4377a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4378a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 43795913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* JSObject::EnsureWritableFastElements() { 43803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(HasFastTypeElements()); 4381756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick FixedArray* elems = FixedArray::cast(elements()); 438244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate* isolate = GetIsolate(); 438344f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems; 43845913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck Object* writable_elems; 438544f0eee88ff00398ff7f715fab053374d808c90dSteve Block { MaybeObject* maybe_writable_elems = isolate->heap()->CopyFixedArrayWithMap( 438644f0eee88ff00398ff7f715fab053374d808c90dSteve Block elems, isolate->heap()->fixed_array_map()); 43875913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck if (!maybe_writable_elems->ToObject(&writable_elems)) { 43885913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck return maybe_writable_elems; 43895913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck } 43905913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck } 4391756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick set_elements(FixedArray::cast(writable_elems)); 439244f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->counters()->cow_arrays_converted()->Increment(); 4393756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return writable_elems; 4394756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4395756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4396756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4397a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockStringDictionary* JSObject::property_dictionary() { 4398a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!HasFastProperties()); 4399a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return StringDictionary::cast(properties()); 4400a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4403c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochSeededNumberDictionary* JSObject::element_dictionary() { 4404a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(HasDictionaryElements()); 4405c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return SeededNumberDictionary::cast(elements()); 4406a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4407a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4408a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 44097f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdochbool String::IsHashFieldComputed(uint32_t field) { 44107f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return (field & kHashNotComputedMask) == 0; 44117f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch} 44127f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 44137f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch 4414a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::HasHashCode() { 44157f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return IsHashFieldComputed(hash_field()); 4416a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4417a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4418a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4419a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t String::Hash() { 4420a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Fast case: has hash code already been computed? 4421d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block uint32_t field = hash_field(); 44227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch if (IsHashFieldComputed(field)) return field >> kHashShift; 4423a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Slow case: compute hash code and set it. 4424a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return ComputeAndSetHash(); 4425a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4426a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4427a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4428c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben MurdochStringHasher::StringHasher(int length, uint32_t seed) 4429a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block : length_(length), 4430c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch raw_running_hash_(seed), 4431a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block array_index_(0), 4432a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize), 4433a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_first_char_(true), 4434c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch is_valid_(true) { 4435c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch ASSERT(FLAG_randomize_hashes || raw_running_hash_ == 0); 4436c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 4437a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4438a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool StringHasher::has_trivial_hash() { 4440d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return length_ > String::kMaxHashCalcLength; 4441a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4442a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4443a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 44443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid StringHasher::AddCharacter(uint32_t c) { 44453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) { 44463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AddSurrogatePair(c); // Not inlined. 44473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return; 44483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4449a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Use the Jenkins one-at-a-time hash function to update the hash 4450a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // for the given character. 4451a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ += c; 4452a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ += (raw_running_hash_ << 10); 4453a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ ^= (raw_running_hash_ >> 6); 4454a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Incremental array index computation. 4455a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_array_index_) { 4456a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (c < '0' || c > '9') { 4457a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_array_index_ = false; 4458a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 4459a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int d = c - '0'; 4460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (is_first_char_) { 4461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_first_char_ = false; 4462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (c == '0' && length_ > 1) { 4463a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_array_index_ = false; 4464a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return; 4465a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4466a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4467a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (array_index_ > 429496729U - ((d + 2) >> 3)) { 4468a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block is_array_index_ = false; 4469a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 4470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block array_index_ = array_index_ * 10 + d; 4471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4473a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4474a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4475a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4476a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 44773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid StringHasher::AddCharacterNoIndex(uint32_t c) { 4478a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!is_array_index()); 44793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) { 44803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch AddSurrogatePairNoIndex(c); // Not inlined. 44813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return; 44823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4483a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ += c; 4484a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ += (raw_running_hash_ << 10); 4485a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block raw_running_hash_ ^= (raw_running_hash_ >> 6); 4486a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4487a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4488a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4489a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockuint32_t StringHasher::GetHash() { 4490a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Get the calculated raw hash value and do some more bit ops to distribute 4491a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // the hash further. Ensure that we never return zero as the hash value. 4492a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block uint32_t result = raw_running_hash_; 4493a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result += (result << 3); 4494a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result ^= (result >> 11); 4495a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result += (result << 15); 4496c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch if ((result & String::kHashBitMask) == 0) { 4497a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block result = 27; 4498a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 4499a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return result; 4500a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4502a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 450344f0eee88ff00398ff7f715fab053374d808c90dSteve Blocktemplate <typename schar> 4504c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t HashSequentialString(const schar* chars, int length, uint32_t seed) { 4505c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch StringHasher hasher(length, seed); 450644f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!hasher.has_trivial_hash()) { 450744f0eee88ff00398ff7f715fab053374d808c90dSteve Block int i; 450844f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (i = 0; hasher.is_array_index() && (i < length); i++) { 450944f0eee88ff00398ff7f715fab053374d808c90dSteve Block hasher.AddCharacter(chars[i]); 451044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 451144f0eee88ff00398ff7f715fab053374d808c90dSteve Block for (; i < length; i++) { 451244f0eee88ff00398ff7f715fab053374d808c90dSteve Block hasher.AddCharacterNoIndex(chars[i]); 451344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 451444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 451544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return hasher.GetHashField(); 451644f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 451744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 451844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4519a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool String::AsArrayIndex(uint32_t* index) { 4520d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block uint32_t field = hash_field(); 45217f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) { 45227f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch return false; 45237f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch } 4524a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return SlowAsArrayIndex(index); 4525a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4526a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4527a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 45283fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochObject* JSReceiver::GetPrototype() { 45293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return HeapObject::cast(this)->map()->prototype(); 45303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 45313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 45323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 45333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool JSReceiver::HasProperty(String* name) { 45343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (IsJSProxy()) { 45353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return JSProxy::cast(this)->HasPropertyWithHandler(name); 45363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 45373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return GetPropertyAttribute(name) != ABSENT; 45383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 45393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 45403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 45413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochbool JSReceiver::HasLocalProperty(String* name) { 45423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (IsJSProxy()) { 45433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return JSProxy::cast(this)->HasPropertyWithHandler(name); 45443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 45453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return GetLocalPropertyAttribute(name) != ABSENT; 4546a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 45493fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochPropertyAttributes JSReceiver::GetPropertyAttribute(String* key) { 4550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return GetPropertyAttributeWithReceiver(this, key); 4551a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4553d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// TODO(504): this may be useful in other places too where JSGlobalProxy 4554d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block// is used. 4555d0582a6c46733687d045e4188a1bcd0123c758a1Steve BlockObject* JSObject::BypassGlobalProxy() { 4556d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (IsJSGlobalProxy()) { 4557d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Object* proto = GetPrototype(); 455844f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (proto->IsNull()) return GetHeap()->undefined_value(); 4559d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block ASSERT(proto->IsJSGlobalObject()); 4560d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return proto; 4561d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 4562d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block return this; 4563d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block} 4564d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 4565d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block 45663ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSReceiver::GetIdentityHash(CreationFlag flag) { 45673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return IsJSProxy() 45683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ? JSProxy::cast(this)->GetIdentityHash(flag) 45693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : JSObject::cast(this)->GetIdentityHash(flag); 457085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch} 457185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 457285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 45733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSReceiver::HasElement(uint32_t index) { 45743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (IsJSProxy()) { 45753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return JSProxy::cast(this)->HasElementWithHandler(index); 45763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 45773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return JSObject::cast(this)->HasElementWithReceiver(this, index); 4578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4579a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_read() { 4582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(flag(), kAllCanReadBit); 4583a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4584a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_read(bool value) { 4587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_flag(BooleanBit::set(flag(), kAllCanReadBit, value)); 4588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4590a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4591a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::all_can_write() { 4592a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(flag(), kAllCanWriteBit); 4593a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4594a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4595a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_all_can_write(bool value) { 4597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value)); 4598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4600a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4601a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool AccessorInfo::prohibits_overwriting() { 4602a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return BooleanBit::get(flag(), kProhibitsOverwritingBit); 4603a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4604a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4605a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4606a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_prohibits_overwriting(bool value) { 4607a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block set_flag(BooleanBit::set(flag(), kProhibitsOverwritingBit, value)); 4608a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4609a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4610a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4611a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockPropertyAttributes AccessorInfo::property_attributes() { 4612a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return AttributesField::decode(static_cast<uint32_t>(flag()->value())); 4613a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4614a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4615a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid AccessorInfo::set_property_attributes(PropertyAttributes attributes) { 4617589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch set_flag(Smi::FromInt(AttributesField::update(flag()->value(), attributes))); 4618a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4619a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 46208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 46218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochtemplate<typename Shape, typename Key> 46228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid Dictionary<Shape, Key>::SetEntry(int entry, 46238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Object* key, 46248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Object* value) { 46258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0))); 46268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch} 46278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 46288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocktemplate<typename Shape, typename Key> 4630a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Dictionary<Shape, Key>::SetEntry(int entry, 4631a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* key, 4632a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Object* value, 4633a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PropertyDetails details) { 4634a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block ASSERT(!key->IsString() || details.IsDeleted() || details.index() > 0); 4635a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int index = HashTable<Shape, Key>::EntryToIndex(entry); 46364515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke AssertNoAllocation no_gc; 46374515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc); 4638a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray::set(index, key, mode); 4639a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block FixedArray::set(index+1, value, mode); 46403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedArray::set(index+2, details.AsSmi()); 4641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 464444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) { 464544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(other->IsNumber()); 464644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return key == static_cast<uint32_t>(other->Number()); 464744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 464844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 464944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4650c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) { 4651c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return ComputeIntegerHash(key, 0); 465244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 465344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 465444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4655c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key, 4656c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch Object* other) { 465744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(other->IsNumber()); 4658c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0); 4659c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 4660c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 4661c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) { 4662c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return ComputeIntegerHash(key, seed); 466344f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 466444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4665c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochuint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key, 4666c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch uint32_t seed, 4667c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch Object* other) { 4668c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch ASSERT(other->IsNumber()); 4669c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed); 4670c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch} 467144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 467244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockMaybeObject* NumberDictionaryShape::AsObject(uint32_t key) { 467344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Isolate::Current()->heap()->NumberFromUint32(key); 467444f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 467544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 467644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 467744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool StringDictionaryShape::IsMatch(String* key, Object* other) { 467844f0eee88ff00398ff7f715fab053374d808c90dSteve Block // We know that all entries in a hash table had their hash keys created. 467944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Use that knowledge to have fast failure. 468044f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (key->Hash() != String::cast(other)->Hash()) return false; 468144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return key->Equals(String::cast(other)); 468244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 468344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 468444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 468544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockuint32_t StringDictionaryShape::Hash(String* key) { 468644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return key->Hash(); 468744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 468844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 468944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 469044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockuint32_t StringDictionaryShape::HashForObject(String* key, Object* other) { 469144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return String::cast(other)->Hash(); 469244f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 469344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 469444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 469544f0eee88ff00398ff7f715fab053374d808c90dSteve BlockMaybeObject* StringDictionaryShape::AsObject(String* key) { 469644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return key; 469744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 469844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 469944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 47003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize> 47013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool ObjectHashTableShape<entrysize>::IsMatch(Object* key, Object* other) { 47023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return key->SameValue(other); 470369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 470469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 470569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 47063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize> 47073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochuint32_t ObjectHashTableShape<entrysize>::Hash(Object* key) { 47083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MaybeObject* maybe_hash = key->GetHash(OMIT_CREATION); 47093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Smi::cast(maybe_hash->ToObjectChecked())->value(); 471069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 471169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 471269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 47133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize> 47143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochuint32_t ObjectHashTableShape<entrysize>::HashForObject(Object* key, 47153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Object* other) { 47163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MaybeObject* maybe_hash = other->GetHash(OMIT_CREATION); 47173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Smi::cast(maybe_hash->ToObjectChecked())->value(); 471869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 471969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 472069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 47213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtemplate <int entrysize> 47223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* ObjectHashTableShape<entrysize>::AsObject(Object* key) { 472369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return key; 472469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 472569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 472669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 472744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid Map::ClearCodeCache(Heap* heap) { 4728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // No write barrier is needed since empty_fixed_array is not in new space. 4729a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Please note this function is used during marking: 4730a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // - MarkCompactCollector::MarkUnmarkedObject 47313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // - IncrementalMarking::Step 473244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!heap->InNewSpace(heap->raw_unchecked_empty_fixed_array())); 473344f0eee88ff00398ff7f715fab053374d808c90dSteve Block WRITE_FIELD(this, kCodeCacheOffset, heap->raw_unchecked_empty_fixed_array()); 4734a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4735a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4736a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4737a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid JSArray::EnsureSize(int required_size) { 47383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(HasFastTypeElements()); 47397f4d5bd8c03935e2c0cd412e561b8fc5a6a880aeBen Murdoch FixedArray* elts = FixedArray::cast(elements()); 4740d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block const int kArraySizeThatFitsComfortablyInNewSpace = 128; 4741d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block if (elts->length() < required_size) { 4742d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Doubling in size would be overkill, but leave some slack to avoid 4743d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // constantly growing. 4744d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Expand(required_size + (required_size >> 3)); 4745d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // It's a performance benefit to keep a frequently used array in new-space. 474644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else if (!GetHeap()->new_space()->Contains(elts) && 4747d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block required_size < kArraySizeThatFitsComfortablyInNewSpace) { 4748d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // Expand will allocate a new backing store in new space even if the size 4749d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block // we asked for isn't larger than what we had before. 4750d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block Expand(required_size); 4751d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block } 4752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4753a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4754a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 47554515c472dc3e5ed2448a564600976759e569a0a8Leon Clarkevoid JSArray::set_length(Smi* length) { 47563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Don't need a write barrier for a Smi. 47574515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER); 47584515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke} 47594515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 47604515c472dc3e5ed2448a564600976759e569a0a8Leon Clarke 47613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool JSArray::AllowsSetElementsLength() { 47623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray(); 47633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(result == !HasExternalArrayElements()); 47643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 47653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 47663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47683ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* JSArray::SetContent(FixedArrayBase* storage) { 47693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch MaybeObject* maybe_result = EnsureCanContainElements( 47703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch storage, ALLOW_COPIED_DOUBLE_ELEMENTS); 47713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (maybe_result->IsFailure()) return maybe_result; 47723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT((storage->map() == GetHeap()->fixed_double_array_map() && 47733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GetElementsKind() == FAST_DOUBLE_ELEMENTS) || 47743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ((storage->map() != GetHeap()->fixed_double_array_map()) && 47753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ((GetElementsKind() == FAST_ELEMENTS) || 47763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (GetElementsKind() == FAST_SMI_ONLY_ELEMENTS && 47773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch FixedArray::cast(storage)->ContainsOnlySmisOrHoles())))); 477885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch set_elements(storage); 47793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_length(Smi::FromInt(storage->length())); 47803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return this; 4781a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4782a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4783a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 47845913587db4c6bab03d97bfe44b06289fd6d7270dJohn ReckMaybeObject* FixedArray::Copy() { 4785a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block if (length() == 0) return this; 478644f0eee88ff00398ff7f715fab053374d808c90dSteve Block return GetHeap()->CopyFixedArray(this); 478744f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 478844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 478944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 47903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochMaybeObject* FixedDoubleArray::Copy() { 47913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (length() == 0) return this; 47923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GetHeap()->CopyFixedDoubleArray(this); 47933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 47943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid TypeFeedbackCells::SetAstId(int index, Smi* id) { 47973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set(1 + index * 2, id); 47983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 47993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48013ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSmi* TypeFeedbackCells::AstId(int index) { 48023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Smi::cast(get(1 + index * 2)); 48033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 48043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid TypeFeedbackCells::SetCell(int index, JSGlobalPropertyCell* cell) { 48073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set(index * 2, cell); 48083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 48093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48113ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochJSGlobalPropertyCell* TypeFeedbackCells::Cell(int index) { 48123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return JSGlobalPropertyCell::cast(get(index * 2)); 48133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 48143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48163ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> TypeFeedbackCells::UninitializedSentinel(Isolate* isolate) { 48173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return isolate->factory()->the_hole_value(); 48183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 48193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> TypeFeedbackCells::MegamorphicSentinel(Isolate* isolate) { 48223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return isolate->factory()->undefined_value(); 48233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 48243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochObject* TypeFeedbackCells::RawUninitializedSentinel(Heap* heap) { 48273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return heap->raw_unchecked_the_hole_value(); 48283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 48293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48313ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(TypeFeedbackInfo, ic_total_count, kIcTotalCountOffset) 48328f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben MurdochSMI_ACCESSORS(TypeFeedbackInfo, ic_with_type_info_count, 48333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kIcWithTypeinfoCountOffset) 48343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochACCESSORS(TypeFeedbackInfo, type_feedback_cells, TypeFeedbackCells, 48353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kTypeFeedbackCellsOffset) 48363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochSMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot) 48393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 484144f0eee88ff00398ff7f715fab053374d808c90dSteve BlockRelocatable::Relocatable(Isolate* isolate) { 484244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(isolate == Isolate::Current()); 484344f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate_ = isolate; 484444f0eee88ff00398ff7f715fab053374d808c90dSteve Block prev_ = isolate->relocatable_top(); 484544f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate->set_relocatable_top(this); 484644f0eee88ff00398ff7f715fab053374d808c90dSteve Block} 484744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 484844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 484944f0eee88ff00398ff7f715fab053374d808c90dSteve BlockRelocatable::~Relocatable() { 485044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(isolate_ == Isolate::Current()); 485144f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT_EQ(isolate_->relocatable_top(), this); 485244f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate_->set_relocatable_top(prev_); 4853a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 4854a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4855a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4856756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickint JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) { 4857756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick return map->instance_size(); 4858756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4859756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4860756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4861257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Foreign::ForeignIterateBody(ObjectVisitor* v) { 4862756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitExternalReference( 48633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset))); 4864756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4865756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4866756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4867756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor> 4868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid Foreign::ForeignIterateBody() { 4869756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick StaticVisitor::VisitExternalReference( 48703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset))); 4871756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4872756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4873756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4874756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) { 4875756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef v8::String::ExternalAsciiStringResource Resource; 4876756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitExternalAsciiString( 4877756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 4878756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4879756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4880756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4881756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor> 4882756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalAsciiString::ExternalAsciiStringIterateBody() { 4883756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef v8::String::ExternalAsciiStringResource Resource; 4884756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick StaticVisitor::VisitExternalAsciiString( 4885756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 4886756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4887756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4888756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4889756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) { 4890756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef v8::String::ExternalStringResource Resource; 4891756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitExternalTwoByteString( 4892756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 4893756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4894756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4895756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4896756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<typename StaticVisitor> 4897756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid ExternalTwoByteString::ExternalTwoByteStringIterateBody() { 4898756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick typedef v8::String::ExternalStringResource Resource; 4899756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick StaticVisitor::VisitExternalTwoByteString( 4900756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset))); 4901756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4902756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4903756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#define SLOT_ADDR(obj, offset) \ 4904756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick reinterpret_cast<Object**>((obj)->address() + offset) 4905756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4906756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<int start_offset, int end_offset, int size> 4907756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody( 4908756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick HeapObject* obj, 4909756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ObjectVisitor* v) { 4910756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, end_offset)); 4911756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4912756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4913756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4914756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merricktemplate<int start_offset> 4915756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrickvoid FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj, 4916756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick int object_size, 4917756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick ObjectVisitor* v) { 4918756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, object_size)); 4919756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick} 4920756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 4921756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick#undef SLOT_ADDR 4922756813857a4c2a4d8ad2e805969d5768d3cf43a0Iain Merrick 49233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef TYPE_CHECKER 4924a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CAST_ACCESSOR 4925a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef INT_ACCESSORS 492685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch#undef ACCESSORS 49273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef ACCESSORS_TO_SMI 49283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef SMI_ACCESSORS 49293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef BOOL_GETTER 49303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef BOOL_ACCESSORS 4931a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef FIELD_ADDR 4932a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_FIELD 4933a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_FIELD 4934a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BARRIER 4935a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef CONDITIONAL_WRITE_BARRIER 4936a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_DOUBLE_FIELD 4937a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_DOUBLE_FIELD 4938a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_INT_FIELD 4939a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_INT_FIELD 49403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef READ_INTPTR_FIELD 49413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef WRITE_INTPTR_FIELD 49423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef READ_UINT32_FIELD 49433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef WRITE_UINT32_FIELD 4944a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_SHORT_FIELD 4945a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_SHORT_FIELD 4946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef READ_BYTE_FIELD 4947a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#undef WRITE_BYTE_FIELD 4948a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4949a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4950a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} } // namespace v8::internal 4951a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 4952a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif // V8_OBJECTS_INL_H_ 4953