blob: 2cdfad6fb2c1b4f7d2bf4c024781aac82dedb31c [file] [log] [blame]
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001// Copyright 2012 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27//
28// Review notes:
29//
ager@chromium.org32912102009-01-16 10:38:43 +000030// - The use of macros in these inline functions may seem superfluous
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000031// but it is absolutely needed to make sure gcc generates optimal
32// code. gcc is not happy when attempting to inline too deep.
33//
34
35#ifndef V8_OBJECTS_INL_H_
36#define V8_OBJECTS_INL_H_
37
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +000038#include "elements.h"
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +000039#include "objects.h"
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000040#include "contexts.h"
41#include "conversions-inl.h"
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +000042#include "heap.h"
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000043#include "isolate.h"
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000044#include "property.h"
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +000045#include "spaces.h"
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000046#include "store-buffer.h"
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000047#include "v8memory.h"
danno@chromium.orgfa458e42012-02-01 10:48:36 +000048#include "factory.h"
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000049#include "incremental-marking.h"
50
kasperl@chromium.org71affb52009-05-26 05:44:31 +000051namespace v8 {
52namespace internal {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000053
54PropertyDetails::PropertyDetails(Smi* smi) {
55 value_ = smi->value();
56}
57
58
59Smi* PropertyDetails::AsSmi() {
60 return Smi::FromInt(value_);
61}
62
63
kasperl@chromium.org2abc4502009-07-02 07:00:29 +000064PropertyDetails PropertyDetails::AsDeleted() {
ager@chromium.org378b34e2011-01-28 08:04:38 +000065 Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
kasperl@chromium.org2abc4502009-07-02 07:00:29 +000066 return PropertyDetails(smi);
67}
68
69
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +000070#define TYPE_CHECKER(type, instancetype) \
71 bool Object::Is##type() { \
72 return Object::IsHeapObject() && \
73 HeapObject::cast(this)->map()->instance_type() == instancetype; \
74 }
75
76
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000077#define CAST_ACCESSOR(type) \
78 type* type::cast(Object* object) { \
79 ASSERT(object->Is##type()); \
80 return reinterpret_cast<type*>(object); \
81 }
82
83
84#define INT_ACCESSORS(holder, name, offset) \
85 int holder::name() { return READ_INT_FIELD(this, offset); } \
86 void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); }
87
88
89#define ACCESSORS(holder, name, type, offset) \
90 type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +000091 void holder::set_##name(type* value, WriteBarrierMode mode) { \
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000092 WRITE_FIELD(this, offset, value); \
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000093 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); \
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000094 }
95
96
rossberg@chromium.org2c067b12012-03-19 11:01:52 +000097// Getter that returns a tagged Smi and setter that writes a tagged Smi.
98#define ACCESSORS_TO_SMI(holder, name, offset) \
99 Smi* holder::name() { return Smi::cast(READ_FIELD(this, offset)); } \
100 void holder::set_##name(Smi* value, WriteBarrierMode mode) { \
101 WRITE_FIELD(this, offset, value); \
102 }
103
104
105// Getter that returns a Smi as an int and writes an int as a Smi.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000106#define SMI_ACCESSORS(holder, name, offset) \
107 int holder::name() { \
108 Object* value = READ_FIELD(this, offset); \
109 return Smi::cast(value)->value(); \
110 } \
111 void holder::set_##name(int value) { \
112 WRITE_FIELD(this, offset, Smi::FromInt(value)); \
113 }
114
115
sgjesse@chromium.org911335c2009-08-19 12:59:44 +0000116#define BOOL_GETTER(holder, field, name, offset) \
117 bool holder::name() { \
118 return BooleanBit::get(field(), offset); \
119 } \
120
121
122#define BOOL_ACCESSORS(holder, field, name, offset) \
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000123 bool holder::name() { \
124 return BooleanBit::get(field(), offset); \
125 } \
126 void holder::set_##name(bool value) { \
127 set_##field(BooleanBit::set(field(), offset, value)); \
128 }
129
130
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000131bool Object::IsFixedArrayBase() {
132 return IsFixedArray() || IsFixedDoubleArray();
133}
134
135
sgjesse@chromium.org900d3b72009-08-07 11:24:25 +0000136bool Object::IsInstanceOf(FunctionTemplateInfo* expected) {
137 // There is a constraint on the object; check.
138 if (!this->IsJSObject()) return false;
139 // Fetch the constructor function of the object.
140 Object* cons_obj = JSObject::cast(this)->map()->constructor();
141 if (!cons_obj->IsJSFunction()) return false;
142 JSFunction* fun = JSFunction::cast(cons_obj);
143 // Iterate through the chain of inheriting function templates to
144 // see if the required one occurs.
145 for (Object* type = fun->shared()->function_data();
146 type->IsFunctionTemplateInfo();
147 type = FunctionTemplateInfo::cast(type)->parent_template()) {
148 if (type == expected) return true;
149 }
150 // Didn't find the required type in the inheritance chain.
151 return false;
152}
153
154
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000155bool Object::IsSmi() {
156 return HAS_SMI_TAG(this);
157}
158
159
160bool Object::IsHeapObject() {
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000161 return Internals::HasHeapObjectTag(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000162}
163
164
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000165bool Object::NonFailureIsHeapObject() {
166 ASSERT(!this->IsFailure());
167 return (reinterpret_cast<intptr_t>(this) & kSmiTagMask) != 0;
168}
169
170
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000171TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000172
173
174bool Object::IsString() {
175 return Object::IsHeapObject()
176 && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE;
177}
178
179
ricow@chromium.org9fa09672011-07-25 11:05:35 +0000180bool Object::IsSpecObject() {
181 return Object::IsHeapObject()
182 && HeapObject::cast(this)->map()->instance_type() >= FIRST_SPEC_OBJECT_TYPE;
183}
184
185
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000186bool Object::IsSpecFunction() {
187 if (!Object::IsHeapObject()) return false;
188 InstanceType type = HeapObject::cast(this)->map()->instance_type();
189 return type == JS_FUNCTION_TYPE || type == JS_FUNCTION_PROXY_TYPE;
190}
191
192
ager@chromium.org870a0b62008-11-04 11:43:05 +0000193bool Object::IsSymbol() {
194 if (!this->IsHeapObject()) return false;
195 uint32_t type = HeapObject::cast(this)->map()->instance_type();
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000196 // Because the symbol tag is non-zero and no non-string types have the
197 // symbol bit set we can test for symbols with a very simple test
198 // operation.
yangguo@chromium.org80c42ed2011-08-31 09:03:56 +0000199 STATIC_ASSERT(kSymbolTag != 0);
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000200 ASSERT(kNotStringTag + kIsSymbolMask > LAST_TYPE);
201 return (type & kIsSymbolMask) != 0;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000202}
203
204
205bool Object::IsConsString() {
ricow@chromium.org4668a2c2011-08-29 10:41:00 +0000206 if (!IsString()) return false;
207 return StringShape(String::cast(this)).IsCons();
208}
209
210
211bool Object::IsSlicedString() {
212 if (!IsString()) return false;
213 return StringShape(String::cast(this)).IsSliced();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000214}
215
216
ager@chromium.org870a0b62008-11-04 11:43:05 +0000217bool Object::IsSeqString() {
218 if (!IsString()) return false;
219 return StringShape(String::cast(this)).IsSequential();
220}
221
222
223bool Object::IsSeqAsciiString() {
224 if (!IsString()) return false;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000225 return StringShape(String::cast(this)).IsSequential() &&
ager@chromium.org5ec48922009-05-05 07:25:34 +0000226 String::cast(this)->IsAsciiRepresentation();
ager@chromium.org870a0b62008-11-04 11:43:05 +0000227}
228
229
230bool Object::IsSeqTwoByteString() {
231 if (!IsString()) return false;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000232 return StringShape(String::cast(this)).IsSequential() &&
ager@chromium.org5ec48922009-05-05 07:25:34 +0000233 String::cast(this)->IsTwoByteRepresentation();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000234}
235
236
237bool Object::IsExternalString() {
ager@chromium.org870a0b62008-11-04 11:43:05 +0000238 if (!IsString()) return false;
239 return StringShape(String::cast(this)).IsExternal();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000240}
241
242
243bool Object::IsExternalAsciiString() {
ager@chromium.org870a0b62008-11-04 11:43:05 +0000244 if (!IsString()) return false;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000245 return StringShape(String::cast(this)).IsExternal() &&
ager@chromium.org5ec48922009-05-05 07:25:34 +0000246 String::cast(this)->IsAsciiRepresentation();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000247}
248
249
250bool Object::IsExternalTwoByteString() {
ager@chromium.org870a0b62008-11-04 11:43:05 +0000251 if (!IsString()) return false;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000252 return StringShape(String::cast(this)).IsExternal() &&
ager@chromium.org5ec48922009-05-05 07:25:34 +0000253 String::cast(this)->IsTwoByteRepresentation();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000254}
255
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000256bool Object::HasValidElements() {
257 // Dictionary is covered under FixedArray.
258 return IsFixedArray() || IsFixedDoubleArray() || IsExternalArray();
259}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000260
ager@chromium.org870a0b62008-11-04 11:43:05 +0000261StringShape::StringShape(String* str)
262 : type_(str->map()->instance_type()) {
263 set_valid();
264 ASSERT((type_ & kIsNotStringMask) == kStringTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000265}
266
267
ager@chromium.org870a0b62008-11-04 11:43:05 +0000268StringShape::StringShape(Map* map)
269 : type_(map->instance_type()) {
270 set_valid();
271 ASSERT((type_ & kIsNotStringMask) == kStringTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000272}
273
274
ager@chromium.org870a0b62008-11-04 11:43:05 +0000275StringShape::StringShape(InstanceType t)
276 : type_(static_cast<uint32_t>(t)) {
277 set_valid();
278 ASSERT((type_ & kIsNotStringMask) == kStringTag);
279}
280
281
282bool StringShape::IsSymbol() {
283 ASSERT(valid());
yangguo@chromium.org80c42ed2011-08-31 09:03:56 +0000284 STATIC_ASSERT(kSymbolTag != 0);
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000285 return (type_ & kIsSymbolMask) != 0;
ager@chromium.org870a0b62008-11-04 11:43:05 +0000286}
287
288
ager@chromium.org5ec48922009-05-05 07:25:34 +0000289bool String::IsAsciiRepresentation() {
290 uint32_t type = map()->instance_type();
ager@chromium.org5ec48922009-05-05 07:25:34 +0000291 return (type & kStringEncodingMask) == kAsciiStringTag;
ager@chromium.org870a0b62008-11-04 11:43:05 +0000292}
293
294
ager@chromium.org5ec48922009-05-05 07:25:34 +0000295bool String::IsTwoByteRepresentation() {
296 uint32_t type = map()->instance_type();
ager@chromium.org5ec48922009-05-05 07:25:34 +0000297 return (type & kStringEncodingMask) == kTwoByteStringTag;
ager@chromium.org870a0b62008-11-04 11:43:05 +0000298}
299
300
ricow@chromium.org4668a2c2011-08-29 10:41:00 +0000301bool String::IsAsciiRepresentationUnderneath() {
302 uint32_t type = map()->instance_type();
303 STATIC_ASSERT(kIsIndirectStringTag != 0);
304 STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
305 ASSERT(IsFlat());
306 switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
307 case kAsciiStringTag:
308 return true;
309 case kTwoByteStringTag:
310 return false;
311 default: // Cons or sliced string. Need to go deeper.
312 return GetUnderlying()->IsAsciiRepresentation();
313 }
314}
315
316
317bool String::IsTwoByteRepresentationUnderneath() {
318 uint32_t type = map()->instance_type();
319 STATIC_ASSERT(kIsIndirectStringTag != 0);
320 STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
321 ASSERT(IsFlat());
322 switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
323 case kAsciiStringTag:
324 return false;
325 case kTwoByteStringTag:
326 return true;
327 default: // Cons or sliced string. Need to go deeper.
328 return GetUnderlying()->IsTwoByteRepresentation();
329 }
330}
331
332
ricow@chromium.org5ad5ace2010-06-23 09:06:43 +0000333bool String::HasOnlyAsciiChars() {
334 uint32_t type = map()->instance_type();
335 return (type & kStringEncodingMask) == kAsciiStringTag ||
336 (type & kAsciiDataHintMask) == kAsciiDataHintTag;
ricow@chromium.orgaa1b6162010-03-29 07:44:58 +0000337}
338
339
ager@chromium.org870a0b62008-11-04 11:43:05 +0000340bool StringShape::IsCons() {
341 return (type_ & kStringRepresentationMask) == kConsStringTag;
342}
343
344
ricow@chromium.org4668a2c2011-08-29 10:41:00 +0000345bool StringShape::IsSliced() {
346 return (type_ & kStringRepresentationMask) == kSlicedStringTag;
347}
348
349
350bool StringShape::IsIndirect() {
351 return (type_ & kIsIndirectStringMask) == kIsIndirectStringTag;
352}
353
354
ager@chromium.org870a0b62008-11-04 11:43:05 +0000355bool StringShape::IsExternal() {
356 return (type_ & kStringRepresentationMask) == kExternalStringTag;
357}
358
359
360bool StringShape::IsSequential() {
361 return (type_ & kStringRepresentationMask) == kSeqStringTag;
362}
363
364
365StringRepresentationTag StringShape::representation_tag() {
366 uint32_t tag = (type_ & kStringRepresentationMask);
367 return static_cast<StringRepresentationTag>(tag);
368}
369
370
ricow@chromium.orgddd545c2011-08-24 12:02:41 +0000371uint32_t StringShape::encoding_tag() {
372 return type_ & kStringEncodingMask;
373}
374
375
ager@chromium.org870a0b62008-11-04 11:43:05 +0000376uint32_t StringShape::full_representation_tag() {
377 return (type_ & (kStringRepresentationMask | kStringEncodingMask));
378}
379
380
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000381STATIC_CHECK((kStringRepresentationMask | kStringEncodingMask) ==
382 Internals::kFullStringRepresentationMask);
383
384
ager@chromium.org870a0b62008-11-04 11:43:05 +0000385bool StringShape::IsSequentialAscii() {
386 return full_representation_tag() == (kSeqStringTag | kAsciiStringTag);
387}
388
389
390bool StringShape::IsSequentialTwoByte() {
ager@chromium.org80787b72009-04-17 10:24:24 +0000391 return full_representation_tag() == (kSeqStringTag | kTwoByteStringTag);
ager@chromium.org870a0b62008-11-04 11:43:05 +0000392}
393
394
395bool StringShape::IsExternalAscii() {
396 return full_representation_tag() == (kExternalStringTag | kAsciiStringTag);
397}
398
399
400bool StringShape::IsExternalTwoByte() {
ager@chromium.org80787b72009-04-17 10:24:24 +0000401 return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000402}
403
404
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000405STATIC_CHECK((kExternalStringTag | kTwoByteStringTag) ==
406 Internals::kExternalTwoByteRepresentationTag);
407
408
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000409uc32 FlatStringReader::Get(int index) {
410 ASSERT(0 <= index && index <= length_);
411 if (is_ascii_) {
412 return static_cast<const byte*>(start_)[index];
413 } else {
414 return static_cast<const uc16*>(start_)[index];
415 }
416}
417
418
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000419bool Object::IsNumber() {
420 return IsSmi() || IsHeapNumber();
421}
422
423
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000424TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE)
425TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000426
427
428bool Object::IsFiller() {
429 if (!Object::IsHeapObject()) return false;
430 InstanceType instance_type = HeapObject::cast(this)->map()->instance_type();
431 return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE;
432}
433
434
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000435TYPE_CHECKER(ExternalPixelArray, EXTERNAL_PIXEL_ARRAY_TYPE)
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000436
437
ager@chromium.org3811b432009-10-28 14:53:37 +0000438bool Object::IsExternalArray() {
439 if (!Object::IsHeapObject())
440 return false;
441 InstanceType instance_type =
442 HeapObject::cast(this)->map()->instance_type();
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000443 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE &&
444 instance_type <= LAST_EXTERNAL_ARRAY_TYPE);
ager@chromium.org3811b432009-10-28 14:53:37 +0000445}
446
447
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000448TYPE_CHECKER(ExternalByteArray, EXTERNAL_BYTE_ARRAY_TYPE)
449TYPE_CHECKER(ExternalUnsignedByteArray, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
450TYPE_CHECKER(ExternalShortArray, EXTERNAL_SHORT_ARRAY_TYPE)
451TYPE_CHECKER(ExternalUnsignedShortArray, EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
452TYPE_CHECKER(ExternalIntArray, EXTERNAL_INT_ARRAY_TYPE)
453TYPE_CHECKER(ExternalUnsignedIntArray, EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
454TYPE_CHECKER(ExternalFloatArray, EXTERNAL_FLOAT_ARRAY_TYPE)
455TYPE_CHECKER(ExternalDoubleArray, EXTERNAL_DOUBLE_ARRAY_TYPE)
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +0000456
457
lrn@chromium.org303ada72010-10-27 09:33:13 +0000458bool MaybeObject::IsFailure() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000459 return HAS_FAILURE_TAG(this);
460}
461
462
lrn@chromium.org303ada72010-10-27 09:33:13 +0000463bool MaybeObject::IsRetryAfterGC() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000464 return HAS_FAILURE_TAG(this)
465 && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC;
466}
467
468
lrn@chromium.org303ada72010-10-27 09:33:13 +0000469bool MaybeObject::IsOutOfMemory() {
ager@chromium.org7c537e22008-10-16 08:43:32 +0000470 return HAS_FAILURE_TAG(this)
kmillikin@chromium.org31b12772011-02-02 16:08:26 +0000471 && Failure::cast(this)->IsOutOfMemoryException();
ager@chromium.org7c537e22008-10-16 08:43:32 +0000472}
473
474
lrn@chromium.org303ada72010-10-27 09:33:13 +0000475bool MaybeObject::IsException() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000476 return this == Failure::Exception();
477}
478
479
lrn@chromium.org303ada72010-10-27 09:33:13 +0000480bool MaybeObject::IsTheHole() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000481 return !IsFailure() && ToObjectUnchecked()->IsTheHole();
lrn@chromium.org303ada72010-10-27 09:33:13 +0000482}
483
484
485Failure* Failure::cast(MaybeObject* obj) {
486 ASSERT(HAS_FAILURE_TAG(obj));
487 return reinterpret_cast<Failure*>(obj);
488}
489
490
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000491bool Object::IsJSReceiver() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000492 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000493 return IsHeapObject() &&
494 HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_RECEIVER_TYPE;
495}
496
497
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000498bool Object::IsJSObject() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000499 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE);
500 return IsHeapObject() &&
501 HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000502}
503
504
505bool Object::IsJSProxy() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000506 if (!Object::IsHeapObject()) return false;
507 InstanceType type = HeapObject::cast(this)->map()->instance_type();
508 return FIRST_JS_PROXY_TYPE <= type && type <= LAST_JS_PROXY_TYPE;
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000509}
510
511
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000512TYPE_CHECKER(JSFunctionProxy, JS_FUNCTION_PROXY_TYPE)
513TYPE_CHECKER(JSSet, JS_SET_TYPE)
514TYPE_CHECKER(JSMap, JS_MAP_TYPE)
515TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE)
516TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE)
517TYPE_CHECKER(Map, MAP_TYPE)
518TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE)
519TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000520
521
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000522bool Object::IsDescriptorArray() {
523 return IsFixedArray();
524}
525
526
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000527bool Object::IsDeoptimizationInputData() {
528 // Must be a fixed array.
529 if (!IsFixedArray()) return false;
530
531 // There's no sure way to detect the difference between a fixed array and
532 // a deoptimization data array. Since this is used for asserts we can
533 // check that the length is zero or else the fixed size plus a multiple of
534 // the entry size.
535 int length = FixedArray::cast(this)->length();
536 if (length == 0) return true;
537
538 length -= DeoptimizationInputData::kFirstDeoptEntryIndex;
539 return length >= 0 &&
540 length % DeoptimizationInputData::kDeoptEntrySize == 0;
541}
542
543
544bool Object::IsDeoptimizationOutputData() {
545 if (!IsFixedArray()) return false;
546 // There's actually no way to see the difference between a fixed array and
547 // a deoptimization data array. Since this is used for asserts we can check
548 // that the length is plausible though.
549 if (FixedArray::cast(this)->length() % 2 != 0) return false;
550 return true;
551}
552
553
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000554bool Object::IsTypeFeedbackCells() {
555 if (!IsFixedArray()) return false;
556 // There's actually no way to see the difference between a fixed array and
557 // a cache cells array. Since this is used for asserts we can check that
558 // the length is plausible though.
559 if (FixedArray::cast(this)->length() % 2 != 0) return false;
560 return true;
561}
562
563
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000564bool Object::IsContext() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000565 if (Object::IsHeapObject()) {
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000566 Map* map = HeapObject::cast(this)->map();
567 Heap* heap = map->GetHeap();
568 return (map == heap->function_context_map() ||
569 map == heap->catch_context_map() ||
570 map == heap->with_context_map() ||
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000571 map == heap->global_context_map() ||
erik.corry@gmail.comed49e962012-04-17 11:57:53 +0000572 map == heap->block_context_map() ||
573 map == heap->module_context_map());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000574 }
575 return false;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000576}
577
578
579bool Object::IsGlobalContext() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000580 return Object::IsHeapObject() &&
581 HeapObject::cast(this)->map() ==
582 HeapObject::cast(this)->GetHeap()->global_context_map();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000583}
584
585
erik.corry@gmail.comed49e962012-04-17 11:57:53 +0000586bool Object::IsModuleContext() {
587 return Object::IsHeapObject() &&
588 HeapObject::cast(this)->map() ==
589 HeapObject::cast(this)->GetHeap()->module_context_map();
590}
591
592
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000593bool Object::IsScopeInfo() {
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000594 return Object::IsHeapObject() &&
595 HeapObject::cast(this)->map() ==
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000596 HeapObject::cast(this)->GetHeap()->scope_info_map();
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000597}
598
599
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000600TYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000601
602
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000603template <> inline bool Is<JSFunction>(Object* obj) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000604 return obj->IsJSFunction();
605}
606
607
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000608TYPE_CHECKER(Code, CODE_TYPE)
609TYPE_CHECKER(Oddball, ODDBALL_TYPE)
610TYPE_CHECKER(JSGlobalPropertyCell, JS_GLOBAL_PROPERTY_CELL_TYPE)
611TYPE_CHECKER(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE)
erik.corry@gmail.comed49e962012-04-17 11:57:53 +0000612TYPE_CHECKER(JSModule, JS_MODULE_TYPE)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000613TYPE_CHECKER(JSValue, JS_VALUE_TYPE)
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000614TYPE_CHECKER(JSDate, JS_DATE_TYPE)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000615TYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000616
617
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +0000618bool Object::IsStringWrapper() {
619 return IsJSValue() && JSValue::cast(this)->value()->IsString();
620}
621
622
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000623TYPE_CHECKER(Foreign, FOREIGN_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000624
625
626bool Object::IsBoolean() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000627 return IsOddball() &&
628 ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000629}
630
631
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000632TYPE_CHECKER(JSArray, JS_ARRAY_TYPE)
633TYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE)
ager@chromium.org236ad962008-09-25 09:45:57 +0000634
635
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000636template <> inline bool Is<JSArray>(Object* obj) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000637 return obj->IsJSArray();
638}
639
640
641bool Object::IsHashTable() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000642 return Object::IsHeapObject() &&
643 HeapObject::cast(this)->map() ==
644 HeapObject::cast(this)->GetHeap()->hash_table_map();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000645}
646
647
648bool Object::IsDictionary() {
whesse@chromium.org7b260152011-06-20 15:33:18 +0000649 return IsHashTable() &&
650 this != HeapObject::cast(this)->GetHeap()->symbol_table();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000651}
652
653
654bool Object::IsSymbolTable() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000655 return IsHashTable() && this ==
656 HeapObject::cast(this)->GetHeap()->raw_unchecked_symbol_table();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000657}
658
659
ager@chromium.orgac091b72010-05-05 07:34:42 +0000660bool Object::IsJSFunctionResultCache() {
661 if (!IsFixedArray()) return false;
662 FixedArray* self = FixedArray::cast(this);
663 int length = self->length();
664 if (length < JSFunctionResultCache::kEntriesIndex) return false;
665 if ((length - JSFunctionResultCache::kEntriesIndex)
666 % JSFunctionResultCache::kEntrySize != 0) {
667 return false;
668 }
669#ifdef DEBUG
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000670 if (FLAG_verify_heap) {
671 reinterpret_cast<JSFunctionResultCache*>(this)->
672 JSFunctionResultCacheVerify();
673 }
ager@chromium.orgac091b72010-05-05 07:34:42 +0000674#endif
675 return true;
676}
677
678
ricow@chromium.org65fae842010-08-25 15:26:24 +0000679bool Object::IsNormalizedMapCache() {
680 if (!IsFixedArray()) return false;
681 if (FixedArray::cast(this)->length() != NormalizedMapCache::kEntries) {
682 return false;
683 }
684#ifdef DEBUG
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000685 if (FLAG_verify_heap) {
686 reinterpret_cast<NormalizedMapCache*>(this)->NormalizedMapCacheVerify();
687 }
ricow@chromium.org65fae842010-08-25 15:26:24 +0000688#endif
689 return true;
690}
691
692
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000693bool Object::IsCompilationCacheTable() {
694 return IsHashTable();
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000695}
696
697
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000698bool Object::IsCodeCacheHashTable() {
699 return IsHashTable();
700}
701
702
jkummerow@chromium.orge297f592011-06-08 10:05:15 +0000703bool Object::IsPolymorphicCodeCacheHashTable() {
704 return IsHashTable();
705}
706
707
ager@chromium.org236ad962008-09-25 09:45:57 +0000708bool Object::IsMapCache() {
709 return IsHashTable();
710}
711
712
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000713bool Object::IsPrimitive() {
714 return IsOddball() || IsNumber() || IsString();
715}
716
717
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000718bool Object::IsJSGlobalProxy() {
719 bool result = IsHeapObject() &&
720 (HeapObject::cast(this)->map()->instance_type() ==
721 JS_GLOBAL_PROXY_TYPE);
722 ASSERT(!result || IsAccessCheckNeeded());
723 return result;
724}
725
726
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000727bool Object::IsGlobalObject() {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000728 if (!IsHeapObject()) return false;
729
kasperl@chromium.org9bbf9682008-10-30 11:53:07 +0000730 InstanceType type = HeapObject::cast(this)->map()->instance_type();
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000731 return type == JS_GLOBAL_OBJECT_TYPE ||
732 type == JS_BUILTINS_OBJECT_TYPE;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000733}
734
735
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000736TYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE)
737TYPE_CHECKER(JSBuiltinsObject, JS_BUILTINS_OBJECT_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000738
739
740bool Object::IsUndetectableObject() {
741 return IsHeapObject()
742 && HeapObject::cast(this)->map()->is_undetectable();
743}
744
745
746bool Object::IsAccessCheckNeeded() {
747 return IsHeapObject()
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000748 && HeapObject::cast(this)->map()->is_access_check_needed();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000749}
750
751
752bool Object::IsStruct() {
753 if (!IsHeapObject()) return false;
754 switch (HeapObject::cast(this)->map()->instance_type()) {
755#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true;
756 STRUCT_LIST(MAKE_STRUCT_CASE)
757#undef MAKE_STRUCT_CASE
758 default: return false;
759 }
760}
761
762
763#define MAKE_STRUCT_PREDICATE(NAME, Name, name) \
764 bool Object::Is##Name() { \
765 return Object::IsHeapObject() \
766 && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \
767 }
768 STRUCT_LIST(MAKE_STRUCT_PREDICATE)
769#undef MAKE_STRUCT_PREDICATE
770
771
772bool Object::IsUndefined() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000773 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUndefined;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000774}
775
776
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000777bool Object::IsNull() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000778 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kNull;
779}
780
781
782bool Object::IsTheHole() {
783 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTheHole;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000784}
785
786
787bool Object::IsTrue() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000788 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTrue;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000789}
790
791
792bool Object::IsFalse() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000793 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000794}
795
796
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000797bool Object::IsArgumentsMarker() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000798 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker;
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000799}
800
801
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000802double Object::Number() {
803 ASSERT(IsNumber());
804 return IsSmi()
805 ? static_cast<double>(reinterpret_cast<Smi*>(this)->value())
806 : reinterpret_cast<HeapNumber*>(this)->value();
807}
808
809
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000810bool Object::IsNaN() {
811 return this->IsHeapNumber() && isnan(HeapNumber::cast(this)->value());
812}
813
814
lrn@chromium.org303ada72010-10-27 09:33:13 +0000815MaybeObject* Object::ToSmi() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000816 if (IsSmi()) return this;
817 if (IsHeapNumber()) {
818 double value = HeapNumber::cast(this)->value();
819 int int_value = FastD2I(value);
820 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) {
821 return Smi::FromInt(int_value);
822 }
823 }
824 return Failure::Exception();
825}
826
827
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000828bool Object::HasSpecificClassOf(String* name) {
829 return this->IsJSObject() && (JSObject::cast(this)->class_name() == name);
830}
831
832
lrn@chromium.org303ada72010-10-27 09:33:13 +0000833MaybeObject* Object::GetElement(uint32_t index) {
vegorov@chromium.org5d6c1f52011-02-28 13:13:38 +0000834 // GetElement can trigger a getter which can cause allocation.
835 // This was not always the case. This ASSERT is here to catch
836 // leftover incorrect uses.
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000837 ASSERT(HEAP->IsAllocationAllowed());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000838 return GetElementWithReceiver(this, index);
839}
840
841
lrn@chromium.org303ada72010-10-27 09:33:13 +0000842Object* Object::GetElementNoExceptionThrown(uint32_t index) {
843 MaybeObject* maybe = GetElementWithReceiver(this, index);
844 ASSERT(!maybe->IsFailure());
845 Object* result = NULL; // Initialization to please compiler.
846 maybe->ToObject(&result);
847 return result;
848}
849
850
851MaybeObject* Object::GetProperty(String* key) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000852 PropertyAttributes attributes;
853 return GetPropertyWithReceiver(this, key, &attributes);
854}
855
856
lrn@chromium.org303ada72010-10-27 09:33:13 +0000857MaybeObject* Object::GetProperty(String* key, PropertyAttributes* attributes) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000858 return GetPropertyWithReceiver(this, key, attributes);
859}
860
861
862#define FIELD_ADDR(p, offset) \
863 (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag)
864
865#define READ_FIELD(p, offset) \
866 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)))
867
868#define WRITE_FIELD(p, offset, value) \
869 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value)
870
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000871#define WRITE_BARRIER(heap, object, offset, value) \
872 heap->incremental_marking()->RecordWrite( \
873 object, HeapObject::RawField(object, offset), value); \
874 if (heap->InNewSpace(value)) { \
875 heap->RecordWrite(object->address(), offset); \
876 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000877
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000878#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \
879 if (mode == UPDATE_WRITE_BARRIER) { \
880 heap->incremental_marking()->RecordWrite( \
881 object, HeapObject::RawField(object, offset), value); \
882 if (heap->InNewSpace(value)) { \
883 heap->RecordWrite(object->address(), offset); \
884 } \
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000885 }
886
lrn@chromium.org7516f052011-03-30 08:52:27 +0000887#ifndef V8_TARGET_ARCH_MIPS
888 #define READ_DOUBLE_FIELD(p, offset) \
889 (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)))
890#else // V8_TARGET_ARCH_MIPS
891 // Prevent gcc from using load-double (mips ldc1) on (possibly)
892 // non-64-bit aligned HeapNumber::value.
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000893 static inline double read_double_field(void* p, int offset) {
lrn@chromium.org7516f052011-03-30 08:52:27 +0000894 union conversion {
895 double d;
896 uint32_t u[2];
897 } c;
898 c.u[0] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)));
899 c.u[1] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4)));
900 return c.d;
901 }
902 #define READ_DOUBLE_FIELD(p, offset) read_double_field(p, offset)
903#endif // V8_TARGET_ARCH_MIPS
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000904
lrn@chromium.org7516f052011-03-30 08:52:27 +0000905#ifndef V8_TARGET_ARCH_MIPS
906 #define WRITE_DOUBLE_FIELD(p, offset, value) \
907 (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value)
908#else // V8_TARGET_ARCH_MIPS
909 // Prevent gcc from using store-double (mips sdc1) on (possibly)
910 // non-64-bit aligned HeapNumber::value.
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000911 static inline void write_double_field(void* p, int offset,
lrn@chromium.org7516f052011-03-30 08:52:27 +0000912 double value) {
913 union conversion {
914 double d;
915 uint32_t u[2];
916 } c;
917 c.d = value;
918 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) = c.u[0];
919 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4))) = c.u[1];
920 }
921 #define WRITE_DOUBLE_FIELD(p, offset, value) \
922 write_double_field(p, offset, value)
923#endif // V8_TARGET_ARCH_MIPS
924
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000925
926#define READ_INT_FIELD(p, offset) \
927 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)))
928
929#define WRITE_INT_FIELD(p, offset, value) \
930 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value)
931
ager@chromium.org3e875802009-06-29 08:26:34 +0000932#define READ_INTPTR_FIELD(p, offset) \
933 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)))
934
935#define WRITE_INTPTR_FIELD(p, offset, value) \
936 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value)
937
ager@chromium.org7c537e22008-10-16 08:43:32 +0000938#define READ_UINT32_FIELD(p, offset) \
939 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)))
940
941#define WRITE_UINT32_FIELD(p, offset, value) \
942 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value)
943
danno@chromium.org88aa0582012-03-23 15:11:57 +0000944#define READ_INT64_FIELD(p, offset) \
945 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)))
946
947#define WRITE_INT64_FIELD(p, offset, value) \
948 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value)
949
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000950#define READ_SHORT_FIELD(p, offset) \
951 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)))
952
953#define WRITE_SHORT_FIELD(p, offset, value) \
954 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value)
955
956#define READ_BYTE_FIELD(p, offset) \
957 (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)))
958
959#define WRITE_BYTE_FIELD(p, offset, value) \
960 (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value)
961
962
kasperl@chromium.org9bbf9682008-10-30 11:53:07 +0000963Object** HeapObject::RawField(HeapObject* obj, int byte_offset) {
964 return &READ_FIELD(obj, byte_offset);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000965}
966
967
968int Smi::value() {
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000969 return Internals::SmiValue(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000970}
971
972
973Smi* Smi::FromInt(int value) {
974 ASSERT(Smi::IsValid(value));
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000975 int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
ager@chromium.org9085a012009-05-11 19:22:57 +0000976 intptr_t tagged_value =
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000977 (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag;
ager@chromium.org9085a012009-05-11 19:22:57 +0000978 return reinterpret_cast<Smi*>(tagged_value);
979}
980
981
982Smi* Smi::FromIntptr(intptr_t value) {
983 ASSERT(Smi::IsValid(value));
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000984 int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
985 return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000986}
987
988
989Failure::Type Failure::type() const {
990 return static_cast<Type>(value() & kFailureTypeTagMask);
991}
992
993
994bool Failure::IsInternalError() const {
995 return type() == INTERNAL_ERROR;
996}
997
998
999bool Failure::IsOutOfMemoryException() const {
1000 return type() == OUT_OF_MEMORY_EXCEPTION;
1001}
1002
1003
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001004AllocationSpace Failure::allocation_space() const {
1005 ASSERT_EQ(RETRY_AFTER_GC, type());
1006 return static_cast<AllocationSpace>((value() >> kFailureTypeTagSize)
1007 & kSpaceTagMask);
1008}
1009
1010
1011Failure* Failure::InternalError() {
1012 return Construct(INTERNAL_ERROR);
1013}
1014
1015
1016Failure* Failure::Exception() {
1017 return Construct(EXCEPTION);
1018}
1019
sgjesse@chromium.orgc81c8942009-08-21 10:54:26 +00001020
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001021Failure* Failure::OutOfMemoryException() {
1022 return Construct(OUT_OF_MEMORY_EXCEPTION);
1023}
1024
1025
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001026intptr_t Failure::value() const {
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001027 return static_cast<intptr_t>(
1028 reinterpret_cast<uintptr_t>(this) >> kFailureTagSize);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001029}
1030
1031
whesse@chromium.org4a5224e2010-10-20 12:37:07 +00001032Failure* Failure::RetryAfterGC() {
1033 return RetryAfterGC(NEW_SPACE);
1034}
1035
1036
1037Failure* Failure::RetryAfterGC(AllocationSpace space) {
1038 ASSERT((space & ~kSpaceTagMask) == 0);
1039 return Construct(RETRY_AFTER_GC, space);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001040}
1041
1042
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001043Failure* Failure::Construct(Type type, intptr_t value) {
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001044 uintptr_t info =
1045 (static_cast<uintptr_t>(value) << kFailureTypeTagSize) | type;
ager@chromium.orgab99eea2009-08-25 07:05:41 +00001046 ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info);
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001047 return reinterpret_cast<Failure*>((info << kFailureTagSize) | kFailureTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001048}
1049
1050
ager@chromium.orgab99eea2009-08-25 07:05:41 +00001051bool Smi::IsValid(intptr_t value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001052#ifdef DEBUG
1053 bool in_range = (value >= kMinValue) && (value <= kMaxValue);
1054#endif
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001055
1056#ifdef V8_TARGET_ARCH_X64
1057 // To be representable as a long smi, the value must be a 32-bit integer.
1058 bool result = (value == static_cast<int32_t>(value));
1059#else
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001060 // To be representable as an tagged small integer, the two
1061 // most-significant bits of 'value' must be either 00 or 11 due to
1062 // sign-extension. To check this we add 01 to the two
1063 // most-significant bits, and check if the most-significant bit is 0
1064 //
1065 // CAUTION: The original code below:
1066 // bool result = ((value + 0x40000000) & 0x80000000) == 0;
1067 // may lead to incorrect results according to the C language spec, and
1068 // in fact doesn't work correctly with gcc4.1.1 in some cases: The
1069 // compiler may produce undefined results in case of signed integer
1070 // overflow. The computation must be done w/ unsigned ints.
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001071 bool result = (static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U);
ager@chromium.org9085a012009-05-11 19:22:57 +00001072#endif
ager@chromium.org9085a012009-05-11 19:22:57 +00001073 ASSERT(result == in_range);
1074 return result;
1075}
1076
1077
kasper.lund7276f142008-07-30 08:49:36 +00001078MapWord MapWord::FromMap(Map* map) {
1079 return MapWord(reinterpret_cast<uintptr_t>(map));
1080}
1081
1082
1083Map* MapWord::ToMap() {
1084 return reinterpret_cast<Map*>(value_);
1085}
1086
1087
1088bool MapWord::IsForwardingAddress() {
ager@chromium.org7c537e22008-10-16 08:43:32 +00001089 return HAS_SMI_TAG(reinterpret_cast<Object*>(value_));
kasper.lund7276f142008-07-30 08:49:36 +00001090}
1091
1092
1093MapWord MapWord::FromForwardingAddress(HeapObject* object) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00001094 Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag;
1095 return MapWord(reinterpret_cast<uintptr_t>(raw));
kasper.lund7276f142008-07-30 08:49:36 +00001096}
1097
1098
1099HeapObject* MapWord::ToForwardingAddress() {
1100 ASSERT(IsForwardingAddress());
ager@chromium.org7c537e22008-10-16 08:43:32 +00001101 return HeapObject::FromAddress(reinterpret_cast<Address>(value_));
kasper.lund7276f142008-07-30 08:49:36 +00001102}
1103
1104
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001105#ifdef DEBUG
1106void HeapObject::VerifyObjectField(int offset) {
1107 VerifyPointer(READ_FIELD(this, offset));
1108}
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001109
1110void HeapObject::VerifySmiField(int offset) {
1111 ASSERT(READ_FIELD(this, offset)->IsSmi());
1112}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001113#endif
1114
1115
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001116Heap* HeapObject::GetHeap() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001117 Heap* heap =
1118 MemoryChunk::FromAddress(reinterpret_cast<Address>(this))->heap();
1119 ASSERT(heap != NULL);
1120 ASSERT(heap->isolate() == Isolate::Current());
1121 return heap;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001122}
1123
1124
1125Isolate* HeapObject::GetIsolate() {
1126 return GetHeap()->isolate();
1127}
1128
1129
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001130Map* HeapObject::map() {
kasper.lund7276f142008-07-30 08:49:36 +00001131 return map_word().ToMap();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001132}
1133
1134
1135void HeapObject::set_map(Map* value) {
kasper.lund7276f142008-07-30 08:49:36 +00001136 set_map_word(MapWord::FromMap(value));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001137 if (value != NULL) {
1138 // TODO(1600) We are passing NULL as a slot because maps can never be on
1139 // evacuation candidate.
1140 value->GetHeap()->incremental_marking()->RecordWrite(this, NULL, value);
1141 }
1142}
1143
1144
1145// Unsafe accessor omitting write barrier.
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001146void HeapObject::set_map_no_write_barrier(Map* value) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001147 set_map_word(MapWord::FromMap(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001148}
1149
1150
kasper.lund7276f142008-07-30 08:49:36 +00001151MapWord HeapObject::map_word() {
1152 return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset)));
1153}
1154
1155
1156void HeapObject::set_map_word(MapWord map_word) {
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001157 // WRITE_FIELD does not invoke write barrier, but there is no need
kasper.lund7276f142008-07-30 08:49:36 +00001158 // here.
1159 WRITE_FIELD(this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
1160}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001161
1162
1163HeapObject* HeapObject::FromAddress(Address address) {
1164 ASSERT_TAG_ALIGNED(address);
1165 return reinterpret_cast<HeapObject*>(address + kHeapObjectTag);
1166}
1167
1168
1169Address HeapObject::address() {
1170 return reinterpret_cast<Address>(this) - kHeapObjectTag;
1171}
1172
1173
1174int HeapObject::Size() {
1175 return SizeFromMap(map());
1176}
1177
1178
1179void HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) {
1180 v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)),
1181 reinterpret_cast<Object**>(FIELD_ADDR(this, end)));
1182}
1183
1184
1185void HeapObject::IteratePointer(ObjectVisitor* v, int offset) {
1186 v->VisitPointer(reinterpret_cast<Object**>(FIELD_ADDR(this, offset)));
1187}
1188
1189
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001190double HeapNumber::value() {
1191 return READ_DOUBLE_FIELD(this, kValueOffset);
1192}
1193
1194
1195void HeapNumber::set_value(double value) {
1196 WRITE_DOUBLE_FIELD(this, kValueOffset, value);
1197}
1198
1199
whesse@chromium.orgcec079d2010-03-22 14:44:04 +00001200int HeapNumber::get_exponent() {
1201 return ((READ_INT_FIELD(this, kExponentOffset) & kExponentMask) >>
1202 kExponentShift) - kExponentBias;
1203}
1204
1205
1206int HeapNumber::get_sign() {
1207 return READ_INT_FIELD(this, kExponentOffset) & kSignMask;
1208}
1209
1210
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001211ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001212
1213
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001214Object** FixedArray::GetFirstElementAddress() {
1215 return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0)));
1216}
1217
1218
1219bool FixedArray::ContainsOnlySmisOrHoles() {
1220 Object* the_hole = GetHeap()->the_hole_value();
1221 Object** current = GetFirstElementAddress();
1222 for (int i = 0; i < length(); ++i) {
1223 Object* candidate = *current++;
1224 if (!candidate->IsSmi() && candidate != the_hole) return false;
1225 }
1226 return true;
1227}
1228
1229
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +00001230FixedArrayBase* JSObject::elements() {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001231 Object* array = READ_FIELD(this, kElementsOffset);
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +00001232 return static_cast<FixedArrayBase*>(array);
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001233}
1234
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001235
1236void JSObject::ValidateElements() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001237#if DEBUG
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001238 if (FLAG_enable_slow_asserts) {
1239 ElementsAccessor* accessor = GetElementsAccessor();
1240 accessor->Validate(this);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001241 }
1242#endif
1243}
1244
1245
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001246MaybeObject* JSObject::EnsureCanContainHeapObjectElements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001247 ValidateElements();
1248 ElementsKind elements_kind = map()->elements_kind();
1249 if (!IsFastObjectElementsKind(elements_kind)) {
1250 if (IsFastHoleyElementsKind(elements_kind)) {
1251 return TransitionElementsKind(FAST_HOLEY_ELEMENTS);
1252 } else {
1253 return TransitionElementsKind(FAST_ELEMENTS);
1254 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001255 }
1256 return this;
1257}
1258
1259
1260MaybeObject* JSObject::EnsureCanContainElements(Object** objects,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001261 uint32_t count,
1262 EnsureElementsMode mode) {
1263 ElementsKind current_kind = map()->elements_kind();
1264 ElementsKind target_kind = current_kind;
1265 ASSERT(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001266 bool is_holey = IsFastHoleyElementsKind(current_kind);
1267 if (current_kind == FAST_HOLEY_ELEMENTS) return this;
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001268 Heap* heap = GetHeap();
1269 Object* the_hole = heap->the_hole_value();
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001270 for (uint32_t i = 0; i < count; ++i) {
1271 Object* current = *objects++;
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001272 if (current == the_hole) {
1273 is_holey = true;
1274 target_kind = GetHoleyElementsKind(target_kind);
1275 } else if (!current->IsSmi()) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001276 if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && current->IsNumber()) {
1277 if (IsFastSmiElementsKind(target_kind)) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001278 if (is_holey) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001279 target_kind = FAST_HOLEY_DOUBLE_ELEMENTS;
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001280 } else {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001281 target_kind = FAST_DOUBLE_ELEMENTS;
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001282 }
1283 }
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001284 } else if (is_holey) {
1285 target_kind = FAST_HOLEY_ELEMENTS;
1286 break;
1287 } else {
1288 target_kind = FAST_ELEMENTS;
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001289 }
1290 }
1291 }
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001292
1293 if (target_kind != current_kind) {
1294 return TransitionElementsKind(target_kind);
1295 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001296 return this;
1297}
1298
1299
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001300MaybeObject* JSObject::EnsureCanContainElements(FixedArrayBase* elements,
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001301 uint32_t length,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001302 EnsureElementsMode mode) {
1303 if (elements->map() != GetHeap()->fixed_double_array_map()) {
1304 ASSERT(elements->map() == GetHeap()->fixed_array_map() ||
1305 elements->map() == GetHeap()->fixed_cow_array_map());
1306 if (mode == ALLOW_COPIED_DOUBLE_ELEMENTS) {
1307 mode = DONT_ALLOW_DOUBLE_ELEMENTS;
1308 }
1309 Object** objects = FixedArray::cast(elements)->GetFirstElementAddress();
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001310 return EnsureCanContainElements(objects, length, mode);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001311 }
1312
1313 ASSERT(mode == ALLOW_COPIED_DOUBLE_ELEMENTS);
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001314 if (GetElementsKind() == FAST_HOLEY_SMI_ELEMENTS) {
1315 return TransitionElementsKind(FAST_HOLEY_DOUBLE_ELEMENTS);
1316 } else if (GetElementsKind() == FAST_SMI_ELEMENTS) {
1317 FixedDoubleArray* double_array = FixedDoubleArray::cast(elements);
1318 for (uint32_t i = 0; i < length; ++i) {
1319 if (double_array->is_the_hole(i)) {
1320 return TransitionElementsKind(FAST_HOLEY_DOUBLE_ELEMENTS);
1321 }
1322 }
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001323 return TransitionElementsKind(FAST_DOUBLE_ELEMENTS);
1324 }
1325
1326 return this;
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001327}
1328
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001329
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001330MaybeObject* JSObject::GetElementsTransitionMap(Isolate* isolate,
1331 ElementsKind to_kind) {
1332 Map* current_map = map();
1333 ElementsKind from_kind = current_map->elements_kind();
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001334 if (from_kind == to_kind) return current_map;
1335
1336 Context* global_context = isolate->context()->global_context();
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001337 Object* maybe_array_maps = global_context->js_array_maps();
1338 if (maybe_array_maps->IsFixedArray()) {
1339 FixedArray* array_maps = FixedArray::cast(maybe_array_maps);
1340 if (array_maps->get(from_kind) == current_map) {
1341 Object* maybe_transitioned_map = array_maps->get(to_kind);
1342 if (maybe_transitioned_map->IsMap()) {
1343 return Map::cast(maybe_transitioned_map);
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001344 }
1345 }
1346 }
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001347
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001348 return GetElementsTransitionMapSlow(to_kind);
1349}
1350
1351
svenpanne@chromium.org3c93e772012-01-02 09:26:59 +00001352void JSObject::set_map_and_elements(Map* new_map,
1353 FixedArrayBase* value,
1354 WriteBarrierMode mode) {
1355 ASSERT(value->HasValidElements());
svenpanne@chromium.org3c93e772012-01-02 09:26:59 +00001356 if (new_map != NULL) {
1357 if (mode == UPDATE_WRITE_BARRIER) {
1358 set_map(new_map);
1359 } else {
1360 ASSERT(mode == SKIP_WRITE_BARRIER);
1361 set_map_no_write_barrier(new_map);
1362 }
1363 }
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001364 ASSERT((map()->has_fast_smi_or_object_elements() ||
ulan@chromium.org65a89c22012-02-14 11:46:07 +00001365 (value == GetHeap()->empty_fixed_array())) ==
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001366 (value->map() == GetHeap()->fixed_array_map() ||
1367 value->map() == GetHeap()->fixed_cow_array_map()));
ulan@chromium.org65a89c22012-02-14 11:46:07 +00001368 ASSERT((value == GetHeap()->empty_fixed_array()) ||
1369 (map()->has_fast_double_elements() == value->IsFixedDoubleArray()));
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001370 WRITE_FIELD(this, kElementsOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001371 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001372}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001373
1374
svenpanne@chromium.org3c93e772012-01-02 09:26:59 +00001375void JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) {
1376 set_map_and_elements(NULL, value, mode);
1377}
1378
1379
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001380void JSObject::initialize_properties() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001381 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
1382 WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001383}
1384
1385
1386void JSObject::initialize_elements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001387 ASSERT(map()->has_fast_smi_or_object_elements() ||
danno@chromium.org2c26cb12012-05-03 09:06:43 +00001388 map()->has_fast_double_elements());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001389 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
1390 WRITE_FIELD(this, kElementsOffset, GetHeap()->empty_fixed_array());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001391}
1392
1393
lrn@chromium.org303ada72010-10-27 09:33:13 +00001394MaybeObject* JSObject::ResetElements() {
1395 Object* obj;
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001396 ElementsKind elements_kind = GetInitialFastElementsKind();
1397 if (!FLAG_smi_only_arrays) {
1398 elements_kind = FastSmiToObjectElementsKind(elements_kind);
1399 }
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001400 MaybeObject* maybe_obj = GetElementsTransitionMap(GetIsolate(),
1401 elements_kind);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001402 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
fschneider@chromium.org40b9da32010-06-28 11:29:21 +00001403 set_map(Map::cast(obj));
1404 initialize_elements();
1405 return this;
1406}
1407
1408
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001409ACCESSORS(Oddball, to_string, String, kToStringOffset)
1410ACCESSORS(Oddball, to_number, Object, kToNumberOffset)
1411
1412
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001413byte Oddball::kind() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001414 return Smi::cast(READ_FIELD(this, kKindOffset))->value();
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001415}
1416
1417
1418void Oddball::set_kind(byte value) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001419 WRITE_FIELD(this, kKindOffset, Smi::FromInt(value));
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001420}
1421
1422
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00001423Object* JSGlobalPropertyCell::value() {
1424 return READ_FIELD(this, kValueOffset);
1425}
1426
1427
1428void JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) {
1429 // The write barrier is not used for global property cells.
1430 ASSERT(!val->IsJSGlobalPropertyCell());
1431 WRITE_FIELD(this, kValueOffset, val);
1432}
1433
kasperl@chromium.org2abc4502009-07-02 07:00:29 +00001434
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001435int JSObject::GetHeaderSize() {
kasperl@chromium.orge959c182009-07-27 08:59:04 +00001436 InstanceType type = map()->instance_type();
1437 // Check for the most common kind of JavaScript object before
1438 // falling into the generic switch. This speeds up the internal
1439 // field operations considerably on average.
1440 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize;
1441 switch (type) {
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00001442 case JS_MODULE_TYPE:
1443 return JSModule::kSize;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001444 case JS_GLOBAL_PROXY_TYPE:
1445 return JSGlobalProxy::kSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001446 case JS_GLOBAL_OBJECT_TYPE:
1447 return JSGlobalObject::kSize;
1448 case JS_BUILTINS_OBJECT_TYPE:
1449 return JSBuiltinsObject::kSize;
1450 case JS_FUNCTION_TYPE:
1451 return JSFunction::kSize;
1452 case JS_VALUE_TYPE:
1453 return JSValue::kSize;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +00001454 case JS_DATE_TYPE:
1455 return JSDate::kSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001456 case JS_ARRAY_TYPE:
ulan@chromium.org2efb9002012-01-19 15:36:35 +00001457 return JSArray::kSize;
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001458 case JS_WEAK_MAP_TYPE:
1459 return JSWeakMap::kSize;
ager@chromium.org236ad962008-09-25 09:45:57 +00001460 case JS_REGEXP_TYPE:
ulan@chromium.org2efb9002012-01-19 15:36:35 +00001461 return JSRegExp::kSize;
ager@chromium.org32912102009-01-16 10:38:43 +00001462 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001463 return JSObject::kHeaderSize;
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00001464 case JS_MESSAGE_OBJECT_TYPE:
1465 return JSMessageObject::kSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001466 default:
1467 UNREACHABLE();
1468 return 0;
1469 }
1470}
1471
1472
1473int JSObject::GetInternalFieldCount() {
1474 ASSERT(1 << kPointerSizeLog2 == kPointerSize);
ager@chromium.org7c537e22008-10-16 08:43:32 +00001475 // Make sure to adjust for the number of in-object properties. These
1476 // properties do contribute to the size, but are not internal fields.
1477 return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) -
1478 map()->inobject_properties();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001479}
1480
1481
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001482int JSObject::GetInternalFieldOffset(int index) {
1483 ASSERT(index < GetInternalFieldCount() && index >= 0);
1484 return GetHeaderSize() + (kPointerSize * index);
1485}
1486
1487
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001488Object* JSObject::GetInternalField(int index) {
1489 ASSERT(index < GetInternalFieldCount() && index >= 0);
ager@chromium.org7c537e22008-10-16 08:43:32 +00001490 // Internal objects do follow immediately after the header, whereas in-object
1491 // properties are at the end of the object. Therefore there is no need
1492 // to adjust the index here.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001493 return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index));
1494}
1495
1496
1497void JSObject::SetInternalField(int index, Object* value) {
1498 ASSERT(index < GetInternalFieldCount() && index >= 0);
ager@chromium.org7c537e22008-10-16 08:43:32 +00001499 // Internal objects do follow immediately after the header, whereas in-object
1500 // properties are at the end of the object. Therefore there is no need
1501 // to adjust the index here.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001502 int offset = GetHeaderSize() + (kPointerSize * index);
1503 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001504 WRITE_BARRIER(GetHeap(), this, offset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001505}
1506
1507
ricow@chromium.org27bf2882011-11-17 08:34:43 +00001508void JSObject::SetInternalField(int index, Smi* value) {
1509 ASSERT(index < GetInternalFieldCount() && index >= 0);
1510 // Internal objects do follow immediately after the header, whereas in-object
1511 // properties are at the end of the object. Therefore there is no need
1512 // to adjust the index here.
1513 int offset = GetHeaderSize() + (kPointerSize * index);
1514 WRITE_FIELD(this, offset, value);
1515}
1516
1517
ager@chromium.org7c537e22008-10-16 08:43:32 +00001518// Access fast-case object properties at index. The use of these routines
1519// is needed to correctly distinguish between properties stored in-object and
1520// properties stored in the properties array.
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001521Object* JSObject::FastPropertyAt(int index) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00001522 // Adjust for the number of properties stored in the object.
1523 index -= map()->inobject_properties();
1524 if (index < 0) {
1525 int offset = map()->instance_size() + (index * kPointerSize);
1526 return READ_FIELD(this, offset);
1527 } else {
1528 ASSERT(index < properties()->length());
1529 return properties()->get(index);
1530 }
1531}
1532
1533
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001534Object* JSObject::FastPropertyAtPut(int index, Object* value) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00001535 // Adjust for the number of properties stored in the object.
1536 index -= map()->inobject_properties();
1537 if (index < 0) {
1538 int offset = map()->instance_size() + (index * kPointerSize);
1539 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001540 WRITE_BARRIER(GetHeap(), this, offset, value);
ager@chromium.org7c537e22008-10-16 08:43:32 +00001541 } else {
1542 ASSERT(index < properties()->length());
1543 properties()->set(index, value);
1544 }
1545 return value;
1546}
1547
1548
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001549int JSObject::GetInObjectPropertyOffset(int index) {
1550 // Adjust for the number of properties stored in the object.
1551 index -= map()->inobject_properties();
1552 ASSERT(index < 0);
1553 return map()->instance_size() + (index * kPointerSize);
1554}
1555
1556
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001557Object* JSObject::InObjectPropertyAt(int index) {
1558 // Adjust for the number of properties stored in the object.
1559 index -= map()->inobject_properties();
1560 ASSERT(index < 0);
1561 int offset = map()->instance_size() + (index * kPointerSize);
1562 return READ_FIELD(this, offset);
1563}
1564
1565
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001566Object* JSObject::InObjectPropertyAtPut(int index,
1567 Object* value,
1568 WriteBarrierMode mode) {
1569 // Adjust for the number of properties stored in the object.
1570 index -= map()->inobject_properties();
1571 ASSERT(index < 0);
1572 int offset = map()->instance_size() + (index * kPointerSize);
1573 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001574 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001575 return value;
1576}
1577
1578
1579
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001580void JSObject::InitializeBody(Map* map,
1581 Object* pre_allocated_value,
1582 Object* filler_value) {
1583 ASSERT(!filler_value->IsHeapObject() ||
1584 !GetHeap()->InNewSpace(filler_value));
1585 ASSERT(!pre_allocated_value->IsHeapObject() ||
1586 !GetHeap()->InNewSpace(pre_allocated_value));
1587 int size = map->instance_size();
1588 int offset = kHeaderSize;
1589 if (filler_value != pre_allocated_value) {
1590 int pre_allocated = map->pre_allocated_property_fields();
1591 ASSERT(pre_allocated * kPointerSize + kHeaderSize <= size);
1592 for (int i = 0; i < pre_allocated; i++) {
1593 WRITE_FIELD(this, offset, pre_allocated_value);
1594 offset += kPointerSize;
1595 }
1596 }
1597 while (offset < size) {
1598 WRITE_FIELD(this, offset, filler_value);
1599 offset += kPointerSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001600 }
1601}
1602
1603
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001604bool JSObject::HasFastProperties() {
1605 return !properties()->IsDictionary();
1606}
1607
1608
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001609bool JSObject::TooManyFastProperties(int properties,
1610 JSObject::StoreFromKeyed store_mode) {
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001611 // Allow extra fast properties if the object has more than
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001612 // kFastPropertiesSoftLimit in-object properties. When this is the case,
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001613 // it is very unlikely that the object is being used as a dictionary
1614 // and there is a good chance that allowing more map transitions
1615 // will be worth it.
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001616 int inobject = map()->inobject_properties();
1617
1618 int limit;
ulan@chromium.orgf6a0c412012-06-15 12:31:06 +00001619 if (store_mode == CERTAINLY_NOT_STORE_FROM_KEYED) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001620 limit = Max(inobject, kMaxFastProperties);
1621 } else {
1622 limit = Max(inobject, kFastPropertiesSoftLimit);
1623 }
1624 return properties > limit;
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001625}
1626
1627
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001628void Struct::InitializeBody(int object_size) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001629 Object* value = GetHeap()->undefined_value();
ager@chromium.org236ad962008-09-25 09:45:57 +00001630 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001631 WRITE_FIELD(this, offset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001632 }
1633}
1634
1635
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001636bool Object::ToArrayIndex(uint32_t* index) {
1637 if (IsSmi()) {
1638 int value = Smi::cast(this)->value();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001639 if (value < 0) return false;
1640 *index = value;
1641 return true;
1642 }
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001643 if (IsHeapNumber()) {
1644 double value = HeapNumber::cast(this)->value();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001645 uint32_t uint_value = static_cast<uint32_t>(value);
1646 if (value == static_cast<double>(uint_value)) {
1647 *index = uint_value;
1648 return true;
1649 }
1650 }
1651 return false;
1652}
1653
1654
1655bool Object::IsStringObjectWithCharacterAt(uint32_t index) {
1656 if (!this->IsJSValue()) return false;
1657
1658 JSValue* js_value = JSValue::cast(this);
1659 if (!js_value->value()->IsString()) return false;
1660
1661 String* str = String::cast(js_value->value());
1662 if (index >= (uint32_t)str->length()) return false;
1663
1664 return true;
1665}
1666
1667
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001668FixedArrayBase* FixedArrayBase::cast(Object* object) {
1669 ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray());
1670 return reinterpret_cast<FixedArrayBase*>(object);
1671}
1672
1673
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001674Object* FixedArray::get(int index) {
1675 ASSERT(index >= 0 && index < this->length());
1676 return READ_FIELD(this, kHeaderSize + index * kPointerSize);
1677}
1678
1679
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001680bool FixedArray::is_the_hole(int index) {
1681 return get(index) == GetHeap()->the_hole_value();
1682}
1683
1684
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001685void FixedArray::set(int index, Smi* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001686 ASSERT(map() != HEAP->fixed_cow_array_map());
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001687 ASSERT(index >= 0 && index < this->length());
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001688 ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1689 int offset = kHeaderSize + index * kPointerSize;
1690 WRITE_FIELD(this, offset, value);
1691}
1692
1693
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001694void FixedArray::set(int index, Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001695 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001696 ASSERT(index >= 0 && index < this->length());
1697 int offset = kHeaderSize + index * kPointerSize;
1698 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001699 WRITE_BARRIER(GetHeap(), this, offset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001700}
1701
1702
svenpanne@chromium.org84bcc552011-07-18 09:50:57 +00001703inline bool FixedDoubleArray::is_the_hole_nan(double value) {
1704 return BitCast<uint64_t, double>(value) == kHoleNanInt64;
1705}
1706
1707
1708inline double FixedDoubleArray::hole_nan_as_double() {
1709 return BitCast<double, uint64_t>(kHoleNanInt64);
1710}
1711
1712
1713inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() {
1714 ASSERT(BitCast<uint64_t>(OS::nan_value()) != kHoleNanInt64);
1715 ASSERT((BitCast<uint64_t>(OS::nan_value()) >> 32) != kHoleNanUpper32);
1716 return OS::nan_value();
1717}
1718
1719
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001720double FixedDoubleArray::get_scalar(int index) {
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001721 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1722 map() != HEAP->fixed_array_map());
1723 ASSERT(index >= 0 && index < this->length());
1724 double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize);
1725 ASSERT(!is_the_hole_nan(result));
1726 return result;
1727}
1728
danno@chromium.org88aa0582012-03-23 15:11:57 +00001729int64_t FixedDoubleArray::get_representation(int index) {
1730 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1731 map() != HEAP->fixed_array_map());
1732 ASSERT(index >= 0 && index < this->length());
1733 return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize);
1734}
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001735
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001736MaybeObject* FixedDoubleArray::get(int index) {
1737 if (is_the_hole(index)) {
1738 return GetHeap()->the_hole_value();
1739 } else {
1740 return GetHeap()->NumberFromDouble(get_scalar(index));
1741 }
1742}
1743
1744
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001745void FixedDoubleArray::set(int index, double value) {
1746 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1747 map() != HEAP->fixed_array_map());
1748 int offset = kHeaderSize + index * kDoubleSize;
1749 if (isnan(value)) value = canonical_not_the_hole_nan_as_double();
1750 WRITE_DOUBLE_FIELD(this, offset, value);
1751}
1752
1753
1754void FixedDoubleArray::set_the_hole(int index) {
1755 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1756 map() != HEAP->fixed_array_map());
1757 int offset = kHeaderSize + index * kDoubleSize;
1758 WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double());
1759}
1760
1761
1762bool FixedDoubleArray::is_the_hole(int index) {
1763 int offset = kHeaderSize + index * kDoubleSize;
1764 return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset));
1765}
1766
1767
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00001768WriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001769 Heap* heap = GetHeap();
1770 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
1771 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001772 return UPDATE_WRITE_BARRIER;
1773}
1774
1775
1776void FixedArray::set(int index,
1777 Object* value,
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001778 WriteBarrierMode mode) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001779 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001780 ASSERT(index >= 0 && index < this->length());
1781 int offset = kHeaderSize + index * kPointerSize;
1782 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001783 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001784}
1785
1786
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001787void FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array,
1788 int index,
1789 Object* value) {
1790 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map());
1791 ASSERT(index >= 0 && index < array->length());
1792 int offset = kHeaderSize + index * kPointerSize;
1793 WRITE_FIELD(array, offset, value);
1794 Heap* heap = array->GetHeap();
1795 if (heap->InNewSpace(value)) {
1796 heap->RecordWrite(array->address(), offset);
1797 }
1798}
1799
1800
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00001801void FixedArray::NoWriteBarrierSet(FixedArray* array,
1802 int index,
1803 Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001804 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001805 ASSERT(index >= 0 && index < array->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001806 ASSERT(!HEAP->InNewSpace(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001807 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value);
1808}
1809
1810
1811void FixedArray::set_undefined(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001812 ASSERT(map() != HEAP->fixed_cow_array_map());
1813 set_undefined(GetHeap(), index);
1814}
1815
1816
1817void FixedArray::set_undefined(Heap* heap, int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001818 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001819 ASSERT(!heap->InNewSpace(heap->undefined_value()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001820 WRITE_FIELD(this, kHeaderSize + index * kPointerSize,
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001821 heap->undefined_value());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001822}
1823
1824
ager@chromium.org236ad962008-09-25 09:45:57 +00001825void FixedArray::set_null(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001826 set_null(GetHeap(), index);
1827}
1828
1829
1830void FixedArray::set_null(Heap* heap, int index) {
ager@chromium.org236ad962008-09-25 09:45:57 +00001831 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001832 ASSERT(!heap->InNewSpace(heap->null_value()));
1833 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
ager@chromium.org236ad962008-09-25 09:45:57 +00001834}
1835
1836
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001837void FixedArray::set_the_hole(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001838 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001839 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001840 ASSERT(!HEAP->InNewSpace(HEAP->the_hole_value()));
1841 WRITE_FIELD(this,
1842 kHeaderSize + index * kPointerSize,
1843 GetHeap()->the_hole_value());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001844}
1845
1846
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001847void FixedArray::set_unchecked(int index, Smi* value) {
1848 ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1849 int offset = kHeaderSize + index * kPointerSize;
1850 WRITE_FIELD(this, offset, value);
1851}
1852
1853
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001854void FixedArray::set_unchecked(Heap* heap,
1855 int index,
whesse@chromium.org4a5224e2010-10-20 12:37:07 +00001856 Object* value,
1857 WriteBarrierMode mode) {
1858 int offset = kHeaderSize + index * kPointerSize;
1859 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001860 CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode);
whesse@chromium.org4a5224e2010-10-20 12:37:07 +00001861}
1862
1863
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001864void FixedArray::set_null_unchecked(Heap* heap, int index) {
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001865 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001866 ASSERT(!HEAP->InNewSpace(heap->null_value()));
1867 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001868}
1869
1870
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001871Object** FixedArray::data_start() {
1872 return HeapObject::RawField(this, kHeaderSize);
1873}
1874
1875
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001876bool DescriptorArray::IsEmpty() {
yangguo@chromium.org5a11aaf2012-06-20 11:29:00 +00001877 ASSERT(length() >= kFirstIndex ||
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001878 this == HEAP->empty_descriptor_array());
yangguo@chromium.org5a11aaf2012-06-20 11:29:00 +00001879 return length() < kFirstIndex;
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001880}
1881
1882
1883bool DescriptorArray::MayContainTransitions() {
yangguo@chromium.org5a11aaf2012-06-20 11:29:00 +00001884 return !IsEmpty();
danno@chromium.org40cb8782011-05-25 07:58:50 +00001885}
1886
1887
1888int DescriptorArray::bit_field3_storage() {
1889 Object* storage = READ_FIELD(this, kBitField3StorageOffset);
1890 return Smi::cast(storage)->value();
1891}
1892
1893void DescriptorArray::set_bit_field3_storage(int value) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001894 ASSERT(this->MayContainTransitions());
danno@chromium.org40cb8782011-05-25 07:58:50 +00001895 WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value));
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001896}
1897
1898
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001899void DescriptorArray::NoIncrementalWriteBarrierSwap(FixedArray* array,
1900 int first,
1901 int second) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001902 Object* tmp = array->get(first);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001903 NoIncrementalWriteBarrierSet(array, first, array->get(second));
1904 NoIncrementalWriteBarrierSet(array, second, tmp);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001905}
1906
1907
1908int DescriptorArray::Search(String* name) {
1909 SLOW_ASSERT(IsSortedNoDuplicates());
1910
1911 // Check for empty descriptor array.
1912 int nof = number_of_descriptors();
1913 if (nof == 0) return kNotFound;
1914
1915 // Fast case: do linear search for small arrays.
1916 const int kMaxElementsForLinearSearch = 8;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001917 if (StringShape(name).IsSymbol() && nof < kMaxElementsForLinearSearch) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001918 return LinearSearch(EXPECT_SORTED, name, nof);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001919 }
1920
1921 // Slow case: perform binary search.
1922 return BinarySearch(name, 0, nof - 1);
1923}
1924
1925
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001926int DescriptorArray::SearchWithCache(String* name) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001927 int number = GetIsolate()->descriptor_lookup_cache()->Lookup(this, name);
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001928 if (number == DescriptorLookupCache::kAbsent) {
1929 number = Search(name);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001930 GetIsolate()->descriptor_lookup_cache()->Update(this, name, number);
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001931 }
1932 return number;
1933}
1934
1935
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001936Map* DescriptorArray::elements_transition_map() {
1937 if (!this->MayContainTransitions()) {
1938 return NULL;
1939 }
1940 Object* transition_map = get(kTransitionsIndex);
1941 if (transition_map == Smi::FromInt(0)) {
1942 return NULL;
1943 } else {
1944 return Map::cast(transition_map);
1945 }
1946}
1947
1948
1949void DescriptorArray::set_elements_transition_map(
1950 Map* transition_map, WriteBarrierMode mode) {
1951 ASSERT(this->length() > kTransitionsIndex);
1952 Heap* heap = GetHeap();
1953 WRITE_FIELD(this, kTransitionsOffset, transition_map);
1954 CONDITIONAL_WRITE_BARRIER(
1955 heap, this, kTransitionsOffset, transition_map, mode);
1956 ASSERT(DescriptorArray::cast(this));
1957}
1958
1959
yangguo@chromium.org5a11aaf2012-06-20 11:29:00 +00001960void DescriptorArray::ClearElementsTransition() {
1961 WRITE_FIELD(this, kTransitionsOffset, Smi::FromInt(0));
1962}
1963
1964
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001965Object** DescriptorArray::GetKeySlot(int descriptor_number) {
1966 ASSERT(descriptor_number < number_of_descriptors());
1967 return HeapObject::RawField(
1968 reinterpret_cast<HeapObject*>(this),
1969 OffsetOfElementAt(ToKeyIndex(descriptor_number)));
1970}
1971
1972
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001973String* DescriptorArray::GetKey(int descriptor_number) {
1974 ASSERT(descriptor_number < number_of_descriptors());
1975 return String::cast(get(ToKeyIndex(descriptor_number)));
1976}
1977
1978
verwaest@chromium.org37141392012-05-31 13:27:02 +00001979Object** DescriptorArray::GetValueSlot(int descriptor_number) {
1980 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001981 return HeapObject::RawField(
1982 reinterpret_cast<HeapObject*>(this),
1983 OffsetOfElementAt(ToValueIndex(descriptor_number)));
verwaest@chromium.org37141392012-05-31 13:27:02 +00001984}
1985
1986
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001987Object* DescriptorArray::GetValue(int descriptor_number) {
1988 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001989 return get(ToValueIndex(descriptor_number));
1990}
1991
1992
1993void DescriptorArray::SetNullValueUnchecked(int descriptor_number, Heap* heap) {
1994 ASSERT(descriptor_number < number_of_descriptors());
1995 set_null_unchecked(heap, ToValueIndex(descriptor_number));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001996}
1997
1998
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00001999PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002000 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002001 Object* details = get(ToDetailsIndex(descriptor_number));
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00002002 return PropertyDetails(Smi::cast(details));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002003}
2004
2005
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002006void DescriptorArray::SetDetailsUnchecked(int descriptor_number, Smi* value) {
2007 ASSERT(descriptor_number < number_of_descriptors());
2008 set_unchecked(ToDetailsIndex(descriptor_number), value);
2009}
2010
2011
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002012PropertyType DescriptorArray::GetType(int descriptor_number) {
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00002013 return GetDetails(descriptor_number).type();
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002014}
2015
2016
2017int DescriptorArray::GetFieldIndex(int descriptor_number) {
2018 return Descriptor::IndexFromValue(GetValue(descriptor_number));
2019}
2020
2021
2022JSFunction* DescriptorArray::GetConstantFunction(int descriptor_number) {
2023 return JSFunction::cast(GetValue(descriptor_number));
2024}
2025
2026
2027Object* DescriptorArray::GetCallbacksObject(int descriptor_number) {
2028 ASSERT(GetType(descriptor_number) == CALLBACKS);
2029 return GetValue(descriptor_number);
2030}
2031
2032
2033AccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) {
2034 ASSERT(GetType(descriptor_number) == CALLBACKS);
ager@chromium.orgea91cc52011-05-23 06:06:11 +00002035 Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number));
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002036 return reinterpret_cast<AccessorDescriptor*>(p->foreign_address());
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002037}
2038
2039
2040bool DescriptorArray::IsProperty(int descriptor_number) {
ulan@chromium.org9a21ec42012-03-06 08:42:24 +00002041 Entry entry(this, descriptor_number);
2042 return IsPropertyDescriptor(&entry);
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002043}
2044
2045
rossberg@chromium.org994edf62012-02-06 10:12:55 +00002046bool DescriptorArray::IsTransitionOnly(int descriptor_number) {
2047 switch (GetType(descriptor_number)) {
2048 case MAP_TRANSITION:
2049 case CONSTANT_TRANSITION:
rossberg@chromium.org994edf62012-02-06 10:12:55 +00002050 return true;
2051 case CALLBACKS: {
2052 Object* value = GetValue(descriptor_number);
2053 if (!value->IsAccessorPair()) return false;
2054 AccessorPair* accessors = AccessorPair::cast(value);
2055 return accessors->getter()->IsMap() && accessors->setter()->IsMap();
2056 }
2057 case NORMAL:
2058 case FIELD:
2059 case CONSTANT_FUNCTION:
2060 case HANDLER:
2061 case INTERCEPTOR:
2062 case NULL_DESCRIPTOR:
2063 return false;
2064 }
2065 UNREACHABLE(); // Keep the compiler happy.
2066 return false;
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002067}
2068
2069
2070bool DescriptorArray::IsNullDescriptor(int descriptor_number) {
2071 return GetType(descriptor_number) == NULL_DESCRIPTOR;
2072}
2073
2074
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002075void DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
2076 desc->Init(GetKey(descriptor_number),
2077 GetValue(descriptor_number),
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00002078 GetDetails(descriptor_number));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002079}
2080
2081
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002082void DescriptorArray::Set(int descriptor_number,
2083 Descriptor* desc,
2084 const WhitenessWitness&) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002085 // Range check.
2086 ASSERT(descriptor_number < number_of_descriptors());
2087
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002088 NoIncrementalWriteBarrierSet(this,
2089 ToKeyIndex(descriptor_number),
2090 desc->GetKey());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002091 NoIncrementalWriteBarrierSet(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002092 ToValueIndex(descriptor_number),
2093 desc->GetValue());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002094 NoIncrementalWriteBarrierSet(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002095 ToDetailsIndex(descriptor_number),
2096 desc->GetDetails().AsSmi());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002097}
2098
2099
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002100void DescriptorArray::NoIncrementalWriteBarrierSwapDescriptors(
2101 int first, int second) {
2102 NoIncrementalWriteBarrierSwap(this, ToKeyIndex(first), ToKeyIndex(second));
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002103 NoIncrementalWriteBarrierSwap(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002104 ToValueIndex(first),
2105 ToValueIndex(second));
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002106 NoIncrementalWriteBarrierSwap(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002107 ToDetailsIndex(first),
2108 ToDetailsIndex(second));
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002109}
2110
2111
2112DescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array)
2113 : marking_(array->GetHeap()->incremental_marking()) {
2114 marking_->EnterNoMarkingScope();
2115 if (array->number_of_descriptors() > 0) {
2116 ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002117 }
2118}
2119
2120
2121DescriptorArray::WhitenessWitness::~WhitenessWitness() {
2122 marking_->LeaveNoMarkingScope();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002123}
2124
2125
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002126template<typename Shape, typename Key>
ricow@chromium.org2c99e282011-07-28 09:15:17 +00002127int HashTable<Shape, Key>::ComputeCapacity(int at_least_space_for) {
2128 const int kMinCapacity = 32;
2129 int capacity = RoundUpToPowerOf2(at_least_space_for * 2);
2130 if (capacity < kMinCapacity) {
2131 capacity = kMinCapacity; // Guarantee min capacity.
2132 }
2133 return capacity;
2134}
2135
2136
2137template<typename Shape, typename Key>
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002138int HashTable<Shape, Key>::FindEntry(Key key) {
2139 return FindEntry(GetIsolate(), key);
2140}
2141
2142
2143// Find entry for key otherwise return kNotFound.
2144template<typename Shape, typename Key>
2145int HashTable<Shape, Key>::FindEntry(Isolate* isolate, Key key) {
2146 uint32_t capacity = Capacity();
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002147 uint32_t entry = FirstProbe(HashTable<Shape, Key>::Hash(key), capacity);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002148 uint32_t count = 1;
2149 // EnsureCapacity will guarantee the hash table is never full.
2150 while (true) {
2151 Object* element = KeyAt(entry);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00002152 // Empty entry.
2153 if (element == isolate->heap()->raw_unchecked_undefined_value()) break;
2154 if (element != isolate->heap()->raw_unchecked_the_hole_value() &&
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002155 Shape::IsMatch(key, element)) return entry;
2156 entry = NextProbe(entry, count++, capacity);
2157 }
2158 return kNotFound;
2159}
2160
2161
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002162bool SeededNumberDictionary::requires_slow_elements() {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002163 Object* max_index_object = get(kMaxNumberKeyIndex);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002164 if (!max_index_object->IsSmi()) return false;
2165 return 0 !=
2166 (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
2167}
2168
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002169uint32_t SeededNumberDictionary::max_number_key() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002170 ASSERT(!requires_slow_elements());
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002171 Object* max_index_object = get(kMaxNumberKeyIndex);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002172 if (!max_index_object->IsSmi()) return 0;
2173 uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
2174 return value >> kRequiresSlowElementsTagSize;
2175}
2176
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002177void SeededNumberDictionary::set_requires_slow_elements() {
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00002178 set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002179}
2180
2181
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002182// ------------------------------------
2183// Cast operations
2184
2185
2186CAST_ACCESSOR(FixedArray)
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002187CAST_ACCESSOR(FixedDoubleArray)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002188CAST_ACCESSOR(DescriptorArray)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002189CAST_ACCESSOR(DeoptimizationInputData)
2190CAST_ACCESSOR(DeoptimizationOutputData)
danno@chromium.orgfa458e42012-02-01 10:48:36 +00002191CAST_ACCESSOR(TypeFeedbackCells)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002192CAST_ACCESSOR(SymbolTable)
ager@chromium.orgac091b72010-05-05 07:34:42 +00002193CAST_ACCESSOR(JSFunctionResultCache)
ricow@chromium.org65fae842010-08-25 15:26:24 +00002194CAST_ACCESSOR(NormalizedMapCache)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002195CAST_ACCESSOR(ScopeInfo)
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00002196CAST_ACCESSOR(CompilationCacheTable)
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00002197CAST_ACCESSOR(CodeCacheHashTable)
jkummerow@chromium.orge297f592011-06-08 10:05:15 +00002198CAST_ACCESSOR(PolymorphicCodeCacheHashTable)
ager@chromium.org236ad962008-09-25 09:45:57 +00002199CAST_ACCESSOR(MapCache)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002200CAST_ACCESSOR(String)
2201CAST_ACCESSOR(SeqString)
ager@chromium.org7c537e22008-10-16 08:43:32 +00002202CAST_ACCESSOR(SeqAsciiString)
2203CAST_ACCESSOR(SeqTwoByteString)
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002204CAST_ACCESSOR(SlicedString)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002205CAST_ACCESSOR(ConsString)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002206CAST_ACCESSOR(ExternalString)
2207CAST_ACCESSOR(ExternalAsciiString)
2208CAST_ACCESSOR(ExternalTwoByteString)
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00002209CAST_ACCESSOR(JSReceiver)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002210CAST_ACCESSOR(JSObject)
2211CAST_ACCESSOR(Smi)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002212CAST_ACCESSOR(HeapObject)
2213CAST_ACCESSOR(HeapNumber)
2214CAST_ACCESSOR(Oddball)
kasperl@chromium.org2abc4502009-07-02 07:00:29 +00002215CAST_ACCESSOR(JSGlobalPropertyCell)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002216CAST_ACCESSOR(SharedFunctionInfo)
2217CAST_ACCESSOR(Map)
2218CAST_ACCESSOR(JSFunction)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002219CAST_ACCESSOR(GlobalObject)
2220CAST_ACCESSOR(JSGlobalProxy)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002221CAST_ACCESSOR(JSGlobalObject)
2222CAST_ACCESSOR(JSBuiltinsObject)
2223CAST_ACCESSOR(Code)
2224CAST_ACCESSOR(JSArray)
ager@chromium.org236ad962008-09-25 09:45:57 +00002225CAST_ACCESSOR(JSRegExp)
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00002226CAST_ACCESSOR(JSProxy)
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00002227CAST_ACCESSOR(JSFunctionProxy)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002228CAST_ACCESSOR(JSSet)
2229CAST_ACCESSOR(JSMap)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002230CAST_ACCESSOR(JSWeakMap)
ager@chromium.orgea91cc52011-05-23 06:06:11 +00002231CAST_ACCESSOR(Foreign)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002232CAST_ACCESSOR(ByteArray)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002233CAST_ACCESSOR(FreeSpace)
ager@chromium.org3811b432009-10-28 14:53:37 +00002234CAST_ACCESSOR(ExternalArray)
2235CAST_ACCESSOR(ExternalByteArray)
2236CAST_ACCESSOR(ExternalUnsignedByteArray)
2237CAST_ACCESSOR(ExternalShortArray)
2238CAST_ACCESSOR(ExternalUnsignedShortArray)
2239CAST_ACCESSOR(ExternalIntArray)
2240CAST_ACCESSOR(ExternalUnsignedIntArray)
2241CAST_ACCESSOR(ExternalFloatArray)
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002242CAST_ACCESSOR(ExternalDoubleArray)
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002243CAST_ACCESSOR(ExternalPixelArray)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002244CAST_ACCESSOR(Struct)
2245
2246
2247#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name)
2248 STRUCT_LIST(MAKE_STRUCT_CAST)
2249#undef MAKE_STRUCT_CAST
2250
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00002251
2252template <typename Shape, typename Key>
2253HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002254 ASSERT(obj->IsHashTable());
2255 return reinterpret_cast<HashTable*>(obj);
2256}
2257
2258
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002259SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002260SMI_ACCESSORS(FreeSpace, size, kSizeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002261
ager@chromium.orgac091b72010-05-05 07:34:42 +00002262SMI_ACCESSORS(String, length, kLengthOffset)
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00002263
2264
2265uint32_t String::hash_field() {
2266 return READ_UINT32_FIELD(this, kHashFieldOffset);
2267}
2268
2269
2270void String::set_hash_field(uint32_t value) {
2271 WRITE_UINT32_FIELD(this, kHashFieldOffset, value);
ricow@chromium.org30ce4112010-05-31 10:38:25 +00002272#if V8_HOST_ARCH_64_BIT
2273 WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0);
2274#endif
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00002275}
2276
2277
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002278bool String::Equals(String* other) {
2279 if (other == this) return true;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002280 if (StringShape(this).IsSymbol() && StringShape(other).IsSymbol()) {
2281 return false;
2282 }
2283 return SlowEquals(other);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002284}
2285
2286
lrn@chromium.org303ada72010-10-27 09:33:13 +00002287MaybeObject* String::TryFlatten(PretenureFlag pretenure) {
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002288 if (!StringShape(this).IsCons()) return this;
2289 ConsString* cons = ConsString::cast(this);
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002290 if (cons->IsFlat()) return cons->first();
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00002291 return SlowTryFlatten(pretenure);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002292}
2293
2294
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002295String* String::TryFlattenGetString(PretenureFlag pretenure) {
lrn@chromium.org303ada72010-10-27 09:33:13 +00002296 MaybeObject* flat = TryFlatten(pretenure);
2297 Object* successfully_flattened;
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002298 if (!flat->ToObject(&successfully_flattened)) return this;
2299 return String::cast(successfully_flattened);
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002300}
2301
2302
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002303uint16_t String::Get(int index) {
2304 ASSERT(index >= 0 && index < length());
2305 switch (StringShape(this).full_representation_tag()) {
ager@chromium.org870a0b62008-11-04 11:43:05 +00002306 case kSeqStringTag | kAsciiStringTag:
2307 return SeqAsciiString::cast(this)->SeqAsciiStringGet(index);
2308 case kSeqStringTag | kTwoByteStringTag:
2309 return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
2310 case kConsStringTag | kAsciiStringTag:
2311 case kConsStringTag | kTwoByteStringTag:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002312 return ConsString::cast(this)->ConsStringGet(index);
ager@chromium.org870a0b62008-11-04 11:43:05 +00002313 case kExternalStringTag | kAsciiStringTag:
2314 return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
2315 case kExternalStringTag | kTwoByteStringTag:
2316 return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002317 case kSlicedStringTag | kAsciiStringTag:
2318 case kSlicedStringTag | kTwoByteStringTag:
2319 return SlicedString::cast(this)->SlicedStringGet(index);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002320 default:
2321 break;
2322 }
2323
2324 UNREACHABLE();
2325 return 0;
2326}
2327
2328
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002329void String::Set(int index, uint16_t value) {
2330 ASSERT(index >= 0 && index < length());
2331 ASSERT(StringShape(this).IsSequential());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002332
ager@chromium.org5ec48922009-05-05 07:25:34 +00002333 return this->IsAsciiRepresentation()
ager@chromium.org7c537e22008-10-16 08:43:32 +00002334 ? SeqAsciiString::cast(this)->SeqAsciiStringSet(index, value)
2335 : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002336}
2337
2338
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002339bool String::IsFlat() {
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002340 if (!StringShape(this).IsCons()) return true;
2341 return ConsString::cast(this)->second()->length() == 0;
2342}
2343
2344
2345String* String::GetUnderlying() {
2346 // Giving direct access to underlying string only makes sense if the
2347 // wrapping string is already flattened.
2348 ASSERT(this->IsFlat());
2349 ASSERT(StringShape(this).IsIndirect());
2350 STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset);
2351 const int kUnderlyingOffset = SlicedString::kParentOffset;
2352 return String::cast(READ_FIELD(this, kUnderlyingOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002353}
2354
2355
ager@chromium.org7c537e22008-10-16 08:43:32 +00002356uint16_t SeqAsciiString::SeqAsciiStringGet(int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002357 ASSERT(index >= 0 && index < length());
2358 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
2359}
2360
2361
ager@chromium.org7c537e22008-10-16 08:43:32 +00002362void SeqAsciiString::SeqAsciiStringSet(int index, uint16_t value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002363 ASSERT(index >= 0 && index < length() && value <= kMaxAsciiCharCode);
2364 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize,
2365 static_cast<byte>(value));
2366}
2367
2368
ager@chromium.org7c537e22008-10-16 08:43:32 +00002369Address SeqAsciiString::GetCharsAddress() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002370 return FIELD_ADDR(this, kHeaderSize);
2371}
2372
2373
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002374char* SeqAsciiString::GetChars() {
2375 return reinterpret_cast<char*>(GetCharsAddress());
2376}
2377
2378
ager@chromium.org7c537e22008-10-16 08:43:32 +00002379Address SeqTwoByteString::GetCharsAddress() {
2380 return FIELD_ADDR(this, kHeaderSize);
2381}
2382
2383
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002384uc16* SeqTwoByteString::GetChars() {
2385 return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize));
2386}
2387
2388
ager@chromium.org7c537e22008-10-16 08:43:32 +00002389uint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002390 ASSERT(index >= 0 && index < length());
2391 return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize);
2392}
2393
2394
ager@chromium.org7c537e22008-10-16 08:43:32 +00002395void SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002396 ASSERT(index >= 0 && index < length());
2397 WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value);
2398}
2399
2400
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002401int SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) {
ager@chromium.orgac091b72010-05-05 07:34:42 +00002402 return SizeFor(length());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002403}
2404
2405
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002406int SeqAsciiString::SeqAsciiStringSize(InstanceType instance_type) {
ager@chromium.orgac091b72010-05-05 07:34:42 +00002407 return SizeFor(length());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002408}
2409
2410
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002411String* SlicedString::parent() {
2412 return String::cast(READ_FIELD(this, kParentOffset));
2413}
2414
2415
2416void SlicedString::set_parent(String* parent) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002417 ASSERT(parent->IsSeqString() || parent->IsExternalString());
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002418 WRITE_FIELD(this, kParentOffset, parent);
2419}
2420
2421
2422SMI_ACCESSORS(SlicedString, offset, kOffsetOffset)
2423
2424
ager@chromium.org870a0b62008-11-04 11:43:05 +00002425String* ConsString::first() {
2426 return String::cast(READ_FIELD(this, kFirstOffset));
2427}
2428
2429
2430Object* ConsString::unchecked_first() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002431 return READ_FIELD(this, kFirstOffset);
2432}
2433
2434
ager@chromium.org870a0b62008-11-04 11:43:05 +00002435void ConsString::set_first(String* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002436 WRITE_FIELD(this, kFirstOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002437 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002438}
2439
2440
ager@chromium.org870a0b62008-11-04 11:43:05 +00002441String* ConsString::second() {
2442 return String::cast(READ_FIELD(this, kSecondOffset));
2443}
2444
2445
2446Object* ConsString::unchecked_second() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002447 return READ_FIELD(this, kSecondOffset);
2448}
2449
2450
ager@chromium.org870a0b62008-11-04 11:43:05 +00002451void ConsString::set_second(String* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002452 WRITE_FIELD(this, kSecondOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002453 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002454}
2455
2456
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002457bool ExternalString::is_short() {
2458 InstanceType type = map()->instance_type();
2459 return (type & kShortExternalStringMask) == kShortExternalStringTag;
erikcorry0ad885c2011-11-21 13:51:57 +00002460}
2461
2462
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002463const ExternalAsciiString::Resource* ExternalAsciiString::resource() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002464 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
2465}
2466
2467
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002468void ExternalAsciiString::update_data_cache() {
2469 if (is_short()) return;
2470 const char** data_field =
2471 reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset));
2472 *data_field = resource()->data();
2473}
2474
2475
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002476void ExternalAsciiString::set_resource(
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002477 const ExternalAsciiString::Resource* resource) {
2478 *reinterpret_cast<const Resource**>(
2479 FIELD_ADDR(this, kResourceOffset)) = resource;
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002480 if (resource != NULL) update_data_cache();
erikcorry0ad885c2011-11-21 13:51:57 +00002481}
2482
2483
2484const char* ExternalAsciiString::GetChars() {
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002485 return resource()->data();
erikcorry0ad885c2011-11-21 13:51:57 +00002486}
2487
2488
2489uint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) {
2490 ASSERT(index >= 0 && index < length());
2491 return GetChars()[index];
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002492}
2493
2494
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002495const ExternalTwoByteString::Resource* ExternalTwoByteString::resource() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002496 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
2497}
2498
2499
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002500void ExternalTwoByteString::update_data_cache() {
2501 if (is_short()) return;
2502 const uint16_t** data_field =
2503 reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset));
2504 *data_field = resource()->data();
2505}
2506
2507
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002508void ExternalTwoByteString::set_resource(
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002509 const ExternalTwoByteString::Resource* resource) {
2510 *reinterpret_cast<const Resource**>(
2511 FIELD_ADDR(this, kResourceOffset)) = resource;
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002512 if (resource != NULL) update_data_cache();
erikcorry0ad885c2011-11-21 13:51:57 +00002513}
2514
2515
2516const uint16_t* ExternalTwoByteString::GetChars() {
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002517 return resource()->data();
erikcorry0ad885c2011-11-21 13:51:57 +00002518}
2519
2520
2521uint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) {
2522 ASSERT(index >= 0 && index < length());
2523 return GetChars()[index];
2524}
2525
2526
2527const uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData(
2528 unsigned start) {
2529 return GetChars() + start;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002530}
2531
2532
ager@chromium.orgac091b72010-05-05 07:34:42 +00002533void JSFunctionResultCache::MakeZeroSize() {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002534 set_finger_index(kEntriesIndex);
2535 set_size(kEntriesIndex);
ager@chromium.orgac091b72010-05-05 07:34:42 +00002536}
2537
2538
2539void JSFunctionResultCache::Clear() {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002540 int cache_size = size();
ager@chromium.orgac091b72010-05-05 07:34:42 +00002541 Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex));
fschneider@chromium.orge03fb642010-11-01 12:34:09 +00002542 MemsetPointer(entries_start,
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002543 GetHeap()->the_hole_value(),
fschneider@chromium.orge03fb642010-11-01 12:34:09 +00002544 cache_size - kEntriesIndex);
ager@chromium.orgac091b72010-05-05 07:34:42 +00002545 MakeZeroSize();
2546}
2547
2548
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002549int JSFunctionResultCache::size() {
2550 return Smi::cast(get(kCacheSizeIndex))->value();
2551}
2552
2553
2554void JSFunctionResultCache::set_size(int size) {
2555 set(kCacheSizeIndex, Smi::FromInt(size));
2556}
2557
2558
2559int JSFunctionResultCache::finger_index() {
2560 return Smi::cast(get(kFingerIndex))->value();
2561}
2562
2563
2564void JSFunctionResultCache::set_finger_index(int finger_index) {
2565 set(kFingerIndex, Smi::FromInt(finger_index));
2566}
2567
2568
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002569byte ByteArray::get(int index) {
2570 ASSERT(index >= 0 && index < this->length());
2571 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
2572}
2573
2574
2575void ByteArray::set(int index, byte value) {
2576 ASSERT(index >= 0 && index < this->length());
2577 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
2578}
2579
2580
2581int ByteArray::get_int(int index) {
2582 ASSERT(index >= 0 && (index * kIntSize) < this->length());
2583 return READ_INT_FIELD(this, kHeaderSize + index * kIntSize);
2584}
2585
2586
2587ByteArray* ByteArray::FromDataStartAddress(Address address) {
2588 ASSERT_TAG_ALIGNED(address);
2589 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
2590}
2591
2592
2593Address ByteArray::GetDataStartAddress() {
2594 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
2595}
2596
2597
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002598uint8_t* ExternalPixelArray::external_pixel_pointer() {
2599 return reinterpret_cast<uint8_t*>(external_pointer());
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002600}
2601
2602
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002603uint8_t ExternalPixelArray::get_scalar(int index) {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002604 ASSERT((index >= 0) && (index < this->length()));
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002605 uint8_t* ptr = external_pixel_pointer();
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002606 return ptr[index];
2607}
2608
2609
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002610MaybeObject* ExternalPixelArray::get(int index) {
2611 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2612}
2613
2614
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002615void ExternalPixelArray::set(int index, uint8_t value) {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002616 ASSERT((index >= 0) && (index < this->length()));
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002617 uint8_t* ptr = external_pixel_pointer();
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002618 ptr[index] = value;
2619}
2620
2621
ager@chromium.org3811b432009-10-28 14:53:37 +00002622void* ExternalArray::external_pointer() {
2623 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
2624 return reinterpret_cast<void*>(ptr);
2625}
2626
2627
2628void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
2629 intptr_t ptr = reinterpret_cast<intptr_t>(value);
2630 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
2631}
2632
2633
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002634int8_t ExternalByteArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002635 ASSERT((index >= 0) && (index < this->length()));
2636 int8_t* ptr = static_cast<int8_t*>(external_pointer());
2637 return ptr[index];
2638}
2639
2640
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002641MaybeObject* ExternalByteArray::get(int index) {
2642 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2643}
2644
2645
ager@chromium.org3811b432009-10-28 14:53:37 +00002646void ExternalByteArray::set(int index, int8_t value) {
2647 ASSERT((index >= 0) && (index < this->length()));
2648 int8_t* ptr = static_cast<int8_t*>(external_pointer());
2649 ptr[index] = value;
2650}
2651
2652
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002653uint8_t ExternalUnsignedByteArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002654 ASSERT((index >= 0) && (index < this->length()));
2655 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
2656 return ptr[index];
2657}
2658
2659
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002660MaybeObject* ExternalUnsignedByteArray::get(int index) {
2661 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2662}
2663
2664
ager@chromium.org3811b432009-10-28 14:53:37 +00002665void ExternalUnsignedByteArray::set(int index, uint8_t value) {
2666 ASSERT((index >= 0) && (index < this->length()));
2667 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
2668 ptr[index] = value;
2669}
2670
2671
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002672int16_t ExternalShortArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002673 ASSERT((index >= 0) && (index < this->length()));
2674 int16_t* ptr = static_cast<int16_t*>(external_pointer());
2675 return ptr[index];
2676}
2677
2678
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002679MaybeObject* ExternalShortArray::get(int index) {
2680 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2681}
2682
2683
ager@chromium.org3811b432009-10-28 14:53:37 +00002684void ExternalShortArray::set(int index, int16_t value) {
2685 ASSERT((index >= 0) && (index < this->length()));
2686 int16_t* ptr = static_cast<int16_t*>(external_pointer());
2687 ptr[index] = value;
2688}
2689
2690
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002691uint16_t ExternalUnsignedShortArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002692 ASSERT((index >= 0) && (index < this->length()));
2693 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
2694 return ptr[index];
2695}
2696
2697
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002698MaybeObject* ExternalUnsignedShortArray::get(int index) {
2699 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2700}
2701
2702
ager@chromium.org3811b432009-10-28 14:53:37 +00002703void ExternalUnsignedShortArray::set(int index, uint16_t value) {
2704 ASSERT((index >= 0) && (index < this->length()));
2705 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
2706 ptr[index] = value;
2707}
2708
2709
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002710int32_t ExternalIntArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002711 ASSERT((index >= 0) && (index < this->length()));
2712 int32_t* ptr = static_cast<int32_t*>(external_pointer());
2713 return ptr[index];
2714}
2715
2716
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002717MaybeObject* ExternalIntArray::get(int index) {
2718 return GetHeap()->NumberFromInt32(get_scalar(index));
2719}
2720
2721
ager@chromium.org3811b432009-10-28 14:53:37 +00002722void ExternalIntArray::set(int index, int32_t value) {
2723 ASSERT((index >= 0) && (index < this->length()));
2724 int32_t* ptr = static_cast<int32_t*>(external_pointer());
2725 ptr[index] = value;
2726}
2727
2728
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002729uint32_t ExternalUnsignedIntArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002730 ASSERT((index >= 0) && (index < this->length()));
2731 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
2732 return ptr[index];
2733}
2734
2735
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002736MaybeObject* ExternalUnsignedIntArray::get(int index) {
2737 return GetHeap()->NumberFromUint32(get_scalar(index));
2738}
2739
2740
ager@chromium.org3811b432009-10-28 14:53:37 +00002741void ExternalUnsignedIntArray::set(int index, uint32_t value) {
2742 ASSERT((index >= 0) && (index < this->length()));
2743 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
2744 ptr[index] = value;
2745}
2746
2747
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002748float ExternalFloatArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002749 ASSERT((index >= 0) && (index < this->length()));
2750 float* ptr = static_cast<float*>(external_pointer());
2751 return ptr[index];
2752}
2753
2754
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002755MaybeObject* ExternalFloatArray::get(int index) {
2756 return GetHeap()->NumberFromDouble(get_scalar(index));
2757}
2758
2759
ager@chromium.org3811b432009-10-28 14:53:37 +00002760void ExternalFloatArray::set(int index, float value) {
2761 ASSERT((index >= 0) && (index < this->length()));
2762 float* ptr = static_cast<float*>(external_pointer());
2763 ptr[index] = value;
2764}
2765
ager@chromium.org6a2b0aa2010-07-13 20:58:03 +00002766
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002767double ExternalDoubleArray::get_scalar(int index) {
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002768 ASSERT((index >= 0) && (index < this->length()));
2769 double* ptr = static_cast<double*>(external_pointer());
2770 return ptr[index];
2771}
2772
2773
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002774MaybeObject* ExternalDoubleArray::get(int index) {
2775 return GetHeap()->NumberFromDouble(get_scalar(index));
2776}
2777
2778
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002779void ExternalDoubleArray::set(int index, double value) {
2780 ASSERT((index >= 0) && (index < this->length()));
2781 double* ptr = static_cast<double*>(external_pointer());
2782 ptr[index] = value;
2783}
2784
2785
ager@chromium.org5b2fbee2010-09-08 06:38:15 +00002786int Map::visitor_id() {
2787 return READ_BYTE_FIELD(this, kVisitorIdOffset);
2788}
2789
2790
2791void Map::set_visitor_id(int id) {
2792 ASSERT(0 <= id && id < 256);
2793 WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id));
2794}
2795
ager@chromium.org3811b432009-10-28 14:53:37 +00002796
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002797int Map::instance_size() {
ager@chromium.org7c537e22008-10-16 08:43:32 +00002798 return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2;
2799}
2800
2801
2802int Map::inobject_properties() {
2803 return READ_BYTE_FIELD(this, kInObjectPropertiesOffset);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002804}
2805
2806
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00002807int Map::pre_allocated_property_fields() {
2808 return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset);
2809}
2810
2811
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002812int HeapObject::SizeFromMap(Map* map) {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002813 int instance_size = map->instance_size();
2814 if (instance_size != kVariableSizeSentinel) return instance_size;
2815 // We can ignore the "symbol" bit becase it is only set for symbols
2816 // and implies a string type.
2817 int instance_type = static_cast<int>(map->instance_type()) & ~kIsSymbolMask;
ager@chromium.org5aa501c2009-06-23 07:57:28 +00002818 // Only inline the most frequent cases.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002819 if (instance_type == FIXED_ARRAY_TYPE) {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00002820 return FixedArray::BodyDescriptor::SizeOf(map, this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002821 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002822 if (instance_type == ASCII_STRING_TYPE) {
2823 return SeqAsciiString::SizeFor(
2824 reinterpret_cast<SeqAsciiString*>(this)->length());
2825 }
ager@chromium.org5aa501c2009-06-23 07:57:28 +00002826 if (instance_type == BYTE_ARRAY_TYPE) {
2827 return reinterpret_cast<ByteArray*>(this)->ByteArraySize();
2828 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002829 if (instance_type == FREE_SPACE_TYPE) {
2830 return reinterpret_cast<FreeSpace*>(this)->size();
2831 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002832 if (instance_type == STRING_TYPE) {
2833 return SeqTwoByteString::SizeFor(
2834 reinterpret_cast<SeqTwoByteString*>(this)->length());
2835 }
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002836 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
2837 return FixedDoubleArray::SizeFor(
2838 reinterpret_cast<FixedDoubleArray*>(this)->length());
2839 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002840 ASSERT(instance_type == CODE_TYPE);
2841 return reinterpret_cast<Code*>(this)->CodeSize();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002842}
2843
2844
2845void Map::set_instance_size(int value) {
kasperl@chromium.org71affb52009-05-26 05:44:31 +00002846 ASSERT_EQ(0, value & (kPointerSize - 1));
ager@chromium.org7c537e22008-10-16 08:43:32 +00002847 value >>= kPointerSizeLog2;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002848 ASSERT(0 <= value && value < 256);
2849 WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value));
2850}
2851
2852
ager@chromium.org7c537e22008-10-16 08:43:32 +00002853void Map::set_inobject_properties(int value) {
2854 ASSERT(0 <= value && value < 256);
2855 WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value));
2856}
2857
2858
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00002859void Map::set_pre_allocated_property_fields(int value) {
2860 ASSERT(0 <= value && value < 256);
2861 WRITE_BYTE_FIELD(this,
2862 kPreAllocatedPropertyFieldsOffset,
2863 static_cast<byte>(value));
2864}
2865
2866
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002867InstanceType Map::instance_type() {
2868 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
2869}
2870
2871
2872void Map::set_instance_type(InstanceType value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002873 WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
2874}
2875
2876
2877int Map::unused_property_fields() {
2878 return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset);
2879}
2880
2881
2882void Map::set_unused_property_fields(int value) {
2883 WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255));
2884}
2885
2886
2887byte Map::bit_field() {
2888 return READ_BYTE_FIELD(this, kBitFieldOffset);
2889}
2890
2891
2892void Map::set_bit_field(byte value) {
2893 WRITE_BYTE_FIELD(this, kBitFieldOffset, value);
2894}
2895
2896
ager@chromium.org3a37e9b2009-04-27 09:26:21 +00002897byte Map::bit_field2() {
2898 return READ_BYTE_FIELD(this, kBitField2Offset);
2899}
2900
2901
2902void Map::set_bit_field2(byte value) {
2903 WRITE_BYTE_FIELD(this, kBitField2Offset, value);
2904}
2905
2906
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002907void Map::set_non_instance_prototype(bool value) {
2908 if (value) {
2909 set_bit_field(bit_field() | (1 << kHasNonInstancePrototype));
2910 } else {
2911 set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype));
2912 }
2913}
2914
2915
2916bool Map::has_non_instance_prototype() {
2917 return ((1 << kHasNonInstancePrototype) & bit_field()) != 0;
2918}
2919
2920
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002921void Map::set_function_with_prototype(bool value) {
2922 if (value) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002923 set_bit_field3(bit_field3() | (1 << kFunctionWithPrototype));
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002924 } else {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002925 set_bit_field3(bit_field3() & ~(1 << kFunctionWithPrototype));
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002926 }
2927}
2928
2929
2930bool Map::function_with_prototype() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002931 return ((1 << kFunctionWithPrototype) & bit_field3()) != 0;
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002932}
2933
2934
ager@chromium.org870a0b62008-11-04 11:43:05 +00002935void Map::set_is_access_check_needed(bool access_check_needed) {
2936 if (access_check_needed) {
2937 set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded));
2938 } else {
2939 set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded));
2940 }
2941}
2942
2943
2944bool Map::is_access_check_needed() {
2945 return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0;
2946}
2947
2948
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00002949void Map::set_is_extensible(bool value) {
2950 if (value) {
2951 set_bit_field2(bit_field2() | (1 << kIsExtensible));
2952 } else {
2953 set_bit_field2(bit_field2() & ~(1 << kIsExtensible));
2954 }
2955}
2956
2957bool Map::is_extensible() {
2958 return ((1 << kIsExtensible) & bit_field2()) != 0;
2959}
2960
2961
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002962void Map::set_attached_to_shared_function_info(bool value) {
2963 if (value) {
2964 set_bit_field2(bit_field2() | (1 << kAttachedToSharedFunctionInfo));
2965 } else {
2966 set_bit_field2(bit_field2() & ~(1 << kAttachedToSharedFunctionInfo));
2967 }
2968}
2969
2970bool Map::attached_to_shared_function_info() {
2971 return ((1 << kAttachedToSharedFunctionInfo) & bit_field2()) != 0;
2972}
2973
2974
2975void Map::set_is_shared(bool value) {
2976 if (value) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002977 set_bit_field3(bit_field3() | (1 << kIsShared));
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002978 } else {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002979 set_bit_field3(bit_field3() & ~(1 << kIsShared));
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002980 }
2981}
2982
2983bool Map::is_shared() {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002984 return ((1 << kIsShared) & bit_field3()) != 0;
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002985}
2986
2987
2988JSFunction* Map::unchecked_constructor() {
2989 return reinterpret_cast<JSFunction*>(READ_FIELD(this, kConstructorOffset));
2990}
2991
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00002992
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002993Code::Flags Code::flags() {
2994 return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
2995}
2996
2997
2998void Code::set_flags(Code::Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00002999 STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003000 // Make sure that all call stubs have an arguments count.
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00003001 ASSERT((ExtractKindFromFlags(flags) != CALL_IC &&
3002 ExtractKindFromFlags(flags) != KEYED_CALL_IC) ||
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003003 ExtractArgumentsCountFromFlags(flags) >= 0);
3004 WRITE_INT_FIELD(this, kFlagsOffset, flags);
3005}
3006
3007
3008Code::Kind Code::kind() {
3009 return ExtractKindFromFlags(flags());
3010}
3011
3012
kasper.lund7276f142008-07-30 08:49:36 +00003013InlineCacheState Code::ic_state() {
3014 InlineCacheState result = ExtractICStateFromFlags(flags());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003015 // Only allow uninitialized or debugger states for non-IC code
3016 // objects. This is used in the debugger to determine whether or not
3017 // a call to code object has been replaced with a debug break call.
3018 ASSERT(is_inline_cache_stub() ||
3019 result == UNINITIALIZED ||
3020 result == DEBUG_BREAK ||
3021 result == DEBUG_PREPARE_STEP_IN);
3022 return result;
3023}
3024
3025
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003026Code::ExtraICState Code::extra_ic_state() {
3027 ASSERT(is_inline_cache_stub());
3028 return ExtractExtraICStateFromFlags(flags());
3029}
3030
3031
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003032PropertyType Code::type() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003033 return ExtractTypeFromFlags(flags());
3034}
3035
3036
3037int Code::arguments_count() {
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00003038 ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003039 return ExtractArgumentsCountFromFlags(flags());
3040}
3041
3042
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003043int Code::major_key() {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003044 ASSERT(kind() == STUB ||
danno@chromium.org40cb8782011-05-25 07:58:50 +00003045 kind() == UNARY_OP_IC ||
3046 kind() == BINARY_OP_IC ||
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003047 kind() == COMPARE_IC ||
3048 kind() == TO_BOOLEAN_IC);
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003049 return READ_BYTE_FIELD(this, kStubMajorKeyOffset);
kasper.lund7276f142008-07-30 08:49:36 +00003050}
3051
3052
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003053void Code::set_major_key(int major) {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003054 ASSERT(kind() == STUB ||
danno@chromium.org40cb8782011-05-25 07:58:50 +00003055 kind() == UNARY_OP_IC ||
3056 kind() == BINARY_OP_IC ||
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003057 kind() == COMPARE_IC ||
3058 kind() == TO_BOOLEAN_IC);
kasper.lund7276f142008-07-30 08:49:36 +00003059 ASSERT(0 <= major && major < 256);
3060 WRITE_BYTE_FIELD(this, kStubMajorKeyOffset, major);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003061}
3062
3063
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003064bool Code::is_pregenerated() {
3065 return kind() == STUB && IsPregeneratedField::decode(flags());
3066}
3067
3068
3069void Code::set_is_pregenerated(bool value) {
3070 ASSERT(kind() == STUB);
3071 Flags f = flags();
3072 f = static_cast<Flags>(IsPregeneratedField::update(f, value));
3073 set_flags(f);
3074}
3075
3076
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003077bool Code::optimizable() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003078 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003079 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1;
3080}
3081
3082
3083void Code::set_optimizable(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003084 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003085 WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0);
3086}
3087
3088
3089bool Code::has_deoptimization_support() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003090 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003091 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3092 return FullCodeFlagsHasDeoptimizationSupportField::decode(flags);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003093}
3094
3095
3096void Code::set_has_deoptimization_support(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003097 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003098 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3099 flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value);
3100 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
3101}
3102
3103
3104bool Code::has_debug_break_slots() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003105 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003106 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3107 return FullCodeFlagsHasDebugBreakSlotsField::decode(flags);
3108}
3109
3110
3111void Code::set_has_debug_break_slots(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003112 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003113 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3114 flags = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value);
3115 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003116}
3117
3118
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003119bool Code::is_compiled_optimizable() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003120 ASSERT_EQ(FUNCTION, kind());
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003121 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3122 return FullCodeFlagsIsCompiledOptimizable::decode(flags);
3123}
3124
3125
3126void Code::set_compiled_optimizable(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003127 ASSERT_EQ(FUNCTION, kind());
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003128 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3129 flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value);
3130 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
3131}
3132
3133
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003134int Code::allow_osr_at_loop_nesting_level() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003135 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003136 return READ_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset);
3137}
3138
3139
3140void Code::set_allow_osr_at_loop_nesting_level(int level) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003141 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003142 ASSERT(level >= 0 && level <= kMaxLoopNestingMarker);
3143 WRITE_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset, level);
3144}
3145
3146
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003147int Code::profiler_ticks() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003148 ASSERT_EQ(FUNCTION, kind());
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003149 return READ_BYTE_FIELD(this, kProfilerTicksOffset);
3150}
3151
3152
3153void Code::set_profiler_ticks(int ticks) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003154 ASSERT_EQ(FUNCTION, kind());
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003155 ASSERT(ticks < 256);
3156 WRITE_BYTE_FIELD(this, kProfilerTicksOffset, ticks);
3157}
3158
3159
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003160unsigned Code::stack_slots() {
3161 ASSERT(kind() == OPTIMIZED_FUNCTION);
3162 return READ_UINT32_FIELD(this, kStackSlotsOffset);
3163}
3164
3165
3166void Code::set_stack_slots(unsigned slots) {
3167 ASSERT(kind() == OPTIMIZED_FUNCTION);
3168 WRITE_UINT32_FIELD(this, kStackSlotsOffset, slots);
3169}
3170
3171
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003172unsigned Code::safepoint_table_offset() {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003173 ASSERT(kind() == OPTIMIZED_FUNCTION);
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003174 return READ_UINT32_FIELD(this, kSafepointTableOffsetOffset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003175}
3176
3177
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003178void Code::set_safepoint_table_offset(unsigned offset) {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003179 ASSERT(kind() == OPTIMIZED_FUNCTION);
3180 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003181 WRITE_UINT32_FIELD(this, kSafepointTableOffsetOffset, offset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003182}
3183
3184
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003185unsigned Code::stack_check_table_offset() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003186 ASSERT_EQ(FUNCTION, kind());
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003187 return READ_UINT32_FIELD(this, kStackCheckTableOffsetOffset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003188}
3189
3190
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003191void Code::set_stack_check_table_offset(unsigned offset) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003192 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003193 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003194 WRITE_UINT32_FIELD(this, kStackCheckTableOffsetOffset, offset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003195}
3196
3197
3198CheckType Code::check_type() {
3199 ASSERT(is_call_stub() || is_keyed_call_stub());
3200 byte type = READ_BYTE_FIELD(this, kCheckTypeOffset);
3201 return static_cast<CheckType>(type);
3202}
3203
3204
3205void Code::set_check_type(CheckType value) {
3206 ASSERT(is_call_stub() || is_keyed_call_stub());
3207 WRITE_BYTE_FIELD(this, kCheckTypeOffset, value);
3208}
3209
3210
danno@chromium.org40cb8782011-05-25 07:58:50 +00003211byte Code::unary_op_type() {
3212 ASSERT(is_unary_op_stub());
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00003213 return READ_BYTE_FIELD(this, kUnaryOpTypeOffset);
3214}
3215
3216
danno@chromium.org40cb8782011-05-25 07:58:50 +00003217void Code::set_unary_op_type(byte value) {
3218 ASSERT(is_unary_op_stub());
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00003219 WRITE_BYTE_FIELD(this, kUnaryOpTypeOffset, value);
3220}
3221
3222
danno@chromium.org40cb8782011-05-25 07:58:50 +00003223byte Code::binary_op_type() {
3224 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003225 return READ_BYTE_FIELD(this, kBinaryOpTypeOffset);
3226}
3227
3228
danno@chromium.org40cb8782011-05-25 07:58:50 +00003229void Code::set_binary_op_type(byte value) {
3230 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003231 WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value);
3232}
3233
3234
danno@chromium.org40cb8782011-05-25 07:58:50 +00003235byte Code::binary_op_result_type() {
3236 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003237 return READ_BYTE_FIELD(this, kBinaryOpReturnTypeOffset);
3238}
3239
3240
danno@chromium.org40cb8782011-05-25 07:58:50 +00003241void Code::set_binary_op_result_type(byte value) {
3242 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003243 WRITE_BYTE_FIELD(this, kBinaryOpReturnTypeOffset, value);
3244}
3245
3246
3247byte Code::compare_state() {
3248 ASSERT(is_compare_ic_stub());
3249 return READ_BYTE_FIELD(this, kCompareStateOffset);
3250}
3251
3252
3253void Code::set_compare_state(byte value) {
3254 ASSERT(is_compare_ic_stub());
3255 WRITE_BYTE_FIELD(this, kCompareStateOffset, value);
3256}
3257
3258
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003259byte Code::compare_operation() {
3260 ASSERT(is_compare_ic_stub());
3261 return READ_BYTE_FIELD(this, kCompareOperationOffset);
3262}
3263
3264
3265void Code::set_compare_operation(byte value) {
3266 ASSERT(is_compare_ic_stub());
3267 WRITE_BYTE_FIELD(this, kCompareOperationOffset, value);
3268}
3269
3270
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003271byte Code::to_boolean_state() {
3272 ASSERT(is_to_boolean_ic_stub());
3273 return READ_BYTE_FIELD(this, kToBooleanTypeOffset);
3274}
3275
3276
3277void Code::set_to_boolean_state(byte value) {
3278 ASSERT(is_to_boolean_ic_stub());
3279 WRITE_BYTE_FIELD(this, kToBooleanTypeOffset, value);
3280}
3281
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003282
3283bool Code::has_function_cache() {
3284 ASSERT(kind() == STUB);
3285 return READ_BYTE_FIELD(this, kHasFunctionCacheOffset) != 0;
3286}
3287
3288
3289void Code::set_has_function_cache(bool flag) {
3290 ASSERT(kind() == STUB);
3291 WRITE_BYTE_FIELD(this, kHasFunctionCacheOffset, flag);
3292}
3293
3294
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003295bool Code::is_inline_cache_stub() {
3296 Kind kind = this->kind();
3297 return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND;
3298}
3299
3300
3301Code::Flags Code::ComputeFlags(Kind kind,
kasper.lund7276f142008-07-30 08:49:36 +00003302 InlineCacheState ic_state,
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003303 ExtraICState extra_ic_state,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003304 PropertyType type,
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003305 int argc,
3306 InlineCacheHolderFlag holder) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00003307 // Extra IC state is only allowed for call IC stubs or for store IC
3308 // stubs.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003309 ASSERT(extra_ic_state == kNoExtraICState ||
lrn@chromium.org34e60782011-09-15 07:25:40 +00003310 kind == CALL_IC ||
3311 kind == STORE_IC ||
3312 kind == KEYED_STORE_IC);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003313 // Compute the bit mask.
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003314 int bits = KindField::encode(kind)
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003315 | ICStateField::encode(ic_state)
3316 | TypeField::encode(type)
3317 | ExtraICStateField::encode(extra_ic_state)
lrn@chromium.org34e60782011-09-15 07:25:40 +00003318 | (argc << kArgumentsCountShift)
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003319 | CacheHolderField::encode(holder);
3320 return static_cast<Flags>(bits);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003321}
3322
3323
3324Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
3325 PropertyType type,
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003326 ExtraICState extra_ic_state,
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003327 InlineCacheHolderFlag holder,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003328 int argc) {
lrn@chromium.org34e60782011-09-15 07:25:40 +00003329 return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003330}
3331
3332
3333Code::Kind Code::ExtractKindFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003334 return KindField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003335}
3336
3337
kasper.lund7276f142008-07-30 08:49:36 +00003338InlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003339 return ICStateField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003340}
3341
3342
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003343Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003344 return ExtraICStateField::decode(flags);
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003345}
3346
3347
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003348PropertyType Code::ExtractTypeFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003349 return TypeField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003350}
3351
3352
3353int Code::ExtractArgumentsCountFromFlags(Flags flags) {
lrn@chromium.org34e60782011-09-15 07:25:40 +00003354 return (flags & kArgumentsCountMask) >> kArgumentsCountShift;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003355}
3356
3357
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003358InlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003359 return CacheHolderField::decode(flags);
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003360}
3361
3362
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003363Code::Flags Code::RemoveTypeFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003364 int bits = flags & ~TypeField::kMask;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003365 return static_cast<Flags>(bits);
3366}
3367
3368
ager@chromium.org8bb60582008-12-11 12:02:20 +00003369Code* Code::GetCodeFromTargetAddress(Address address) {
3370 HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
3371 // GetCodeFromTargetAddress might be called when marking objects during mark
3372 // sweep. reinterpret_cast is therefore used instead of the more appropriate
3373 // Code::cast. Code::cast does not work when the object's map is
3374 // marked.
3375 Code* result = reinterpret_cast<Code*>(code);
3376 return result;
3377}
3378
3379
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00003380Object* Code::GetObjectFromEntryAddress(Address location_of_address) {
3381 return HeapObject::
3382 FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize);
3383}
3384
3385
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003386Object* Map::prototype() {
3387 return READ_FIELD(this, kPrototypeOffset);
3388}
3389
3390
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003391void Map::set_prototype(Object* value, WriteBarrierMode mode) {
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00003392 ASSERT(value->IsNull() || value->IsJSReceiver());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003393 WRITE_FIELD(this, kPrototypeOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003394 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode);
fschneider@chromium.org40b9da32010-06-28 11:29:21 +00003395}
3396
3397
danno@chromium.org40cb8782011-05-25 07:58:50 +00003398DescriptorArray* Map::instance_descriptors() {
3399 Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
3400 if (object->IsSmi()) {
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00003401 return GetHeap()->empty_descriptor_array();
danno@chromium.org40cb8782011-05-25 07:58:50 +00003402 } else {
3403 return DescriptorArray::cast(object);
3404 }
3405}
3406
3407
3408void Map::init_instance_descriptors() {
3409 WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, Smi::FromInt(0));
3410}
3411
3412
3413void Map::clear_instance_descriptors() {
3414 Object* object = READ_FIELD(this,
3415 kInstanceDescriptorsOrBitField3Offset);
3416 if (!object->IsSmi()) {
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003417#ifdef DEBUG
3418 ZapInstanceDescriptors();
3419#endif
danno@chromium.org40cb8782011-05-25 07:58:50 +00003420 WRITE_FIELD(
3421 this,
3422 kInstanceDescriptorsOrBitField3Offset,
3423 Smi::FromInt(DescriptorArray::cast(object)->bit_field3_storage()));
3424 }
3425}
3426
3427
3428void Map::set_instance_descriptors(DescriptorArray* value,
3429 WriteBarrierMode mode) {
3430 Object* object = READ_FIELD(this,
3431 kInstanceDescriptorsOrBitField3Offset);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003432 Heap* heap = GetHeap();
3433 if (value == heap->empty_descriptor_array()) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00003434 clear_instance_descriptors();
3435 return;
3436 } else {
3437 if (object->IsSmi()) {
3438 value->set_bit_field3_storage(Smi::cast(object)->value());
3439 } else {
3440 value->set_bit_field3_storage(
3441 DescriptorArray::cast(object)->bit_field3_storage());
3442 }
3443 }
3444 ASSERT(!is_shared());
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003445#ifdef DEBUG
3446 if (value != instance_descriptors()) {
3447 ZapInstanceDescriptors();
3448 }
3449#endif
danno@chromium.org40cb8782011-05-25 07:58:50 +00003450 WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003451 CONDITIONAL_WRITE_BARRIER(
3452 heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode);
danno@chromium.org40cb8782011-05-25 07:58:50 +00003453}
3454
3455
3456int Map::bit_field3() {
3457 Object* object = READ_FIELD(this,
3458 kInstanceDescriptorsOrBitField3Offset);
3459 if (object->IsSmi()) {
3460 return Smi::cast(object)->value();
3461 } else {
3462 return DescriptorArray::cast(object)->bit_field3_storage();
3463 }
3464}
3465
3466
3467void Map::set_bit_field3(int value) {
3468 ASSERT(Smi::IsValid(value));
3469 Object* object = READ_FIELD(this,
3470 kInstanceDescriptorsOrBitField3Offset);
3471 if (object->IsSmi()) {
3472 WRITE_FIELD(this,
3473 kInstanceDescriptorsOrBitField3Offset,
3474 Smi::FromInt(value));
3475 } else {
3476 DescriptorArray::cast(object)->set_bit_field3_storage(value);
3477 }
3478}
3479
3480
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003481Object* Map::GetBackPointer() {
3482 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3483 if (object->IsFixedArray()) {
3484 return FixedArray::cast(object)->get(kProtoTransitionBackPointerOffset);
3485 } else {
3486 return object;
3487 }
3488}
3489
3490
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003491Map* Map::elements_transition_map() {
3492 return instance_descriptors()->elements_transition_map();
3493}
3494
3495
3496void Map::set_elements_transition_map(Map* transitioned_map) {
3497 return instance_descriptors()->set_elements_transition_map(transitioned_map);
3498}
3499
3500
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003501void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
3502 Heap* heap = GetHeap();
3503 ASSERT(instance_type() >= FIRST_JS_RECEIVER_TYPE);
3504 ASSERT((value->IsUndefined() && GetBackPointer()->IsMap()) ||
3505 (value->IsMap() && GetBackPointer()->IsUndefined()));
3506 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3507 if (object->IsFixedArray()) {
3508 FixedArray::cast(object)->set(
3509 kProtoTransitionBackPointerOffset, value, mode);
3510 } else {
3511 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, value);
3512 CONDITIONAL_WRITE_BARRIER(
3513 heap, this, kPrototypeTransitionsOrBackPointerOffset, value, mode);
3514 }
3515}
3516
3517
3518FixedArray* Map::prototype_transitions() {
3519 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3520 if (object->IsFixedArray()) {
3521 return FixedArray::cast(object);
3522 } else {
3523 return GetHeap()->empty_fixed_array();
3524 }
3525}
3526
3527
3528void Map::set_prototype_transitions(FixedArray* value, WriteBarrierMode mode) {
3529 Heap* heap = GetHeap();
3530 ASSERT(value != heap->empty_fixed_array());
3531 value->set(kProtoTransitionBackPointerOffset, GetBackPointer());
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003532#ifdef DEBUG
3533 if (value != prototype_transitions()) {
3534 ZapPrototypeTransitions();
3535 }
3536#endif
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003537 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, value);
3538 CONDITIONAL_WRITE_BARRIER(
3539 heap, this, kPrototypeTransitionsOrBackPointerOffset, value, mode);
3540}
3541
3542
3543void Map::init_prototype_transitions(Object* undefined) {
3544 ASSERT(undefined->IsUndefined());
3545 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, undefined);
3546}
3547
3548
3549HeapObject* Map::unchecked_prototype_transitions() {
3550 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3551 return reinterpret_cast<HeapObject*>(object);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003552}
3553
3554
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00003555ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003556ACCESSORS(Map, constructor, Object, kConstructorOffset)
3557
3558ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003559ACCESSORS(JSFunction, literals_or_bindings, FixedArray, kLiteralsOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003560ACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003561
3562ACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset)
3563ACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003564ACCESSORS(GlobalObject, global_receiver, JSObject, kGlobalReceiverOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003565
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003566ACCESSORS(JSGlobalProxy, context, Object, kContextOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003567
3568ACCESSORS(AccessorInfo, getter, Object, kGetterOffset)
3569ACCESSORS(AccessorInfo, setter, Object, kSetterOffset)
3570ACCESSORS(AccessorInfo, data, Object, kDataOffset)
3571ACCESSORS(AccessorInfo, name, Object, kNameOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003572ACCESSORS_TO_SMI(AccessorInfo, flag, kFlagOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003573ACCESSORS(AccessorInfo, expected_receiver_type, Object,
3574 kExpectedReceiverTypeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003575
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00003576ACCESSORS(AccessorPair, getter, Object, kGetterOffset)
3577ACCESSORS(AccessorPair, setter, Object, kSetterOffset)
3578
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003579ACCESSORS(AccessCheckInfo, named_callback, Object, kNamedCallbackOffset)
3580ACCESSORS(AccessCheckInfo, indexed_callback, Object, kIndexedCallbackOffset)
3581ACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
3582
3583ACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
3584ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
3585ACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
3586ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
3587ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
3588ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
3589
3590ACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
3591ACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
3592
3593ACCESSORS(TemplateInfo, tag, Object, kTagOffset)
3594ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
3595
3596ACCESSORS(FunctionTemplateInfo, serial_number, Object, kSerialNumberOffset)
3597ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003598ACCESSORS(FunctionTemplateInfo, property_accessors, Object,
3599 kPropertyAccessorsOffset)
3600ACCESSORS(FunctionTemplateInfo, prototype_template, Object,
3601 kPrototypeTemplateOffset)
3602ACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset)
3603ACCESSORS(FunctionTemplateInfo, named_property_handler, Object,
3604 kNamedPropertyHandlerOffset)
3605ACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object,
3606 kIndexedPropertyHandlerOffset)
3607ACCESSORS(FunctionTemplateInfo, instance_template, Object,
3608 kInstanceTemplateOffset)
3609ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
3610ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003611ACCESSORS(FunctionTemplateInfo, instance_call_handler, Object,
3612 kInstanceCallHandlerOffset)
3613ACCESSORS(FunctionTemplateInfo, access_check_info, Object,
3614 kAccessCheckInfoOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003615ACCESSORS_TO_SMI(FunctionTemplateInfo, flag, kFlagOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003616
3617ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
kasper.lund212ac232008-07-16 07:07:30 +00003618ACCESSORS(ObjectTemplateInfo, internal_field_count, Object,
3619 kInternalFieldCountOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003620
3621ACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset)
3622ACCESSORS(SignatureInfo, args, Object, kArgsOffset)
3623
3624ACCESSORS(TypeSwitchInfo, types, Object, kTypesOffset)
3625
3626ACCESSORS(Script, source, Object, kSourceOffset)
3627ACCESSORS(Script, name, Object, kNameOffset)
kasperl@chromium.org7be3c992009-03-12 07:19:55 +00003628ACCESSORS(Script, id, Object, kIdOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003629ACCESSORS_TO_SMI(Script, line_offset, kLineOffsetOffset)
3630ACCESSORS_TO_SMI(Script, column_offset, kColumnOffsetOffset)
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003631ACCESSORS(Script, data, Object, kDataOffset)
ager@chromium.org9085a012009-05-11 19:22:57 +00003632ACCESSORS(Script, context_data, Object, kContextOffset)
ager@chromium.orgea91cc52011-05-23 06:06:11 +00003633ACCESSORS(Script, wrapper, Foreign, kWrapperOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003634ACCESSORS_TO_SMI(Script, type, kTypeOffset)
3635ACCESSORS_TO_SMI(Script, compilation_type, kCompilationTypeOffset)
3636ACCESSORS_TO_SMI(Script, compilation_state, kCompilationStateOffset)
sgjesse@chromium.org499aaa52009-11-30 08:07:20 +00003637ACCESSORS(Script, line_ends, Object, kLineEndsOffset)
sgjesse@chromium.org98180592009-12-02 08:17:28 +00003638ACCESSORS(Script, eval_from_shared, Object, kEvalFromSharedOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003639ACCESSORS_TO_SMI(Script, eval_from_instructions_offset,
3640 kEvalFrominstructionsOffsetOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003641
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003642#ifdef ENABLE_DEBUGGER_SUPPORT
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003643ACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex)
3644ACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex)
3645ACCESSORS(DebugInfo, code, Code, kPatchedCodeIndex)
3646ACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex)
3647
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003648ACCESSORS_TO_SMI(BreakPointInfo, code_position, kCodePositionIndex)
3649ACCESSORS_TO_SMI(BreakPointInfo, source_position, kSourcePositionIndex)
3650ACCESSORS_TO_SMI(BreakPointInfo, statement_position, kStatementPositionIndex)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003651ACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex)
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003652#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003653
3654ACCESSORS(SharedFunctionInfo, name, Object, kNameOffset)
yangguo@chromium.org5a11aaf2012-06-20 11:29:00 +00003655ACCESSORS(SharedFunctionInfo, optimized_code_map, Object,
3656 kOptimizedCodeMapOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003657ACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset)
3658ACCESSORS(SharedFunctionInfo, initial_map, Object, kInitialMapOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003659ACCESSORS(SharedFunctionInfo, instance_class_name, Object,
3660 kInstanceClassNameOffset)
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003661ACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003662ACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset)
3663ACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
kasperl@chromium.orgd1e3e722009-04-14 13:38:25 +00003664ACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset)
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003665ACCESSORS(SharedFunctionInfo, this_property_assignments, Object,
3666 kThisPropertyAssignmentsOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003667SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003668
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +00003669
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003670BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
3671 kHiddenPrototypeBit)
3672BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
3673BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
3674 kNeedsAccessCheckBit)
ricow@chromium.org2c99e282011-07-28 09:15:17 +00003675BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
3676 kReadOnlyPrototypeBit)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003677BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression,
3678 kIsExpressionBit)
3679BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
3680 kIsTopLevelBit)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003681BOOL_GETTER(SharedFunctionInfo,
3682 compiler_hints,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003683 has_only_simple_this_property_assignments,
3684 kHasOnlySimpleThisPropertyAssignments)
ager@chromium.orgc4c92722009-11-18 14:12:51 +00003685BOOL_ACCESSORS(SharedFunctionInfo,
3686 compiler_hints,
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +00003687 allows_lazy_compilation,
3688 kAllowLazyCompilation)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003689BOOL_ACCESSORS(SharedFunctionInfo,
3690 compiler_hints,
yangguo@chromium.org5a11aaf2012-06-20 11:29:00 +00003691 allows_lazy_compilation_without_context,
3692 kAllowLazyCompilationWithoutContext)
3693BOOL_ACCESSORS(SharedFunctionInfo,
3694 compiler_hints,
whesse@chromium.org7b260152011-06-20 15:33:18 +00003695 uses_arguments,
3696 kUsesArguments)
3697BOOL_ACCESSORS(SharedFunctionInfo,
3698 compiler_hints,
3699 has_duplicate_parameters,
3700 kHasDuplicateParameters)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003701
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003702
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003703#if V8_HOST_ARCH_32_BIT
3704SMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
3705SMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003706 kFormalParameterCountOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003707SMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003708 kExpectedNofPropertiesOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003709SMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
3710SMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003711 kStartPositionAndTypeOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003712SMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
3713SMI_ACCESSORS(SharedFunctionInfo, function_token_position,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003714 kFunctionTokenPositionOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003715SMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003716 kCompilerHintsOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003717SMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003718 kThisPropertyAssignmentsCountOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003719SMI_ACCESSORS(SharedFunctionInfo, opt_count, kOptCountOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003720SMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset)
3721SMI_ACCESSORS(SharedFunctionInfo,
3722 stress_deopt_counter,
3723 kStressDeoptCounterOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003724#else
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003725
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003726#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003727 STATIC_ASSERT(holder::offset % kPointerSize == 0); \
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003728 int holder::name() { \
3729 int value = READ_INT_FIELD(this, offset); \
3730 ASSERT(kHeapObjectTag == 1); \
3731 ASSERT((value & kHeapObjectTag) == 0); \
3732 return value >> 1; \
3733 } \
3734 void holder::set_##name(int value) { \
3735 ASSERT(kHeapObjectTag == 1); \
3736 ASSERT((value & 0xC0000000) == 0xC0000000 || \
3737 (value & 0xC0000000) == 0x000000000); \
3738 WRITE_INT_FIELD(this, \
3739 offset, \
3740 (value << 1) & ~kHeapObjectTag); \
3741 }
3742
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003743#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \
3744 STATIC_ASSERT(holder::offset % kPointerSize == kIntSize); \
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003745 INT_ACCESSORS(holder, name, offset)
3746
3747
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003748PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003749PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3750 formal_parameter_count,
3751 kFormalParameterCountOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003752
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003753PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3754 expected_nof_properties,
3755 kExpectedNofPropertiesOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003756PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
3757
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003758PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, end_position, kEndPositionOffset)
3759PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3760 start_position_and_type,
3761 kStartPositionAndTypeOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003762
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003763PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3764 function_token_position,
3765 kFunctionTokenPositionOffset)
3766PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3767 compiler_hints,
3768 kCompilerHintsOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003769
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003770PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3771 this_property_assignments_count,
3772 kThisPropertyAssignmentsCountOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003773PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, opt_count, kOptCountOffset)
svenpanne@chromium.orgb1df11d2012-02-08 10:26:21 +00003774
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003775PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, counters, kCountersOffset)
3776PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3777 stress_deopt_counter,
3778 kStressDeoptCounterOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003779#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003780
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003781
3782int SharedFunctionInfo::construction_count() {
3783 return READ_BYTE_FIELD(this, kConstructionCountOffset);
3784}
3785
3786
3787void SharedFunctionInfo::set_construction_count(int value) {
3788 ASSERT(0 <= value && value < 256);
3789 WRITE_BYTE_FIELD(this, kConstructionCountOffset, static_cast<byte>(value));
3790}
3791
3792
whesse@chromium.org7b260152011-06-20 15:33:18 +00003793BOOL_ACCESSORS(SharedFunctionInfo,
3794 compiler_hints,
3795 live_objects_may_exist,
3796 kLiveObjectsMayExist)
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003797
3798
3799bool SharedFunctionInfo::IsInobjectSlackTrackingInProgress() {
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00003800 return initial_map() != GetHeap()->undefined_value();
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003801}
3802
3803
whesse@chromium.org7b260152011-06-20 15:33:18 +00003804BOOL_GETTER(SharedFunctionInfo,
3805 compiler_hints,
3806 optimization_disabled,
3807 kOptimizationDisabled)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003808
3809
3810void SharedFunctionInfo::set_optimization_disabled(bool disable) {
3811 set_compiler_hints(BooleanBit::set(compiler_hints(),
3812 kOptimizationDisabled,
3813 disable));
3814 // If disabling optimizations we reflect that in the code object so
3815 // it will not be counted as optimizable code.
3816 if ((code()->kind() == Code::FUNCTION) && disable) {
3817 code()->set_optimizable(false);
3818 }
3819}
3820
3821
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003822int SharedFunctionInfo::profiler_ticks() {
3823 if (code()->kind() != Code::FUNCTION) return 0;
3824 return code()->profiler_ticks();
3825}
3826
3827
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003828LanguageMode SharedFunctionInfo::language_mode() {
3829 int hints = compiler_hints();
3830 if (BooleanBit::get(hints, kExtendedModeFunction)) {
3831 ASSERT(BooleanBit::get(hints, kStrictModeFunction));
3832 return EXTENDED_MODE;
3833 }
3834 return BooleanBit::get(hints, kStrictModeFunction)
3835 ? STRICT_MODE : CLASSIC_MODE;
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003836}
3837
3838
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003839void SharedFunctionInfo::set_language_mode(LanguageMode language_mode) {
3840 // We only allow language mode transitions that go set the same language mode
3841 // again or go up in the chain:
3842 // CLASSIC_MODE -> STRICT_MODE -> EXTENDED_MODE.
3843 ASSERT(this->language_mode() == CLASSIC_MODE ||
3844 this->language_mode() == language_mode ||
3845 language_mode == EXTENDED_MODE);
3846 int hints = compiler_hints();
3847 hints = BooleanBit::set(
3848 hints, kStrictModeFunction, language_mode != CLASSIC_MODE);
3849 hints = BooleanBit::set(
3850 hints, kExtendedModeFunction, language_mode == EXTENDED_MODE);
3851 set_compiler_hints(hints);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003852}
3853
3854
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003855bool SharedFunctionInfo::is_classic_mode() {
3856 return !BooleanBit::get(compiler_hints(), kStrictModeFunction);
3857}
3858
3859BOOL_GETTER(SharedFunctionInfo, compiler_hints, is_extended_mode,
3860 kExtendedModeFunction)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00003861BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative)
3862BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints,
3863 name_should_print_as_anonymous,
3864 kNameShouldPrintAsAnonymous)
3865BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, bound, kBoundFunction)
3866BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_anonymous, kIsAnonymous)
yangguo@chromium.org56454712012-02-16 15:33:53 +00003867BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_function, kIsFunction)
3868BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_optimize,
3869 kDontOptimize)
svenpanne@chromium.orgb1df11d2012-02-08 10:26:21 +00003870BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_inline, kDontInline)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003871
yangguo@chromium.org5a11aaf2012-06-20 11:29:00 +00003872void SharedFunctionInfo::BeforeVisitingPointers() {
3873 if (IsInobjectSlackTrackingInProgress()) DetachInitialMap();
3874
3875 // Flush optimized code map on major GC.
3876 // Note: we may experiment with rebuilding it or retaining entries
3877 // which should survive as we iterate through optimized functions
3878 // anyway.
3879 set_optimized_code_map(Smi::FromInt(0));
3880}
3881
3882
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00003883ACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
3884ACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
3885
jkummerow@chromium.orge297f592011-06-08 10:05:15 +00003886ACCESSORS(PolymorphicCodeCache, cache, Object, kCacheOffset)
3887
sgjesse@chromium.org152a0b02009-10-07 13:50:16 +00003888bool Script::HasValidSource() {
3889 Object* src = this->source();
3890 if (!src->IsString()) return true;
3891 String* src_str = String::cast(src);
3892 if (!StringShape(src_str).IsExternal()) return true;
3893 if (src_str->IsAsciiRepresentation()) {
3894 return ExternalAsciiString::cast(src)->resource() != NULL;
3895 } else if (src_str->IsTwoByteRepresentation()) {
3896 return ExternalTwoByteString::cast(src)->resource() != NULL;
3897 }
3898 return true;
3899}
3900
3901
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00003902void SharedFunctionInfo::DontAdaptArguments() {
3903 ASSERT(code()->kind() == Code::BUILTIN);
3904 set_formal_parameter_count(kDontAdaptArgumentsSentinel);
3905}
3906
3907
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003908int SharedFunctionInfo::start_position() {
3909 return start_position_and_type() >> kStartPositionShift;
3910}
3911
3912
3913void SharedFunctionInfo::set_start_position(int start_position) {
3914 set_start_position_and_type((start_position << kStartPositionShift)
3915 | (start_position_and_type() & ~kStartPositionMask));
3916}
3917
3918
3919Code* SharedFunctionInfo::code() {
3920 return Code::cast(READ_FIELD(this, kCodeOffset));
3921}
3922
3923
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003924Code* SharedFunctionInfo::unchecked_code() {
3925 return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset));
3926}
3927
3928
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003929void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003930 WRITE_FIELD(this, kCodeOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003931 CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003932}
3933
3934
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00003935ScopeInfo* SharedFunctionInfo::scope_info() {
3936 return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset));
ager@chromium.orgb5737492010-07-15 09:29:43 +00003937}
3938
3939
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00003940void SharedFunctionInfo::set_scope_info(ScopeInfo* value,
ager@chromium.orgb5737492010-07-15 09:29:43 +00003941 WriteBarrierMode mode) {
3942 WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003943 CONDITIONAL_WRITE_BARRIER(GetHeap(),
3944 this,
3945 kScopeInfoOffset,
3946 reinterpret_cast<Object*>(value),
3947 mode);
ager@chromium.orgb5737492010-07-15 09:29:43 +00003948}
3949
3950
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003951bool SharedFunctionInfo::is_compiled() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00003952 return code() !=
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00003953 Isolate::Current()->builtins()->builtin(Builtins::kLazyCompile);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003954}
3955
3956
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003957bool SharedFunctionInfo::IsApiFunction() {
3958 return function_data()->IsFunctionTemplateInfo();
3959}
3960
3961
3962FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
3963 ASSERT(IsApiFunction());
3964 return FunctionTemplateInfo::cast(function_data());
3965}
3966
3967
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00003968bool SharedFunctionInfo::HasBuiltinFunctionId() {
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +00003969 return function_data()->IsSmi();
3970}
3971
3972
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00003973BuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
3974 ASSERT(HasBuiltinFunctionId());
3975 return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value());
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003976}
3977
3978
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003979int SharedFunctionInfo::code_age() {
3980 return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask;
3981}
3982
3983
3984void SharedFunctionInfo::set_code_age(int code_age) {
mstarzinger@chromium.orgf8c6bd52011-11-23 12:13:52 +00003985 int hints = compiler_hints() & ~(kCodeAgeMask << kCodeAgeShift);
3986 set_compiler_hints(hints | ((code_age & kCodeAgeMask) << kCodeAgeShift));
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003987}
3988
3989
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003990int SharedFunctionInfo::ic_age() {
3991 return ICAgeBits::decode(counters());
3992}
3993
3994
3995void SharedFunctionInfo::set_ic_age(int ic_age) {
3996 set_counters(ICAgeBits::update(counters(), ic_age));
3997}
3998
3999
4000int SharedFunctionInfo::deopt_count() {
4001 return DeoptCountBits::decode(counters());
4002}
4003
4004
4005void SharedFunctionInfo::set_deopt_count(int deopt_count) {
4006 set_counters(DeoptCountBits::update(counters(), deopt_count));
4007}
4008
4009
4010void SharedFunctionInfo::increment_deopt_count() {
4011 int value = counters();
4012 int deopt_count = DeoptCountBits::decode(value);
4013 deopt_count = (deopt_count + 1) & DeoptCountBits::kMax;
4014 set_counters(DeoptCountBits::update(value, deopt_count));
4015}
4016
4017
4018int SharedFunctionInfo::opt_reenable_tries() {
4019 return OptReenableTriesBits::decode(counters());
4020}
4021
4022
4023void SharedFunctionInfo::set_opt_reenable_tries(int tries) {
4024 set_counters(OptReenableTriesBits::update(counters(), tries));
4025}
4026
4027
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004028bool SharedFunctionInfo::has_deoptimization_support() {
4029 Code* code = this->code();
4030 return code->kind() == Code::FUNCTION && code->has_deoptimization_support();
4031}
4032
4033
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004034void SharedFunctionInfo::TryReenableOptimization() {
4035 int tries = opt_reenable_tries();
4036 set_opt_reenable_tries((tries + 1) & OptReenableTriesBits::kMax);
4037 // We reenable optimization whenever the number of tries is a large
4038 // enough power of 2.
4039 if (tries >= 16 && (((tries - 1) & tries) == 0)) {
4040 set_optimization_disabled(false);
4041 set_opt_count(0);
4042 set_deopt_count(0);
4043 code()->set_optimizable(true);
4044 }
4045}
4046
4047
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004048bool JSFunction::IsBuiltin() {
4049 return context()->global()->IsJSBuiltinsObject();
4050}
4051
4052
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004053bool JSFunction::NeedsArgumentsAdaption() {
4054 return shared()->formal_parameter_count() !=
4055 SharedFunctionInfo::kDontAdaptArgumentsSentinel;
4056}
4057
4058
4059bool JSFunction::IsOptimized() {
4060 return code()->kind() == Code::OPTIMIZED_FUNCTION;
4061}
4062
4063
ager@chromium.orga9aa5fa2011-04-13 08:46:07 +00004064bool JSFunction::IsOptimizable() {
4065 return code()->kind() == Code::FUNCTION && code()->optimizable();
4066}
4067
4068
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004069bool JSFunction::IsMarkedForLazyRecompilation() {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00004070 return code() == GetIsolate()->builtins()->builtin(Builtins::kLazyRecompile);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004071}
4072
4073
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004074Code* JSFunction::code() {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004075 return Code::cast(unchecked_code());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004076}
4077
4078
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004079Code* JSFunction::unchecked_code() {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004080 return reinterpret_cast<Code*>(
4081 Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset)));
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004082}
4083
4084
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004085void JSFunction::set_code(Code* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004086 ASSERT(!HEAP->InNewSpace(value));
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004087 Address entry = value->entry();
4088 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004089 GetHeap()->incremental_marking()->RecordWriteOfCodeEntry(
4090 this,
4091 HeapObject::RawField(this, kCodeEntryOffset),
4092 value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004093}
4094
4095
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004096void JSFunction::ReplaceCode(Code* code) {
4097 bool was_optimized = IsOptimized();
4098 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
4099
4100 set_code(code);
4101
4102 // Add/remove the function from the list of optimized functions for this
4103 // context based on the state change.
4104 if (!was_optimized && is_optimized) {
4105 context()->global_context()->AddOptimizedFunction(this);
4106 }
4107 if (was_optimized && !is_optimized) {
4108 context()->global_context()->RemoveOptimizedFunction(this);
4109 }
4110}
4111
4112
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004113Context* JSFunction::context() {
4114 return Context::cast(READ_FIELD(this, kContextOffset));
4115}
4116
4117
4118Object* JSFunction::unchecked_context() {
4119 return READ_FIELD(this, kContextOffset);
4120}
4121
4122
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004123SharedFunctionInfo* JSFunction::unchecked_shared() {
4124 return reinterpret_cast<SharedFunctionInfo*>(
4125 READ_FIELD(this, kSharedFunctionInfoOffset));
4126}
4127
4128
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004129void JSFunction::set_context(Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004130 ASSERT(value->IsUndefined() || value->IsContext());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004131 WRITE_FIELD(this, kContextOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004132 WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004133}
4134
4135ACCESSORS(JSFunction, prototype_or_initial_map, Object,
4136 kPrototypeOrInitialMapOffset)
4137
4138
4139Map* JSFunction::initial_map() {
4140 return Map::cast(prototype_or_initial_map());
4141}
4142
4143
4144void JSFunction::set_initial_map(Map* value) {
4145 set_prototype_or_initial_map(value);
4146}
4147
4148
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004149MaybeObject* JSFunction::set_initial_map_and_cache_transitions(
4150 Map* initial_map) {
4151 Context* global_context = context()->global_context();
4152 Object* array_function =
4153 global_context->get(Context::ARRAY_FUNCTION_INDEX);
4154 if (array_function->IsJSFunction() &&
4155 this == JSFunction::cast(array_function)) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004156 // Replace all of the cached initial array maps in the global context with
4157 // the appropriate transitioned elements kind maps.
4158 Heap* heap = GetHeap();
4159 MaybeObject* maybe_maps =
4160 heap->AllocateFixedArrayWithHoles(kElementsKindCount);
4161 FixedArray* maps;
4162 if (!maybe_maps->To(&maps)) return maybe_maps;
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004163
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004164 Map* current_map = initial_map;
4165 ElementsKind kind = current_map->elements_kind();
4166 ASSERT(kind == GetInitialFastElementsKind());
4167 maps->set(kind, current_map);
4168 for (int i = GetSequenceIndexFromFastElementsKind(kind) + 1;
4169 i < kFastElementsKindCount; ++i) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004170 Map* new_map;
4171 ElementsKind next_kind = GetFastElementsKindFromSequenceIndex(i);
4172 MaybeObject* maybe_new_map =
4173 current_map->CreateNextElementsTransition(next_kind);
4174 if (!maybe_new_map->To(&new_map)) return maybe_new_map;
4175 maps->set(next_kind, new_map);
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004176 current_map = new_map;
4177 }
4178 global_context->set_js_array_maps(maps);
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004179 }
4180 set_initial_map(initial_map);
4181 return this;
4182}
4183
4184
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004185bool JSFunction::has_initial_map() {
4186 return prototype_or_initial_map()->IsMap();
4187}
4188
4189
4190bool JSFunction::has_instance_prototype() {
4191 return has_initial_map() || !prototype_or_initial_map()->IsTheHole();
4192}
4193
4194
4195bool JSFunction::has_prototype() {
4196 return map()->has_non_instance_prototype() || has_instance_prototype();
4197}
4198
4199
4200Object* JSFunction::instance_prototype() {
4201 ASSERT(has_instance_prototype());
4202 if (has_initial_map()) return initial_map()->prototype();
4203 // When there is no initial map and the prototype is a JSObject, the
4204 // initial map field is used for the prototype field.
4205 return prototype_or_initial_map();
4206}
4207
4208
4209Object* JSFunction::prototype() {
4210 ASSERT(has_prototype());
4211 // If the function's prototype property has been set to a non-JSObject
4212 // value, that value is stored in the constructor field of the map.
4213 if (map()->has_non_instance_prototype()) return map()->constructor();
4214 return instance_prototype();
4215}
4216
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004217
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00004218bool JSFunction::should_have_prototype() {
4219 return map()->function_with_prototype();
4220}
4221
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004222
4223bool JSFunction::is_compiled() {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00004224 return code() != GetIsolate()->builtins()->builtin(Builtins::kLazyCompile);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004225}
4226
4227
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004228FixedArray* JSFunction::literals() {
4229 ASSERT(!shared()->bound());
4230 return literals_or_bindings();
4231}
4232
4233
4234void JSFunction::set_literals(FixedArray* literals) {
4235 ASSERT(!shared()->bound());
4236 set_literals_or_bindings(literals);
4237}
4238
4239
4240FixedArray* JSFunction::function_bindings() {
4241 ASSERT(shared()->bound());
4242 return literals_or_bindings();
4243}
4244
4245
4246void JSFunction::set_function_bindings(FixedArray* bindings) {
4247 ASSERT(shared()->bound());
4248 // Bound function literal may be initialized to the empty fixed array
4249 // before the bindings are set.
4250 ASSERT(bindings == GetHeap()->empty_fixed_array() ||
4251 bindings->map() == GetHeap()->fixed_cow_array_map());
4252 set_literals_or_bindings(bindings);
4253}
4254
4255
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004256int JSFunction::NumberOfLiterals() {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004257 ASSERT(!shared()->bound());
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004258 return literals()->length();
4259}
4260
4261
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004262Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004263 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004264 return READ_FIELD(this, OffsetOfFunctionWithId(id));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004265}
4266
4267
4268void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
4269 Object* value) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004270 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004271 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004272 WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value);
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004273}
4274
4275
4276Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004277 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004278 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
4279}
4280
4281
4282void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
4283 Code* value) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004284 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004285 WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004286 ASSERT(!HEAP->InNewSpace(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004287}
4288
4289
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00004290ACCESSORS(JSProxy, handler, Object, kHandlerOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004291ACCESSORS(JSProxy, hash, Object, kHashOffset)
lrn@chromium.org34e60782011-09-15 07:25:40 +00004292ACCESSORS(JSFunctionProxy, call_trap, Object, kCallTrapOffset)
4293ACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset)
4294
4295
4296void JSProxy::InitializeBody(int object_size, Object* value) {
4297 ASSERT(!value->IsHeapObject() || !GetHeap()->InNewSpace(value));
4298 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
4299 WRITE_FIELD(this, offset, value);
4300 }
4301}
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00004302
4303
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004304ACCESSORS(JSSet, table, Object, kTableOffset)
4305ACCESSORS(JSMap, table, Object, kTableOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004306ACCESSORS(JSWeakMap, table, Object, kTableOffset)
4307ACCESSORS(JSWeakMap, next, Object, kNextOffset)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00004308
4309
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00004310Address Foreign::foreign_address() {
4311 return AddressFrom<Address>(READ_INTPTR_FIELD(this, kForeignAddressOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004312}
4313
4314
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00004315void Foreign::set_foreign_address(Address value) {
4316 WRITE_INTPTR_FIELD(this, kForeignAddressOffset, OffsetFrom(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004317}
4318
4319
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00004320ACCESSORS(JSModule, context, Object, kContextOffset)
4321
4322
4323JSModule* JSModule::cast(Object* obj) {
4324 ASSERT(obj->IsJSModule());
4325 ASSERT(HeapObject::cast(obj)->Size() == JSModule::kSize);
4326 return reinterpret_cast<JSModule*>(obj);
4327}
4328
4329
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004330ACCESSORS(JSValue, value, Object, kValueOffset)
4331
4332
4333JSValue* JSValue::cast(Object* obj) {
4334 ASSERT(obj->IsJSValue());
4335 ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize);
4336 return reinterpret_cast<JSValue*>(obj);
4337}
4338
4339
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +00004340ACCESSORS(JSDate, value, Object, kValueOffset)
4341ACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset)
4342ACCESSORS(JSDate, year, Object, kYearOffset)
4343ACCESSORS(JSDate, month, Object, kMonthOffset)
4344ACCESSORS(JSDate, day, Object, kDayOffset)
4345ACCESSORS(JSDate, weekday, Object, kWeekdayOffset)
4346ACCESSORS(JSDate, hour, Object, kHourOffset)
4347ACCESSORS(JSDate, min, Object, kMinOffset)
4348ACCESSORS(JSDate, sec, Object, kSecOffset)
4349
4350
4351JSDate* JSDate::cast(Object* obj) {
4352 ASSERT(obj->IsJSDate());
4353 ASSERT(HeapObject::cast(obj)->Size() == JSDate::kSize);
4354 return reinterpret_cast<JSDate*>(obj);
4355}
4356
4357
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00004358ACCESSORS(JSMessageObject, type, String, kTypeOffset)
4359ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
4360ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
4361ACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset)
4362ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
4363SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
4364SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
4365
4366
4367JSMessageObject* JSMessageObject::cast(Object* obj) {
4368 ASSERT(obj->IsJSMessageObject());
4369 ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize);
4370 return reinterpret_cast<JSMessageObject*>(obj);
4371}
4372
4373
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004374INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004375ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
jkummerow@chromium.org04e4f1e2011-11-14 13:36:17 +00004376ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004377ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00004378ACCESSORS(Code, type_feedback_info, Object, kTypeFeedbackInfoOffset)
yangguo@chromium.org659ceec2012-01-26 07:37:54 +00004379ACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset)
danno@chromium.org88aa0582012-03-23 15:11:57 +00004380INT_ACCESSORS(Code, ic_age, kICAgeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004381
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004382byte* Code::instruction_start() {
4383 return FIELD_ADDR(this, kHeaderSize);
4384}
4385
4386
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004387byte* Code::instruction_end() {
4388 return instruction_start() + instruction_size();
4389}
4390
4391
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004392int Code::body_size() {
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004393 return RoundUp(instruction_size(), kObjectAlignment);
4394}
4395
4396
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004397FixedArray* Code::unchecked_deoptimization_data() {
4398 return reinterpret_cast<FixedArray*>(
4399 READ_FIELD(this, kDeoptimizationDataOffset));
4400}
4401
4402
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004403ByteArray* Code::unchecked_relocation_info() {
4404 return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004405}
4406
4407
4408byte* Code::relocation_start() {
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004409 return unchecked_relocation_info()->GetDataStartAddress();
4410}
4411
4412
4413int Code::relocation_size() {
4414 return unchecked_relocation_info()->length();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004415}
4416
4417
4418byte* Code::entry() {
4419 return instruction_start();
4420}
4421
4422
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004423bool Code::contains(byte* inner_pointer) {
4424 return (address() <= inner_pointer) && (inner_pointer <= address() + Size());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004425}
4426
4427
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004428ACCESSORS(JSArray, length, Object, kLengthOffset)
4429
4430
ager@chromium.org236ad962008-09-25 09:45:57 +00004431ACCESSORS(JSRegExp, data, Object, kDataOffset)
ager@chromium.org236ad962008-09-25 09:45:57 +00004432
4433
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004434JSRegExp::Type JSRegExp::TypeTag() {
4435 Object* data = this->data();
4436 if (data->IsUndefined()) return JSRegExp::NOT_COMPILED;
4437 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
4438 return static_cast<JSRegExp::Type>(smi->value());
ager@chromium.org236ad962008-09-25 09:45:57 +00004439}
4440
4441
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004442JSRegExp::Type JSRegExp::TypeTagUnchecked() {
4443 Smi* smi = Smi::cast(DataAtUnchecked(kTagIndex));
4444 return static_cast<JSRegExp::Type>(smi->value());
4445}
4446
4447
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00004448int JSRegExp::CaptureCount() {
4449 switch (TypeTag()) {
4450 case ATOM:
4451 return 0;
4452 case IRREGEXP:
4453 return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value();
4454 default:
4455 UNREACHABLE();
4456 return -1;
4457 }
4458}
4459
4460
ager@chromium.orga74f0da2008-12-03 16:05:52 +00004461JSRegExp::Flags JSRegExp::GetFlags() {
4462 ASSERT(this->data()->IsFixedArray());
4463 Object* data = this->data();
4464 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex));
4465 return Flags(smi->value());
4466}
4467
4468
4469String* JSRegExp::Pattern() {
4470 ASSERT(this->data()->IsFixedArray());
4471 Object* data = this->data();
4472 String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex));
4473 return pattern;
4474}
4475
4476
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004477Object* JSRegExp::DataAt(int index) {
4478 ASSERT(TypeTag() != NOT_COMPILED);
4479 return FixedArray::cast(data())->get(index);
ager@chromium.org236ad962008-09-25 09:45:57 +00004480}
4481
4482
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004483Object* JSRegExp::DataAtUnchecked(int index) {
4484 FixedArray* fa = reinterpret_cast<FixedArray*>(data());
4485 int offset = FixedArray::kHeaderSize + index * kPointerSize;
4486 return READ_FIELD(fa, offset);
4487}
4488
4489
kasperl@chromium.org7be3c992009-03-12 07:19:55 +00004490void JSRegExp::SetDataAt(int index, Object* value) {
4491 ASSERT(TypeTag() != NOT_COMPILED);
4492 ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
4493 FixedArray::cast(data())->set(index, value);
4494}
4495
4496
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004497void JSRegExp::SetDataAtUnchecked(int index, Object* value, Heap* heap) {
4498 ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
4499 FixedArray* fa = reinterpret_cast<FixedArray*>(data());
4500 if (value->IsSmi()) {
4501 fa->set_unchecked(index, Smi::cast(value));
4502 } else {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004503 // We only do this during GC, so we don't need to notify the write barrier.
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004504 fa->set_unchecked(heap, index, value, SKIP_WRITE_BARRIER);
4505 }
4506}
4507
4508
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00004509ElementsKind JSObject::GetElementsKind() {
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00004510 ElementsKind kind = map()->elements_kind();
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004511#if DEBUG
4512 FixedArrayBase* fixed_array =
4513 reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset));
4514 Map* map = fixed_array->map();
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004515 ASSERT((IsFastSmiOrObjectElementsKind(kind) &&
4516 (map == GetHeap()->fixed_array_map() ||
4517 map == GetHeap()->fixed_cow_array_map())) ||
4518 (IsFastDoubleElementsKind(kind) &&
4519 (fixed_array->IsFixedDoubleArray() ||
4520 fixed_array == GetHeap()->empty_fixed_array())) ||
4521 (kind == DICTIONARY_ELEMENTS &&
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004522 fixed_array->IsFixedArray() &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004523 fixed_array->IsDictionary()) ||
4524 (kind > DICTIONARY_ELEMENTS));
4525 ASSERT((kind != NON_STRICT_ARGUMENTS_ELEMENTS) ||
4526 (elements()->IsFixedArray() && elements()->length() >= 2));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004527#endif
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00004528 return kind;
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004529}
4530
4531
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00004532ElementsAccessor* JSObject::GetElementsAccessor() {
4533 return ElementsAccessor::ForKind(GetElementsKind());
4534}
4535
4536
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004537bool JSObject::HasFastObjectElements() {
4538 return IsFastObjectElementsKind(GetElementsKind());
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004539}
4540
4541
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004542bool JSObject::HasFastSmiElements() {
4543 return IsFastSmiElementsKind(GetElementsKind());
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004544}
4545
4546
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004547bool JSObject::HasFastSmiOrObjectElements() {
4548 return IsFastSmiOrObjectElementsKind(GetElementsKind());
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004549}
4550
4551
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00004552bool JSObject::HasFastDoubleElements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004553 return IsFastDoubleElementsKind(GetElementsKind());
4554}
4555
4556
4557bool JSObject::HasFastHoleyElements() {
4558 return IsFastHoleyElementsKind(GetElementsKind());
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00004559}
4560
4561
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004562bool JSObject::HasDictionaryElements() {
4563 return GetElementsKind() == DICTIONARY_ELEMENTS;
4564}
4565
4566
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004567bool JSObject::HasNonStrictArgumentsElements() {
4568 return GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS;
4569}
4570
4571
ager@chromium.org3811b432009-10-28 14:53:37 +00004572bool JSObject::HasExternalArrayElements() {
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004573 HeapObject* array = elements();
4574 ASSERT(array != NULL);
4575 return array->IsExternalArray();
ager@chromium.org3811b432009-10-28 14:53:37 +00004576}
4577
4578
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004579#define EXTERNAL_ELEMENTS_CHECK(name, type) \
4580bool JSObject::HasExternal##name##Elements() { \
4581 HeapObject* array = elements(); \
4582 ASSERT(array != NULL); \
4583 if (!array->IsHeapObject()) \
4584 return false; \
4585 return array->map()->instance_type() == type; \
ager@chromium.org3811b432009-10-28 14:53:37 +00004586}
4587
4588
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004589EXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE)
4590EXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
4591EXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE)
4592EXTERNAL_ELEMENTS_CHECK(UnsignedShort,
4593 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
4594EXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE)
4595EXTERNAL_ELEMENTS_CHECK(UnsignedInt,
4596 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
4597EXTERNAL_ELEMENTS_CHECK(Float,
4598 EXTERNAL_FLOAT_ARRAY_TYPE)
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00004599EXTERNAL_ELEMENTS_CHECK(Double,
4600 EXTERNAL_DOUBLE_ARRAY_TYPE)
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004601EXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE)
ager@chromium.org3811b432009-10-28 14:53:37 +00004602
4603
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004604bool JSObject::HasNamedInterceptor() {
4605 return map()->has_named_interceptor();
4606}
4607
4608
4609bool JSObject::HasIndexedInterceptor() {
4610 return map()->has_indexed_interceptor();
4611}
4612
4613
lrn@chromium.org303ada72010-10-27 09:33:13 +00004614MaybeObject* JSObject::EnsureWritableFastElements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004615 ASSERT(HasFastSmiOrObjectElements());
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004616 FixedArray* elems = FixedArray::cast(elements());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004617 Isolate* isolate = GetIsolate();
4618 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems;
lrn@chromium.org303ada72010-10-27 09:33:13 +00004619 Object* writable_elems;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004620 { MaybeObject* maybe_writable_elems = isolate->heap()->CopyFixedArrayWithMap(
4621 elems, isolate->heap()->fixed_array_map());
lrn@chromium.org303ada72010-10-27 09:33:13 +00004622 if (!maybe_writable_elems->ToObject(&writable_elems)) {
4623 return maybe_writable_elems;
4624 }
4625 }
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004626 set_elements(FixedArray::cast(writable_elems));
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004627 isolate->counters()->cow_arrays_converted()->Increment();
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004628 return writable_elems;
4629}
4630
4631
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004632StringDictionary* JSObject::property_dictionary() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004633 ASSERT(!HasFastProperties());
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004634 return StringDictionary::cast(properties());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004635}
4636
4637
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004638SeededNumberDictionary* JSObject::element_dictionary() {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004639 ASSERT(HasDictionaryElements());
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004640 return SeededNumberDictionary::cast(elements());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004641}
4642
4643
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004644bool String::IsHashFieldComputed(uint32_t field) {
4645 return (field & kHashNotComputedMask) == 0;
4646}
4647
4648
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004649bool String::HasHashCode() {
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004650 return IsHashFieldComputed(hash_field());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004651}
4652
4653
4654uint32_t String::Hash() {
4655 // Fast case: has hash code already been computed?
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004656 uint32_t field = hash_field();
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004657 if (IsHashFieldComputed(field)) return field >> kHashShift;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004658 // Slow case: compute hash code and set it.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004659 return ComputeAndSetHash();
4660}
4661
4662
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004663StringHasher::StringHasher(int length, uint32_t seed)
ager@chromium.org7c537e22008-10-16 08:43:32 +00004664 : length_(length),
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004665 raw_running_hash_(seed),
ager@chromium.org7c537e22008-10-16 08:43:32 +00004666 array_index_(0),
4667 is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize),
4668 is_first_char_(true),
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004669 is_valid_(true) {
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004670 ASSERT(FLAG_randomize_hashes || raw_running_hash_ == 0);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004671}
ager@chromium.org7c537e22008-10-16 08:43:32 +00004672
4673
4674bool StringHasher::has_trivial_hash() {
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004675 return length_ > String::kMaxHashCalcLength;
ager@chromium.org7c537e22008-10-16 08:43:32 +00004676}
4677
4678
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004679void StringHasher::AddCharacter(uint32_t c) {
4680 if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
4681 AddSurrogatePair(c); // Not inlined.
4682 return;
4683 }
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004684 // Use the Jenkins one-at-a-time hash function to update the hash
4685 // for the given character.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004686 raw_running_hash_ += c;
4687 raw_running_hash_ += (raw_running_hash_ << 10);
4688 raw_running_hash_ ^= (raw_running_hash_ >> 6);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004689 // Incremental array index computation.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004690 if (is_array_index_) {
4691 if (c < '0' || c > '9') {
4692 is_array_index_ = false;
4693 } else {
4694 int d = c - '0';
4695 if (is_first_char_) {
4696 is_first_char_ = false;
4697 if (c == '0' && length_ > 1) {
4698 is_array_index_ = false;
4699 return;
4700 }
4701 }
4702 if (array_index_ > 429496729U - ((d + 2) >> 3)) {
4703 is_array_index_ = false;
4704 } else {
4705 array_index_ = array_index_ * 10 + d;
4706 }
4707 }
4708 }
4709}
4710
4711
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004712void StringHasher::AddCharacterNoIndex(uint32_t c) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00004713 ASSERT(!is_array_index());
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004714 if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
4715 AddSurrogatePairNoIndex(c); // Not inlined.
4716 return;
4717 }
ager@chromium.org7c537e22008-10-16 08:43:32 +00004718 raw_running_hash_ += c;
4719 raw_running_hash_ += (raw_running_hash_ << 10);
4720 raw_running_hash_ ^= (raw_running_hash_ >> 6);
4721}
4722
4723
4724uint32_t StringHasher::GetHash() {
ager@chromium.org3b45ab52009-03-19 22:21:34 +00004725 // Get the calculated raw hash value and do some more bit ops to distribute
4726 // the hash further. Ensure that we never return zero as the hash value.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004727 uint32_t result = raw_running_hash_;
4728 result += (result << 3);
4729 result ^= (result >> 11);
4730 result += (result << 15);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004731 if ((result & String::kHashBitMask) == 0) {
ager@chromium.org3b45ab52009-03-19 22:21:34 +00004732 result = 27;
4733 }
ager@chromium.org7c537e22008-10-16 08:43:32 +00004734 return result;
4735}
4736
4737
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00004738template <typename schar>
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004739uint32_t HashSequentialString(const schar* chars, int length, uint32_t seed) {
4740 StringHasher hasher(length, seed);
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00004741 if (!hasher.has_trivial_hash()) {
4742 int i;
4743 for (i = 0; hasher.is_array_index() && (i < length); i++) {
4744 hasher.AddCharacter(chars[i]);
4745 }
4746 for (; i < length; i++) {
4747 hasher.AddCharacterNoIndex(chars[i]);
4748 }
4749 }
4750 return hasher.GetHashField();
4751}
4752
4753
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004754bool String::AsArrayIndex(uint32_t* index) {
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004755 uint32_t field = hash_field();
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00004756 if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) {
4757 return false;
4758 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004759 return SlowAsArrayIndex(index);
4760}
4761
4762
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00004763Object* JSReceiver::GetPrototype() {
4764 return HeapObject::cast(this)->map()->prototype();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004765}
4766
4767
rossberg@chromium.org717967f2011-07-20 13:44:42 +00004768bool JSReceiver::HasProperty(String* name) {
4769 if (IsJSProxy()) {
4770 return JSProxy::cast(this)->HasPropertyWithHandler(name);
4771 }
4772 return GetPropertyAttribute(name) != ABSENT;
4773}
4774
4775
4776bool JSReceiver::HasLocalProperty(String* name) {
4777 if (IsJSProxy()) {
4778 return JSProxy::cast(this)->HasPropertyWithHandler(name);
4779 }
4780 return GetLocalPropertyAttribute(name) != ABSENT;
4781}
4782
4783
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00004784PropertyAttributes JSReceiver::GetPropertyAttribute(String* key) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004785 return GetPropertyAttributeWithReceiver(this, key);
4786}
4787
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004788// TODO(504): this may be useful in other places too where JSGlobalProxy
4789// is used.
4790Object* JSObject::BypassGlobalProxy() {
4791 if (IsJSGlobalProxy()) {
4792 Object* proto = GetPrototype();
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004793 if (proto->IsNull()) return GetHeap()->undefined_value();
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004794 ASSERT(proto->IsJSGlobalObject());
4795 return proto;
4796 }
4797 return this;
4798}
4799
4800
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004801MaybeObject* JSReceiver::GetIdentityHash(CreationFlag flag) {
4802 return IsJSProxy()
4803 ? JSProxy::cast(this)->GetIdentityHash(flag)
4804 : JSObject::cast(this)->GetIdentityHash(flag);
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004805}
4806
4807
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004808bool JSReceiver::HasElement(uint32_t index) {
4809 if (IsJSProxy()) {
4810 return JSProxy::cast(this)->HasElementWithHandler(index);
4811 }
4812 return JSObject::cast(this)->HasElementWithReceiver(this, index);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004813}
4814
4815
4816bool AccessorInfo::all_can_read() {
4817 return BooleanBit::get(flag(), kAllCanReadBit);
4818}
4819
4820
4821void AccessorInfo::set_all_can_read(bool value) {
4822 set_flag(BooleanBit::set(flag(), kAllCanReadBit, value));
4823}
4824
4825
4826bool AccessorInfo::all_can_write() {
4827 return BooleanBit::get(flag(), kAllCanWriteBit);
4828}
4829
4830
4831void AccessorInfo::set_all_can_write(bool value) {
4832 set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value));
4833}
4834
4835
ager@chromium.org870a0b62008-11-04 11:43:05 +00004836bool AccessorInfo::prohibits_overwriting() {
4837 return BooleanBit::get(flag(), kProhibitsOverwritingBit);
4838}
4839
4840
4841void AccessorInfo::set_prohibits_overwriting(bool value) {
4842 set_flag(BooleanBit::set(flag(), kProhibitsOverwritingBit, value));
4843}
4844
4845
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004846PropertyAttributes AccessorInfo::property_attributes() {
4847 return AttributesField::decode(static_cast<uint32_t>(flag()->value()));
4848}
4849
4850
4851void AccessorInfo::set_property_attributes(PropertyAttributes attributes) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00004852 set_flag(Smi::FromInt(AttributesField::update(flag()->value(), attributes)));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004853}
4854
karlklose@chromium.org44bc7082011-04-11 12:33:05 +00004855
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004856bool AccessorInfo::IsCompatibleReceiver(Object* receiver) {
4857 Object* function_template = expected_receiver_type();
4858 if (!function_template->IsFunctionTemplateInfo()) return true;
4859 return receiver->IsInstanceOf(FunctionTemplateInfo::cast(function_template));
4860}
4861
4862
karlklose@chromium.org44bc7082011-04-11 12:33:05 +00004863template<typename Shape, typename Key>
4864void Dictionary<Shape, Key>::SetEntry(int entry,
4865 Object* key,
4866 Object* value) {
4867 SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
4868}
4869
4870
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004871template<typename Shape, typename Key>
4872void Dictionary<Shape, Key>::SetEntry(int entry,
4873 Object* key,
4874 Object* value,
4875 PropertyDetails details) {
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00004876 ASSERT(!key->IsString() || details.IsDeleted() || details.index() > 0);
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004877 int index = HashTable<Shape, Key>::EntryToIndex(entry);
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004878 AssertNoAllocation no_gc;
4879 WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004880 FixedArray::set(index, key, mode);
4881 FixedArray::set(index+1, value, mode);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004882 FixedArray::set(index+2, details.AsSmi());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004883}
4884
4885
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004886bool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
4887 ASSERT(other->IsNumber());
4888 return key == static_cast<uint32_t>(other->Number());
4889}
4890
4891
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004892uint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) {
4893 return ComputeIntegerHash(key, 0);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004894}
4895
4896
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004897uint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key,
4898 Object* other) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004899 ASSERT(other->IsNumber());
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004900 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004901}
4902
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004903uint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) {
4904 return ComputeIntegerHash(key, seed);
4905}
4906
4907uint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key,
4908 uint32_t seed,
4909 Object* other) {
4910 ASSERT(other->IsNumber());
4911 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed);
4912}
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004913
4914MaybeObject* NumberDictionaryShape::AsObject(uint32_t key) {
4915 return Isolate::Current()->heap()->NumberFromUint32(key);
4916}
4917
4918
4919bool StringDictionaryShape::IsMatch(String* key, Object* other) {
4920 // We know that all entries in a hash table had their hash keys created.
4921 // Use that knowledge to have fast failure.
4922 if (key->Hash() != String::cast(other)->Hash()) return false;
4923 return key->Equals(String::cast(other));
4924}
4925
4926
4927uint32_t StringDictionaryShape::Hash(String* key) {
4928 return key->Hash();
4929}
4930
4931
4932uint32_t StringDictionaryShape::HashForObject(String* key, Object* other) {
4933 return String::cast(other)->Hash();
4934}
4935
4936
4937MaybeObject* StringDictionaryShape::AsObject(String* key) {
4938 return key;
4939}
4940
4941
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004942template <int entrysize>
4943bool ObjectHashTableShape<entrysize>::IsMatch(Object* key, Object* other) {
4944 return key->SameValue(other);
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004945}
4946
4947
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004948template <int entrysize>
4949uint32_t ObjectHashTableShape<entrysize>::Hash(Object* key) {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004950 MaybeObject* maybe_hash = key->GetHash(OMIT_CREATION);
4951 return Smi::cast(maybe_hash->ToObjectChecked())->value();
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004952}
4953
4954
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004955template <int entrysize>
4956uint32_t ObjectHashTableShape<entrysize>::HashForObject(Object* key,
4957 Object* other) {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004958 MaybeObject* maybe_hash = other->GetHash(OMIT_CREATION);
4959 return Smi::cast(maybe_hash->ToObjectChecked())->value();
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004960}
4961
4962
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004963template <int entrysize>
4964MaybeObject* ObjectHashTableShape<entrysize>::AsObject(Object* key) {
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004965 return key;
4966}
4967
4968
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004969void Map::ClearCodeCache(Heap* heap) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004970 // No write barrier is needed since empty_fixed_array is not in new space.
4971 // Please note this function is used during marking:
4972 // - MarkCompactCollector::MarkUnmarkedObject
danno@chromium.org88aa0582012-03-23 15:11:57 +00004973 // - IncrementalMarking::Step
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004974 ASSERT(!heap->InNewSpace(heap->raw_unchecked_empty_fixed_array()));
4975 WRITE_FIELD(this, kCodeCacheOffset, heap->raw_unchecked_empty_fixed_array());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004976}
4977
4978
ager@chromium.org5aa501c2009-06-23 07:57:28 +00004979void JSArray::EnsureSize(int required_size) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004980 ASSERT(HasFastSmiOrObjectElements());
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004981 FixedArray* elts = FixedArray::cast(elements());
ager@chromium.org6141cbe2009-11-20 12:14:52 +00004982 const int kArraySizeThatFitsComfortablyInNewSpace = 128;
4983 if (elts->length() < required_size) {
4984 // Doubling in size would be overkill, but leave some slack to avoid
4985 // constantly growing.
4986 Expand(required_size + (required_size >> 3));
4987 // It's a performance benefit to keep a frequently used array in new-space.
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004988 } else if (!GetHeap()->new_space()->Contains(elts) &&
ager@chromium.org6141cbe2009-11-20 12:14:52 +00004989 required_size < kArraySizeThatFitsComfortablyInNewSpace) {
4990 // Expand will allocate a new backing store in new space even if the size
4991 // we asked for isn't larger than what we had before.
4992 Expand(required_size);
4993 }
ager@chromium.org5aa501c2009-06-23 07:57:28 +00004994}
4995
4996
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004997void JSArray::set_length(Smi* length) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004998 // Don't need a write barrier for a Smi.
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004999 set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
5000}
5001
5002
ricow@chromium.org7ad65222011-12-19 12:13:11 +00005003bool JSArray::AllowsSetElementsLength() {
5004 bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray();
5005 ASSERT(result == !HasExternalArrayElements());
5006 return result;
5007}
5008
5009
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005010MaybeObject* JSArray::SetContent(FixedArrayBase* storage) {
5011 MaybeObject* maybe_result = EnsureCanContainElements(
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00005012 storage, storage->length(), ALLOW_COPIED_DOUBLE_ELEMENTS);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005013 if (maybe_result->IsFailure()) return maybe_result;
5014 ASSERT((storage->map() == GetHeap()->fixed_double_array_map() &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00005015 IsFastDoubleElementsKind(GetElementsKind())) ||
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005016 ((storage->map() != GetHeap()->fixed_double_array_map()) &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00005017 (IsFastObjectElementsKind(GetElementsKind()) ||
5018 (IsFastSmiElementsKind(GetElementsKind()) &&
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005019 FixedArray::cast(storage)->ContainsOnlySmisOrHoles()))));
ager@chromium.org7c537e22008-10-16 08:43:32 +00005020 set_elements(storage);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005021 set_length(Smi::FromInt(storage->length()));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00005022 return this;
ager@chromium.org7c537e22008-10-16 08:43:32 +00005023}
5024
5025
lrn@chromium.org303ada72010-10-27 09:33:13 +00005026MaybeObject* FixedArray::Copy() {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005027 if (length() == 0) return this;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00005028 return GetHeap()->CopyFixedArray(this);
5029}
5030
5031
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00005032MaybeObject* FixedDoubleArray::Copy() {
5033 if (length() == 0) return this;
5034 return GetHeap()->CopyFixedDoubleArray(this);
5035}
5036
5037
danno@chromium.orgfa458e42012-02-01 10:48:36 +00005038void TypeFeedbackCells::SetAstId(int index, Smi* id) {
5039 set(1 + index * 2, id);
5040}
5041
5042
5043Smi* TypeFeedbackCells::AstId(int index) {
5044 return Smi::cast(get(1 + index * 2));
5045}
5046
5047
5048void TypeFeedbackCells::SetCell(int index, JSGlobalPropertyCell* cell) {
5049 set(index * 2, cell);
5050}
5051
5052
5053JSGlobalPropertyCell* TypeFeedbackCells::Cell(int index) {
5054 return JSGlobalPropertyCell::cast(get(index * 2));
5055}
5056
5057
5058Handle<Object> TypeFeedbackCells::UninitializedSentinel(Isolate* isolate) {
5059 return isolate->factory()->the_hole_value();
5060}
5061
5062
5063Handle<Object> TypeFeedbackCells::MegamorphicSentinel(Isolate* isolate) {
5064 return isolate->factory()->undefined_value();
5065}
5066
5067
5068Object* TypeFeedbackCells::RawUninitializedSentinel(Heap* heap) {
5069 return heap->raw_unchecked_the_hole_value();
5070}
5071
5072
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00005073SMI_ACCESSORS(TypeFeedbackInfo, ic_total_count, kIcTotalCountOffset)
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00005074SMI_ACCESSORS(TypeFeedbackInfo, ic_with_type_info_count,
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00005075 kIcWithTypeinfoCountOffset)
5076ACCESSORS(TypeFeedbackInfo, type_feedback_cells, TypeFeedbackCells,
5077 kTypeFeedbackCellsOffset)
5078
5079
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00005080SMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot)
5081
5082
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00005083Relocatable::Relocatable(Isolate* isolate) {
5084 ASSERT(isolate == Isolate::Current());
5085 isolate_ = isolate;
5086 prev_ = isolate->relocatable_top();
5087 isolate->set_relocatable_top(this);
5088}
5089
5090
5091Relocatable::~Relocatable() {
5092 ASSERT(isolate_ == Isolate::Current());
5093 ASSERT_EQ(isolate_->relocatable_top(), this);
5094 isolate_->set_relocatable_top(prev_);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005095}
5096
5097
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005098int JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) {
5099 return map->instance_size();
5100}
5101
5102
ager@chromium.orgea91cc52011-05-23 06:06:11 +00005103void Foreign::ForeignIterateBody(ObjectVisitor* v) {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005104 v->VisitExternalReference(
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00005105 reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005106}
5107
5108
5109template<typename StaticVisitor>
ager@chromium.orgea91cc52011-05-23 06:06:11 +00005110void Foreign::ForeignIterateBody() {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005111 StaticVisitor::VisitExternalReference(
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00005112 reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005113}
5114
5115
5116void ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) {
5117 typedef v8::String::ExternalAsciiStringResource Resource;
5118 v->VisitExternalAsciiString(
5119 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5120}
5121
5122
5123template<typename StaticVisitor>
5124void ExternalAsciiString::ExternalAsciiStringIterateBody() {
5125 typedef v8::String::ExternalAsciiStringResource Resource;
5126 StaticVisitor::VisitExternalAsciiString(
5127 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5128}
5129
5130
5131void ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) {
5132 typedef v8::String::ExternalStringResource Resource;
5133 v->VisitExternalTwoByteString(
5134 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5135}
5136
5137
5138template<typename StaticVisitor>
5139void ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
5140 typedef v8::String::ExternalStringResource Resource;
5141 StaticVisitor::VisitExternalTwoByteString(
5142 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5143}
5144
5145#define SLOT_ADDR(obj, offset) \
5146 reinterpret_cast<Object**>((obj)->address() + offset)
5147
5148template<int start_offset, int end_offset, int size>
5149void FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody(
5150 HeapObject* obj,
5151 ObjectVisitor* v) {
5152 v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, end_offset));
5153}
5154
5155
5156template<int start_offset>
5157void FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj,
5158 int object_size,
5159 ObjectVisitor* v) {
5160 v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, object_size));
5161}
5162
5163#undef SLOT_ADDR
5164
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005165#undef TYPE_CHECKER
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005166#undef CAST_ACCESSOR
5167#undef INT_ACCESSORS
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005168#undef ACCESSORS
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005169#undef ACCESSORS_TO_SMI
5170#undef SMI_ACCESSORS
5171#undef BOOL_GETTER
5172#undef BOOL_ACCESSORS
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005173#undef FIELD_ADDR
5174#undef READ_FIELD
5175#undef WRITE_FIELD
5176#undef WRITE_BARRIER
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005177#undef CONDITIONAL_WRITE_BARRIER
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005178#undef READ_DOUBLE_FIELD
5179#undef WRITE_DOUBLE_FIELD
5180#undef READ_INT_FIELD
5181#undef WRITE_INT_FIELD
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005182#undef READ_INTPTR_FIELD
5183#undef WRITE_INTPTR_FIELD
5184#undef READ_UINT32_FIELD
5185#undef WRITE_UINT32_FIELD
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005186#undef READ_SHORT_FIELD
5187#undef WRITE_SHORT_FIELD
5188#undef READ_BYTE_FIELD
5189#undef WRITE_BYTE_FIELD
5190
5191
5192} } // namespace v8::internal
5193
5194#endif // V8_OBJECTS_INL_H_