blob: da1a35b08be6659e7fe3806ef7f64891b787d410 [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;
1619 if (store_mode == CERTAINLY_NOT_STORE_FROM_KEYED ||
1620 map()->used_for_prototype()) {
1621 limit = Max(inobject, kMaxFastProperties);
1622 } else {
1623 limit = Max(inobject, kFastPropertiesSoftLimit);
1624 }
1625 return properties > limit;
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001626}
1627
1628
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001629void Struct::InitializeBody(int object_size) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001630 Object* value = GetHeap()->undefined_value();
ager@chromium.org236ad962008-09-25 09:45:57 +00001631 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001632 WRITE_FIELD(this, offset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001633 }
1634}
1635
1636
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001637bool Object::ToArrayIndex(uint32_t* index) {
1638 if (IsSmi()) {
1639 int value = Smi::cast(this)->value();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001640 if (value < 0) return false;
1641 *index = value;
1642 return true;
1643 }
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001644 if (IsHeapNumber()) {
1645 double value = HeapNumber::cast(this)->value();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001646 uint32_t uint_value = static_cast<uint32_t>(value);
1647 if (value == static_cast<double>(uint_value)) {
1648 *index = uint_value;
1649 return true;
1650 }
1651 }
1652 return false;
1653}
1654
1655
1656bool Object::IsStringObjectWithCharacterAt(uint32_t index) {
1657 if (!this->IsJSValue()) return false;
1658
1659 JSValue* js_value = JSValue::cast(this);
1660 if (!js_value->value()->IsString()) return false;
1661
1662 String* str = String::cast(js_value->value());
1663 if (index >= (uint32_t)str->length()) return false;
1664
1665 return true;
1666}
1667
1668
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001669FixedArrayBase* FixedArrayBase::cast(Object* object) {
1670 ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray());
1671 return reinterpret_cast<FixedArrayBase*>(object);
1672}
1673
1674
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001675Object* FixedArray::get(int index) {
1676 ASSERT(index >= 0 && index < this->length());
1677 return READ_FIELD(this, kHeaderSize + index * kPointerSize);
1678}
1679
1680
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001681bool FixedArray::is_the_hole(int index) {
1682 return get(index) == GetHeap()->the_hole_value();
1683}
1684
1685
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001686void FixedArray::set(int index, Smi* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001687 ASSERT(map() != HEAP->fixed_cow_array_map());
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001688 ASSERT(index >= 0 && index < this->length());
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001689 ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1690 int offset = kHeaderSize + index * kPointerSize;
1691 WRITE_FIELD(this, offset, value);
1692}
1693
1694
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001695void FixedArray::set(int index, Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001696 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001697 ASSERT(index >= 0 && index < this->length());
1698 int offset = kHeaderSize + index * kPointerSize;
1699 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001700 WRITE_BARRIER(GetHeap(), this, offset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001701}
1702
1703
svenpanne@chromium.org84bcc552011-07-18 09:50:57 +00001704inline bool FixedDoubleArray::is_the_hole_nan(double value) {
1705 return BitCast<uint64_t, double>(value) == kHoleNanInt64;
1706}
1707
1708
1709inline double FixedDoubleArray::hole_nan_as_double() {
1710 return BitCast<double, uint64_t>(kHoleNanInt64);
1711}
1712
1713
1714inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() {
1715 ASSERT(BitCast<uint64_t>(OS::nan_value()) != kHoleNanInt64);
1716 ASSERT((BitCast<uint64_t>(OS::nan_value()) >> 32) != kHoleNanUpper32);
1717 return OS::nan_value();
1718}
1719
1720
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001721double FixedDoubleArray::get_scalar(int index) {
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001722 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1723 map() != HEAP->fixed_array_map());
1724 ASSERT(index >= 0 && index < this->length());
1725 double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize);
1726 ASSERT(!is_the_hole_nan(result));
1727 return result;
1728}
1729
danno@chromium.org88aa0582012-03-23 15:11:57 +00001730int64_t FixedDoubleArray::get_representation(int index) {
1731 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1732 map() != HEAP->fixed_array_map());
1733 ASSERT(index >= 0 && index < this->length());
1734 return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize);
1735}
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001736
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001737MaybeObject* FixedDoubleArray::get(int index) {
1738 if (is_the_hole(index)) {
1739 return GetHeap()->the_hole_value();
1740 } else {
1741 return GetHeap()->NumberFromDouble(get_scalar(index));
1742 }
1743}
1744
1745
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001746void FixedDoubleArray::set(int index, double value) {
1747 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1748 map() != HEAP->fixed_array_map());
1749 int offset = kHeaderSize + index * kDoubleSize;
1750 if (isnan(value)) value = canonical_not_the_hole_nan_as_double();
1751 WRITE_DOUBLE_FIELD(this, offset, value);
1752}
1753
1754
1755void FixedDoubleArray::set_the_hole(int index) {
1756 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1757 map() != HEAP->fixed_array_map());
1758 int offset = kHeaderSize + index * kDoubleSize;
1759 WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double());
1760}
1761
1762
1763bool FixedDoubleArray::is_the_hole(int index) {
1764 int offset = kHeaderSize + index * kDoubleSize;
1765 return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset));
1766}
1767
1768
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00001769WriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001770 Heap* heap = GetHeap();
1771 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
1772 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001773 return UPDATE_WRITE_BARRIER;
1774}
1775
1776
1777void FixedArray::set(int index,
1778 Object* value,
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001779 WriteBarrierMode mode) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001780 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001781 ASSERT(index >= 0 && index < this->length());
1782 int offset = kHeaderSize + index * kPointerSize;
1783 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001784 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001785}
1786
1787
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001788void FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array,
1789 int index,
1790 Object* value) {
1791 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map());
1792 ASSERT(index >= 0 && index < array->length());
1793 int offset = kHeaderSize + index * kPointerSize;
1794 WRITE_FIELD(array, offset, value);
1795 Heap* heap = array->GetHeap();
1796 if (heap->InNewSpace(value)) {
1797 heap->RecordWrite(array->address(), offset);
1798 }
1799}
1800
1801
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00001802void FixedArray::NoWriteBarrierSet(FixedArray* array,
1803 int index,
1804 Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001805 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001806 ASSERT(index >= 0 && index < array->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001807 ASSERT(!HEAP->InNewSpace(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001808 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value);
1809}
1810
1811
1812void FixedArray::set_undefined(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001813 ASSERT(map() != HEAP->fixed_cow_array_map());
1814 set_undefined(GetHeap(), index);
1815}
1816
1817
1818void FixedArray::set_undefined(Heap* heap, int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001819 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001820 ASSERT(!heap->InNewSpace(heap->undefined_value()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001821 WRITE_FIELD(this, kHeaderSize + index * kPointerSize,
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001822 heap->undefined_value());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001823}
1824
1825
ager@chromium.org236ad962008-09-25 09:45:57 +00001826void FixedArray::set_null(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001827 set_null(GetHeap(), index);
1828}
1829
1830
1831void FixedArray::set_null(Heap* heap, int index) {
ager@chromium.org236ad962008-09-25 09:45:57 +00001832 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001833 ASSERT(!heap->InNewSpace(heap->null_value()));
1834 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
ager@chromium.org236ad962008-09-25 09:45:57 +00001835}
1836
1837
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001838void FixedArray::set_the_hole(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001839 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001840 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001841 ASSERT(!HEAP->InNewSpace(HEAP->the_hole_value()));
1842 WRITE_FIELD(this,
1843 kHeaderSize + index * kPointerSize,
1844 GetHeap()->the_hole_value());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001845}
1846
1847
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001848void FixedArray::set_unchecked(int index, Smi* value) {
1849 ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1850 int offset = kHeaderSize + index * kPointerSize;
1851 WRITE_FIELD(this, offset, value);
1852}
1853
1854
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001855void FixedArray::set_unchecked(Heap* heap,
1856 int index,
whesse@chromium.org4a5224e2010-10-20 12:37:07 +00001857 Object* value,
1858 WriteBarrierMode mode) {
1859 int offset = kHeaderSize + index * kPointerSize;
1860 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001861 CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode);
whesse@chromium.org4a5224e2010-10-20 12:37:07 +00001862}
1863
1864
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001865void FixedArray::set_null_unchecked(Heap* heap, int index) {
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001866 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001867 ASSERT(!HEAP->InNewSpace(heap->null_value()));
1868 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001869}
1870
1871
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001872Object** FixedArray::data_start() {
1873 return HeapObject::RawField(this, kHeaderSize);
1874}
1875
1876
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001877bool DescriptorArray::IsEmpty() {
danno@chromium.org40cb8782011-05-25 07:58:50 +00001878 ASSERT(this->IsSmi() ||
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001879 this->MayContainTransitions() ||
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001880 this == HEAP->empty_descriptor_array());
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001881 return this->IsSmi() || length() < kFirstIndex;
1882}
1883
1884
1885bool DescriptorArray::MayContainTransitions() {
1886 return length() >= kTransitionsIndex;
danno@chromium.org40cb8782011-05-25 07:58:50 +00001887}
1888
1889
1890int DescriptorArray::bit_field3_storage() {
1891 Object* storage = READ_FIELD(this, kBitField3StorageOffset);
1892 return Smi::cast(storage)->value();
1893}
1894
1895void DescriptorArray::set_bit_field3_storage(int value) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001896 ASSERT(this->MayContainTransitions());
danno@chromium.org40cb8782011-05-25 07:58:50 +00001897 WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value));
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001898}
1899
1900
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001901void DescriptorArray::NoIncrementalWriteBarrierSwap(FixedArray* array,
1902 int first,
1903 int second) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001904 Object* tmp = array->get(first);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001905 NoIncrementalWriteBarrierSet(array, first, array->get(second));
1906 NoIncrementalWriteBarrierSet(array, second, tmp);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001907}
1908
1909
1910int DescriptorArray::Search(String* name) {
1911 SLOW_ASSERT(IsSortedNoDuplicates());
1912
1913 // Check for empty descriptor array.
1914 int nof = number_of_descriptors();
1915 if (nof == 0) return kNotFound;
1916
1917 // Fast case: do linear search for small arrays.
1918 const int kMaxElementsForLinearSearch = 8;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001919 if (StringShape(name).IsSymbol() && nof < kMaxElementsForLinearSearch) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001920 return LinearSearch(EXPECT_SORTED, name, nof);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001921 }
1922
1923 // Slow case: perform binary search.
1924 return BinarySearch(name, 0, nof - 1);
1925}
1926
1927
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001928int DescriptorArray::SearchWithCache(String* name) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001929 int number = GetIsolate()->descriptor_lookup_cache()->Lookup(this, name);
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001930 if (number == DescriptorLookupCache::kAbsent) {
1931 number = Search(name);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001932 GetIsolate()->descriptor_lookup_cache()->Update(this, name, number);
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001933 }
1934 return number;
1935}
1936
1937
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001938Map* DescriptorArray::elements_transition_map() {
1939 if (!this->MayContainTransitions()) {
1940 return NULL;
1941 }
1942 Object* transition_map = get(kTransitionsIndex);
1943 if (transition_map == Smi::FromInt(0)) {
1944 return NULL;
1945 } else {
1946 return Map::cast(transition_map);
1947 }
1948}
1949
1950
1951void DescriptorArray::set_elements_transition_map(
1952 Map* transition_map, WriteBarrierMode mode) {
1953 ASSERT(this->length() > kTransitionsIndex);
1954 Heap* heap = GetHeap();
1955 WRITE_FIELD(this, kTransitionsOffset, transition_map);
1956 CONDITIONAL_WRITE_BARRIER(
1957 heap, this, kTransitionsOffset, transition_map, mode);
1958 ASSERT(DescriptorArray::cast(this));
1959}
1960
1961
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001962Object** DescriptorArray::GetKeySlot(int descriptor_number) {
1963 ASSERT(descriptor_number < number_of_descriptors());
1964 return HeapObject::RawField(
1965 reinterpret_cast<HeapObject*>(this),
1966 OffsetOfElementAt(ToKeyIndex(descriptor_number)));
1967}
1968
1969
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001970String* DescriptorArray::GetKey(int descriptor_number) {
1971 ASSERT(descriptor_number < number_of_descriptors());
1972 return String::cast(get(ToKeyIndex(descriptor_number)));
1973}
1974
1975
verwaest@chromium.org37141392012-05-31 13:27:02 +00001976Object** DescriptorArray::GetValueSlot(int descriptor_number) {
1977 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001978 return HeapObject::RawField(
1979 reinterpret_cast<HeapObject*>(this),
1980 OffsetOfElementAt(ToValueIndex(descriptor_number)));
verwaest@chromium.org37141392012-05-31 13:27:02 +00001981}
1982
1983
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001984Object* DescriptorArray::GetValue(int descriptor_number) {
1985 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001986 return get(ToValueIndex(descriptor_number));
1987}
1988
1989
1990void DescriptorArray::SetNullValueUnchecked(int descriptor_number, Heap* heap) {
1991 ASSERT(descriptor_number < number_of_descriptors());
1992 set_null_unchecked(heap, ToValueIndex(descriptor_number));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001993}
1994
1995
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00001996PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001997 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001998 Object* details = get(ToDetailsIndex(descriptor_number));
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00001999 return PropertyDetails(Smi::cast(details));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002000}
2001
2002
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002003void DescriptorArray::SetDetailsUnchecked(int descriptor_number, Smi* value) {
2004 ASSERT(descriptor_number < number_of_descriptors());
2005 set_unchecked(ToDetailsIndex(descriptor_number), value);
2006}
2007
2008
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002009PropertyType DescriptorArray::GetType(int descriptor_number) {
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00002010 return GetDetails(descriptor_number).type();
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002011}
2012
2013
2014int DescriptorArray::GetFieldIndex(int descriptor_number) {
2015 return Descriptor::IndexFromValue(GetValue(descriptor_number));
2016}
2017
2018
2019JSFunction* DescriptorArray::GetConstantFunction(int descriptor_number) {
2020 return JSFunction::cast(GetValue(descriptor_number));
2021}
2022
2023
2024Object* DescriptorArray::GetCallbacksObject(int descriptor_number) {
2025 ASSERT(GetType(descriptor_number) == CALLBACKS);
2026 return GetValue(descriptor_number);
2027}
2028
2029
2030AccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) {
2031 ASSERT(GetType(descriptor_number) == CALLBACKS);
ager@chromium.orgea91cc52011-05-23 06:06:11 +00002032 Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number));
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002033 return reinterpret_cast<AccessorDescriptor*>(p->foreign_address());
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002034}
2035
2036
2037bool DescriptorArray::IsProperty(int descriptor_number) {
ulan@chromium.org9a21ec42012-03-06 08:42:24 +00002038 Entry entry(this, descriptor_number);
2039 return IsPropertyDescriptor(&entry);
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002040}
2041
2042
rossberg@chromium.org994edf62012-02-06 10:12:55 +00002043bool DescriptorArray::IsTransitionOnly(int descriptor_number) {
2044 switch (GetType(descriptor_number)) {
2045 case MAP_TRANSITION:
2046 case CONSTANT_TRANSITION:
rossberg@chromium.org994edf62012-02-06 10:12:55 +00002047 return true;
2048 case CALLBACKS: {
2049 Object* value = GetValue(descriptor_number);
2050 if (!value->IsAccessorPair()) return false;
2051 AccessorPair* accessors = AccessorPair::cast(value);
2052 return accessors->getter()->IsMap() && accessors->setter()->IsMap();
2053 }
2054 case NORMAL:
2055 case FIELD:
2056 case CONSTANT_FUNCTION:
2057 case HANDLER:
2058 case INTERCEPTOR:
2059 case NULL_DESCRIPTOR:
2060 return false;
2061 }
2062 UNREACHABLE(); // Keep the compiler happy.
2063 return false;
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002064}
2065
2066
2067bool DescriptorArray::IsNullDescriptor(int descriptor_number) {
2068 return GetType(descriptor_number) == NULL_DESCRIPTOR;
2069}
2070
2071
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002072void DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
2073 desc->Init(GetKey(descriptor_number),
2074 GetValue(descriptor_number),
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00002075 GetDetails(descriptor_number));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002076}
2077
2078
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002079void DescriptorArray::Set(int descriptor_number,
2080 Descriptor* desc,
2081 const WhitenessWitness&) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002082 // Range check.
2083 ASSERT(descriptor_number < number_of_descriptors());
2084
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002085 NoIncrementalWriteBarrierSet(this,
2086 ToKeyIndex(descriptor_number),
2087 desc->GetKey());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002088 NoIncrementalWriteBarrierSet(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002089 ToValueIndex(descriptor_number),
2090 desc->GetValue());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002091 NoIncrementalWriteBarrierSet(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002092 ToDetailsIndex(descriptor_number),
2093 desc->GetDetails().AsSmi());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002094}
2095
2096
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002097void DescriptorArray::NoIncrementalWriteBarrierSwapDescriptors(
2098 int first, int second) {
2099 NoIncrementalWriteBarrierSwap(this, ToKeyIndex(first), ToKeyIndex(second));
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002100 NoIncrementalWriteBarrierSwap(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002101 ToValueIndex(first),
2102 ToValueIndex(second));
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002103 NoIncrementalWriteBarrierSwap(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002104 ToDetailsIndex(first),
2105 ToDetailsIndex(second));
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002106}
2107
2108
2109DescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array)
2110 : marking_(array->GetHeap()->incremental_marking()) {
2111 marking_->EnterNoMarkingScope();
2112 if (array->number_of_descriptors() > 0) {
2113 ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002114 }
2115}
2116
2117
2118DescriptorArray::WhitenessWitness::~WhitenessWitness() {
2119 marking_->LeaveNoMarkingScope();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002120}
2121
2122
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002123template<typename Shape, typename Key>
ricow@chromium.org2c99e282011-07-28 09:15:17 +00002124int HashTable<Shape, Key>::ComputeCapacity(int at_least_space_for) {
2125 const int kMinCapacity = 32;
2126 int capacity = RoundUpToPowerOf2(at_least_space_for * 2);
2127 if (capacity < kMinCapacity) {
2128 capacity = kMinCapacity; // Guarantee min capacity.
2129 }
2130 return capacity;
2131}
2132
2133
2134template<typename Shape, typename Key>
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002135int HashTable<Shape, Key>::FindEntry(Key key) {
2136 return FindEntry(GetIsolate(), key);
2137}
2138
2139
2140// Find entry for key otherwise return kNotFound.
2141template<typename Shape, typename Key>
2142int HashTable<Shape, Key>::FindEntry(Isolate* isolate, Key key) {
2143 uint32_t capacity = Capacity();
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002144 uint32_t entry = FirstProbe(HashTable<Shape, Key>::Hash(key), capacity);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002145 uint32_t count = 1;
2146 // EnsureCapacity will guarantee the hash table is never full.
2147 while (true) {
2148 Object* element = KeyAt(entry);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00002149 // Empty entry.
2150 if (element == isolate->heap()->raw_unchecked_undefined_value()) break;
2151 if (element != isolate->heap()->raw_unchecked_the_hole_value() &&
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002152 Shape::IsMatch(key, element)) return entry;
2153 entry = NextProbe(entry, count++, capacity);
2154 }
2155 return kNotFound;
2156}
2157
2158
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002159bool SeededNumberDictionary::requires_slow_elements() {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002160 Object* max_index_object = get(kMaxNumberKeyIndex);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002161 if (!max_index_object->IsSmi()) return false;
2162 return 0 !=
2163 (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
2164}
2165
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002166uint32_t SeededNumberDictionary::max_number_key() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002167 ASSERT(!requires_slow_elements());
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002168 Object* max_index_object = get(kMaxNumberKeyIndex);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002169 if (!max_index_object->IsSmi()) return 0;
2170 uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
2171 return value >> kRequiresSlowElementsTagSize;
2172}
2173
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002174void SeededNumberDictionary::set_requires_slow_elements() {
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00002175 set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002176}
2177
2178
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002179// ------------------------------------
2180// Cast operations
2181
2182
2183CAST_ACCESSOR(FixedArray)
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002184CAST_ACCESSOR(FixedDoubleArray)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002185CAST_ACCESSOR(DescriptorArray)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002186CAST_ACCESSOR(DeoptimizationInputData)
2187CAST_ACCESSOR(DeoptimizationOutputData)
danno@chromium.orgfa458e42012-02-01 10:48:36 +00002188CAST_ACCESSOR(TypeFeedbackCells)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002189CAST_ACCESSOR(SymbolTable)
ager@chromium.orgac091b72010-05-05 07:34:42 +00002190CAST_ACCESSOR(JSFunctionResultCache)
ricow@chromium.org65fae842010-08-25 15:26:24 +00002191CAST_ACCESSOR(NormalizedMapCache)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002192CAST_ACCESSOR(ScopeInfo)
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00002193CAST_ACCESSOR(CompilationCacheTable)
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00002194CAST_ACCESSOR(CodeCacheHashTable)
jkummerow@chromium.orge297f592011-06-08 10:05:15 +00002195CAST_ACCESSOR(PolymorphicCodeCacheHashTable)
ager@chromium.org236ad962008-09-25 09:45:57 +00002196CAST_ACCESSOR(MapCache)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002197CAST_ACCESSOR(String)
2198CAST_ACCESSOR(SeqString)
ager@chromium.org7c537e22008-10-16 08:43:32 +00002199CAST_ACCESSOR(SeqAsciiString)
2200CAST_ACCESSOR(SeqTwoByteString)
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002201CAST_ACCESSOR(SlicedString)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002202CAST_ACCESSOR(ConsString)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002203CAST_ACCESSOR(ExternalString)
2204CAST_ACCESSOR(ExternalAsciiString)
2205CAST_ACCESSOR(ExternalTwoByteString)
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00002206CAST_ACCESSOR(JSReceiver)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002207CAST_ACCESSOR(JSObject)
2208CAST_ACCESSOR(Smi)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002209CAST_ACCESSOR(HeapObject)
2210CAST_ACCESSOR(HeapNumber)
2211CAST_ACCESSOR(Oddball)
kasperl@chromium.org2abc4502009-07-02 07:00:29 +00002212CAST_ACCESSOR(JSGlobalPropertyCell)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002213CAST_ACCESSOR(SharedFunctionInfo)
2214CAST_ACCESSOR(Map)
2215CAST_ACCESSOR(JSFunction)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002216CAST_ACCESSOR(GlobalObject)
2217CAST_ACCESSOR(JSGlobalProxy)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002218CAST_ACCESSOR(JSGlobalObject)
2219CAST_ACCESSOR(JSBuiltinsObject)
2220CAST_ACCESSOR(Code)
2221CAST_ACCESSOR(JSArray)
ager@chromium.org236ad962008-09-25 09:45:57 +00002222CAST_ACCESSOR(JSRegExp)
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00002223CAST_ACCESSOR(JSProxy)
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00002224CAST_ACCESSOR(JSFunctionProxy)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002225CAST_ACCESSOR(JSSet)
2226CAST_ACCESSOR(JSMap)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002227CAST_ACCESSOR(JSWeakMap)
ager@chromium.orgea91cc52011-05-23 06:06:11 +00002228CAST_ACCESSOR(Foreign)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002229CAST_ACCESSOR(ByteArray)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002230CAST_ACCESSOR(FreeSpace)
ager@chromium.org3811b432009-10-28 14:53:37 +00002231CAST_ACCESSOR(ExternalArray)
2232CAST_ACCESSOR(ExternalByteArray)
2233CAST_ACCESSOR(ExternalUnsignedByteArray)
2234CAST_ACCESSOR(ExternalShortArray)
2235CAST_ACCESSOR(ExternalUnsignedShortArray)
2236CAST_ACCESSOR(ExternalIntArray)
2237CAST_ACCESSOR(ExternalUnsignedIntArray)
2238CAST_ACCESSOR(ExternalFloatArray)
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002239CAST_ACCESSOR(ExternalDoubleArray)
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002240CAST_ACCESSOR(ExternalPixelArray)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002241CAST_ACCESSOR(Struct)
2242
2243
2244#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name)
2245 STRUCT_LIST(MAKE_STRUCT_CAST)
2246#undef MAKE_STRUCT_CAST
2247
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00002248
2249template <typename Shape, typename Key>
2250HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002251 ASSERT(obj->IsHashTable());
2252 return reinterpret_cast<HashTable*>(obj);
2253}
2254
2255
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002256SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002257SMI_ACCESSORS(FreeSpace, size, kSizeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002258
ager@chromium.orgac091b72010-05-05 07:34:42 +00002259SMI_ACCESSORS(String, length, kLengthOffset)
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00002260
2261
2262uint32_t String::hash_field() {
2263 return READ_UINT32_FIELD(this, kHashFieldOffset);
2264}
2265
2266
2267void String::set_hash_field(uint32_t value) {
2268 WRITE_UINT32_FIELD(this, kHashFieldOffset, value);
ricow@chromium.org30ce4112010-05-31 10:38:25 +00002269#if V8_HOST_ARCH_64_BIT
2270 WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0);
2271#endif
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00002272}
2273
2274
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002275bool String::Equals(String* other) {
2276 if (other == this) return true;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002277 if (StringShape(this).IsSymbol() && StringShape(other).IsSymbol()) {
2278 return false;
2279 }
2280 return SlowEquals(other);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002281}
2282
2283
lrn@chromium.org303ada72010-10-27 09:33:13 +00002284MaybeObject* String::TryFlatten(PretenureFlag pretenure) {
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002285 if (!StringShape(this).IsCons()) return this;
2286 ConsString* cons = ConsString::cast(this);
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002287 if (cons->IsFlat()) return cons->first();
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00002288 return SlowTryFlatten(pretenure);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002289}
2290
2291
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002292String* String::TryFlattenGetString(PretenureFlag pretenure) {
lrn@chromium.org303ada72010-10-27 09:33:13 +00002293 MaybeObject* flat = TryFlatten(pretenure);
2294 Object* successfully_flattened;
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002295 if (!flat->ToObject(&successfully_flattened)) return this;
2296 return String::cast(successfully_flattened);
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002297}
2298
2299
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002300uint16_t String::Get(int index) {
2301 ASSERT(index >= 0 && index < length());
2302 switch (StringShape(this).full_representation_tag()) {
ager@chromium.org870a0b62008-11-04 11:43:05 +00002303 case kSeqStringTag | kAsciiStringTag:
2304 return SeqAsciiString::cast(this)->SeqAsciiStringGet(index);
2305 case kSeqStringTag | kTwoByteStringTag:
2306 return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
2307 case kConsStringTag | kAsciiStringTag:
2308 case kConsStringTag | kTwoByteStringTag:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002309 return ConsString::cast(this)->ConsStringGet(index);
ager@chromium.org870a0b62008-11-04 11:43:05 +00002310 case kExternalStringTag | kAsciiStringTag:
2311 return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
2312 case kExternalStringTag | kTwoByteStringTag:
2313 return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002314 case kSlicedStringTag | kAsciiStringTag:
2315 case kSlicedStringTag | kTwoByteStringTag:
2316 return SlicedString::cast(this)->SlicedStringGet(index);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002317 default:
2318 break;
2319 }
2320
2321 UNREACHABLE();
2322 return 0;
2323}
2324
2325
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002326void String::Set(int index, uint16_t value) {
2327 ASSERT(index >= 0 && index < length());
2328 ASSERT(StringShape(this).IsSequential());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002329
ager@chromium.org5ec48922009-05-05 07:25:34 +00002330 return this->IsAsciiRepresentation()
ager@chromium.org7c537e22008-10-16 08:43:32 +00002331 ? SeqAsciiString::cast(this)->SeqAsciiStringSet(index, value)
2332 : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002333}
2334
2335
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002336bool String::IsFlat() {
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002337 if (!StringShape(this).IsCons()) return true;
2338 return ConsString::cast(this)->second()->length() == 0;
2339}
2340
2341
2342String* String::GetUnderlying() {
2343 // Giving direct access to underlying string only makes sense if the
2344 // wrapping string is already flattened.
2345 ASSERT(this->IsFlat());
2346 ASSERT(StringShape(this).IsIndirect());
2347 STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset);
2348 const int kUnderlyingOffset = SlicedString::kParentOffset;
2349 return String::cast(READ_FIELD(this, kUnderlyingOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002350}
2351
2352
ager@chromium.org7c537e22008-10-16 08:43:32 +00002353uint16_t SeqAsciiString::SeqAsciiStringGet(int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002354 ASSERT(index >= 0 && index < length());
2355 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
2356}
2357
2358
ager@chromium.org7c537e22008-10-16 08:43:32 +00002359void SeqAsciiString::SeqAsciiStringSet(int index, uint16_t value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002360 ASSERT(index >= 0 && index < length() && value <= kMaxAsciiCharCode);
2361 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize,
2362 static_cast<byte>(value));
2363}
2364
2365
ager@chromium.org7c537e22008-10-16 08:43:32 +00002366Address SeqAsciiString::GetCharsAddress() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002367 return FIELD_ADDR(this, kHeaderSize);
2368}
2369
2370
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002371char* SeqAsciiString::GetChars() {
2372 return reinterpret_cast<char*>(GetCharsAddress());
2373}
2374
2375
ager@chromium.org7c537e22008-10-16 08:43:32 +00002376Address SeqTwoByteString::GetCharsAddress() {
2377 return FIELD_ADDR(this, kHeaderSize);
2378}
2379
2380
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002381uc16* SeqTwoByteString::GetChars() {
2382 return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize));
2383}
2384
2385
ager@chromium.org7c537e22008-10-16 08:43:32 +00002386uint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002387 ASSERT(index >= 0 && index < length());
2388 return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize);
2389}
2390
2391
ager@chromium.org7c537e22008-10-16 08:43:32 +00002392void SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002393 ASSERT(index >= 0 && index < length());
2394 WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value);
2395}
2396
2397
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002398int SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) {
ager@chromium.orgac091b72010-05-05 07:34:42 +00002399 return SizeFor(length());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002400}
2401
2402
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002403int SeqAsciiString::SeqAsciiStringSize(InstanceType instance_type) {
ager@chromium.orgac091b72010-05-05 07:34:42 +00002404 return SizeFor(length());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002405}
2406
2407
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002408String* SlicedString::parent() {
2409 return String::cast(READ_FIELD(this, kParentOffset));
2410}
2411
2412
2413void SlicedString::set_parent(String* parent) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002414 ASSERT(parent->IsSeqString() || parent->IsExternalString());
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002415 WRITE_FIELD(this, kParentOffset, parent);
2416}
2417
2418
2419SMI_ACCESSORS(SlicedString, offset, kOffsetOffset)
2420
2421
ager@chromium.org870a0b62008-11-04 11:43:05 +00002422String* ConsString::first() {
2423 return String::cast(READ_FIELD(this, kFirstOffset));
2424}
2425
2426
2427Object* ConsString::unchecked_first() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002428 return READ_FIELD(this, kFirstOffset);
2429}
2430
2431
ager@chromium.org870a0b62008-11-04 11:43:05 +00002432void ConsString::set_first(String* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002433 WRITE_FIELD(this, kFirstOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002434 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002435}
2436
2437
ager@chromium.org870a0b62008-11-04 11:43:05 +00002438String* ConsString::second() {
2439 return String::cast(READ_FIELD(this, kSecondOffset));
2440}
2441
2442
2443Object* ConsString::unchecked_second() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002444 return READ_FIELD(this, kSecondOffset);
2445}
2446
2447
ager@chromium.org870a0b62008-11-04 11:43:05 +00002448void ConsString::set_second(String* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002449 WRITE_FIELD(this, kSecondOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002450 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002451}
2452
2453
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002454bool ExternalString::is_short() {
2455 InstanceType type = map()->instance_type();
2456 return (type & kShortExternalStringMask) == kShortExternalStringTag;
erikcorry0ad885c2011-11-21 13:51:57 +00002457}
2458
2459
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002460const ExternalAsciiString::Resource* ExternalAsciiString::resource() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002461 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
2462}
2463
2464
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002465void ExternalAsciiString::update_data_cache() {
2466 if (is_short()) return;
2467 const char** data_field =
2468 reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset));
2469 *data_field = resource()->data();
2470}
2471
2472
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002473void ExternalAsciiString::set_resource(
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002474 const ExternalAsciiString::Resource* resource) {
2475 *reinterpret_cast<const Resource**>(
2476 FIELD_ADDR(this, kResourceOffset)) = resource;
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002477 if (resource != NULL) update_data_cache();
erikcorry0ad885c2011-11-21 13:51:57 +00002478}
2479
2480
2481const char* ExternalAsciiString::GetChars() {
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002482 return resource()->data();
erikcorry0ad885c2011-11-21 13:51:57 +00002483}
2484
2485
2486uint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) {
2487 ASSERT(index >= 0 && index < length());
2488 return GetChars()[index];
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002489}
2490
2491
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002492const ExternalTwoByteString::Resource* ExternalTwoByteString::resource() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002493 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
2494}
2495
2496
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002497void ExternalTwoByteString::update_data_cache() {
2498 if (is_short()) return;
2499 const uint16_t** data_field =
2500 reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset));
2501 *data_field = resource()->data();
2502}
2503
2504
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002505void ExternalTwoByteString::set_resource(
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002506 const ExternalTwoByteString::Resource* resource) {
2507 *reinterpret_cast<const Resource**>(
2508 FIELD_ADDR(this, kResourceOffset)) = resource;
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002509 if (resource != NULL) update_data_cache();
erikcorry0ad885c2011-11-21 13:51:57 +00002510}
2511
2512
2513const uint16_t* ExternalTwoByteString::GetChars() {
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002514 return resource()->data();
erikcorry0ad885c2011-11-21 13:51:57 +00002515}
2516
2517
2518uint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) {
2519 ASSERT(index >= 0 && index < length());
2520 return GetChars()[index];
2521}
2522
2523
2524const uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData(
2525 unsigned start) {
2526 return GetChars() + start;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002527}
2528
2529
ager@chromium.orgac091b72010-05-05 07:34:42 +00002530void JSFunctionResultCache::MakeZeroSize() {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002531 set_finger_index(kEntriesIndex);
2532 set_size(kEntriesIndex);
ager@chromium.orgac091b72010-05-05 07:34:42 +00002533}
2534
2535
2536void JSFunctionResultCache::Clear() {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002537 int cache_size = size();
ager@chromium.orgac091b72010-05-05 07:34:42 +00002538 Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex));
fschneider@chromium.orge03fb642010-11-01 12:34:09 +00002539 MemsetPointer(entries_start,
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002540 GetHeap()->the_hole_value(),
fschneider@chromium.orge03fb642010-11-01 12:34:09 +00002541 cache_size - kEntriesIndex);
ager@chromium.orgac091b72010-05-05 07:34:42 +00002542 MakeZeroSize();
2543}
2544
2545
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002546int JSFunctionResultCache::size() {
2547 return Smi::cast(get(kCacheSizeIndex))->value();
2548}
2549
2550
2551void JSFunctionResultCache::set_size(int size) {
2552 set(kCacheSizeIndex, Smi::FromInt(size));
2553}
2554
2555
2556int JSFunctionResultCache::finger_index() {
2557 return Smi::cast(get(kFingerIndex))->value();
2558}
2559
2560
2561void JSFunctionResultCache::set_finger_index(int finger_index) {
2562 set(kFingerIndex, Smi::FromInt(finger_index));
2563}
2564
2565
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002566byte ByteArray::get(int index) {
2567 ASSERT(index >= 0 && index < this->length());
2568 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
2569}
2570
2571
2572void ByteArray::set(int index, byte value) {
2573 ASSERT(index >= 0 && index < this->length());
2574 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
2575}
2576
2577
2578int ByteArray::get_int(int index) {
2579 ASSERT(index >= 0 && (index * kIntSize) < this->length());
2580 return READ_INT_FIELD(this, kHeaderSize + index * kIntSize);
2581}
2582
2583
2584ByteArray* ByteArray::FromDataStartAddress(Address address) {
2585 ASSERT_TAG_ALIGNED(address);
2586 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
2587}
2588
2589
2590Address ByteArray::GetDataStartAddress() {
2591 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
2592}
2593
2594
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002595uint8_t* ExternalPixelArray::external_pixel_pointer() {
2596 return reinterpret_cast<uint8_t*>(external_pointer());
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002597}
2598
2599
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002600uint8_t ExternalPixelArray::get_scalar(int index) {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002601 ASSERT((index >= 0) && (index < this->length()));
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002602 uint8_t* ptr = external_pixel_pointer();
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002603 return ptr[index];
2604}
2605
2606
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002607MaybeObject* ExternalPixelArray::get(int index) {
2608 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2609}
2610
2611
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002612void ExternalPixelArray::set(int index, uint8_t value) {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002613 ASSERT((index >= 0) && (index < this->length()));
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002614 uint8_t* ptr = external_pixel_pointer();
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002615 ptr[index] = value;
2616}
2617
2618
ager@chromium.org3811b432009-10-28 14:53:37 +00002619void* ExternalArray::external_pointer() {
2620 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
2621 return reinterpret_cast<void*>(ptr);
2622}
2623
2624
2625void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
2626 intptr_t ptr = reinterpret_cast<intptr_t>(value);
2627 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
2628}
2629
2630
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002631int8_t ExternalByteArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002632 ASSERT((index >= 0) && (index < this->length()));
2633 int8_t* ptr = static_cast<int8_t*>(external_pointer());
2634 return ptr[index];
2635}
2636
2637
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002638MaybeObject* ExternalByteArray::get(int index) {
2639 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2640}
2641
2642
ager@chromium.org3811b432009-10-28 14:53:37 +00002643void ExternalByteArray::set(int index, int8_t value) {
2644 ASSERT((index >= 0) && (index < this->length()));
2645 int8_t* ptr = static_cast<int8_t*>(external_pointer());
2646 ptr[index] = value;
2647}
2648
2649
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002650uint8_t ExternalUnsignedByteArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002651 ASSERT((index >= 0) && (index < this->length()));
2652 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
2653 return ptr[index];
2654}
2655
2656
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002657MaybeObject* ExternalUnsignedByteArray::get(int index) {
2658 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2659}
2660
2661
ager@chromium.org3811b432009-10-28 14:53:37 +00002662void ExternalUnsignedByteArray::set(int index, uint8_t value) {
2663 ASSERT((index >= 0) && (index < this->length()));
2664 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
2665 ptr[index] = value;
2666}
2667
2668
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002669int16_t ExternalShortArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002670 ASSERT((index >= 0) && (index < this->length()));
2671 int16_t* ptr = static_cast<int16_t*>(external_pointer());
2672 return ptr[index];
2673}
2674
2675
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002676MaybeObject* ExternalShortArray::get(int index) {
2677 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2678}
2679
2680
ager@chromium.org3811b432009-10-28 14:53:37 +00002681void ExternalShortArray::set(int index, int16_t value) {
2682 ASSERT((index >= 0) && (index < this->length()));
2683 int16_t* ptr = static_cast<int16_t*>(external_pointer());
2684 ptr[index] = value;
2685}
2686
2687
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002688uint16_t ExternalUnsignedShortArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002689 ASSERT((index >= 0) && (index < this->length()));
2690 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
2691 return ptr[index];
2692}
2693
2694
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002695MaybeObject* ExternalUnsignedShortArray::get(int index) {
2696 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2697}
2698
2699
ager@chromium.org3811b432009-10-28 14:53:37 +00002700void ExternalUnsignedShortArray::set(int index, uint16_t value) {
2701 ASSERT((index >= 0) && (index < this->length()));
2702 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
2703 ptr[index] = value;
2704}
2705
2706
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002707int32_t ExternalIntArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002708 ASSERT((index >= 0) && (index < this->length()));
2709 int32_t* ptr = static_cast<int32_t*>(external_pointer());
2710 return ptr[index];
2711}
2712
2713
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002714MaybeObject* ExternalIntArray::get(int index) {
2715 return GetHeap()->NumberFromInt32(get_scalar(index));
2716}
2717
2718
ager@chromium.org3811b432009-10-28 14:53:37 +00002719void ExternalIntArray::set(int index, int32_t value) {
2720 ASSERT((index >= 0) && (index < this->length()));
2721 int32_t* ptr = static_cast<int32_t*>(external_pointer());
2722 ptr[index] = value;
2723}
2724
2725
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002726uint32_t ExternalUnsignedIntArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002727 ASSERT((index >= 0) && (index < this->length()));
2728 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
2729 return ptr[index];
2730}
2731
2732
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002733MaybeObject* ExternalUnsignedIntArray::get(int index) {
2734 return GetHeap()->NumberFromUint32(get_scalar(index));
2735}
2736
2737
ager@chromium.org3811b432009-10-28 14:53:37 +00002738void ExternalUnsignedIntArray::set(int index, uint32_t value) {
2739 ASSERT((index >= 0) && (index < this->length()));
2740 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
2741 ptr[index] = value;
2742}
2743
2744
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002745float ExternalFloatArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002746 ASSERT((index >= 0) && (index < this->length()));
2747 float* ptr = static_cast<float*>(external_pointer());
2748 return ptr[index];
2749}
2750
2751
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002752MaybeObject* ExternalFloatArray::get(int index) {
2753 return GetHeap()->NumberFromDouble(get_scalar(index));
2754}
2755
2756
ager@chromium.org3811b432009-10-28 14:53:37 +00002757void ExternalFloatArray::set(int index, float value) {
2758 ASSERT((index >= 0) && (index < this->length()));
2759 float* ptr = static_cast<float*>(external_pointer());
2760 ptr[index] = value;
2761}
2762
ager@chromium.org6a2b0aa2010-07-13 20:58:03 +00002763
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002764double ExternalDoubleArray::get_scalar(int index) {
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002765 ASSERT((index >= 0) && (index < this->length()));
2766 double* ptr = static_cast<double*>(external_pointer());
2767 return ptr[index];
2768}
2769
2770
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002771MaybeObject* ExternalDoubleArray::get(int index) {
2772 return GetHeap()->NumberFromDouble(get_scalar(index));
2773}
2774
2775
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002776void ExternalDoubleArray::set(int index, double value) {
2777 ASSERT((index >= 0) && (index < this->length()));
2778 double* ptr = static_cast<double*>(external_pointer());
2779 ptr[index] = value;
2780}
2781
2782
ager@chromium.org5b2fbee2010-09-08 06:38:15 +00002783int Map::visitor_id() {
2784 return READ_BYTE_FIELD(this, kVisitorIdOffset);
2785}
2786
2787
2788void Map::set_visitor_id(int id) {
2789 ASSERT(0 <= id && id < 256);
2790 WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id));
2791}
2792
ager@chromium.org3811b432009-10-28 14:53:37 +00002793
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002794int Map::instance_size() {
ager@chromium.org7c537e22008-10-16 08:43:32 +00002795 return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2;
2796}
2797
2798
2799int Map::inobject_properties() {
2800 return READ_BYTE_FIELD(this, kInObjectPropertiesOffset);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002801}
2802
2803
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00002804int Map::pre_allocated_property_fields() {
2805 return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset);
2806}
2807
2808
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002809int HeapObject::SizeFromMap(Map* map) {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002810 int instance_size = map->instance_size();
2811 if (instance_size != kVariableSizeSentinel) return instance_size;
2812 // We can ignore the "symbol" bit becase it is only set for symbols
2813 // and implies a string type.
2814 int instance_type = static_cast<int>(map->instance_type()) & ~kIsSymbolMask;
ager@chromium.org5aa501c2009-06-23 07:57:28 +00002815 // Only inline the most frequent cases.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002816 if (instance_type == FIXED_ARRAY_TYPE) {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00002817 return FixedArray::BodyDescriptor::SizeOf(map, this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002818 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002819 if (instance_type == ASCII_STRING_TYPE) {
2820 return SeqAsciiString::SizeFor(
2821 reinterpret_cast<SeqAsciiString*>(this)->length());
2822 }
ager@chromium.org5aa501c2009-06-23 07:57:28 +00002823 if (instance_type == BYTE_ARRAY_TYPE) {
2824 return reinterpret_cast<ByteArray*>(this)->ByteArraySize();
2825 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002826 if (instance_type == FREE_SPACE_TYPE) {
2827 return reinterpret_cast<FreeSpace*>(this)->size();
2828 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002829 if (instance_type == STRING_TYPE) {
2830 return SeqTwoByteString::SizeFor(
2831 reinterpret_cast<SeqTwoByteString*>(this)->length());
2832 }
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002833 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
2834 return FixedDoubleArray::SizeFor(
2835 reinterpret_cast<FixedDoubleArray*>(this)->length());
2836 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002837 ASSERT(instance_type == CODE_TYPE);
2838 return reinterpret_cast<Code*>(this)->CodeSize();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002839}
2840
2841
2842void Map::set_instance_size(int value) {
kasperl@chromium.org71affb52009-05-26 05:44:31 +00002843 ASSERT_EQ(0, value & (kPointerSize - 1));
ager@chromium.org7c537e22008-10-16 08:43:32 +00002844 value >>= kPointerSizeLog2;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002845 ASSERT(0 <= value && value < 256);
2846 WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value));
2847}
2848
2849
ager@chromium.org7c537e22008-10-16 08:43:32 +00002850void Map::set_inobject_properties(int value) {
2851 ASSERT(0 <= value && value < 256);
2852 WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value));
2853}
2854
2855
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00002856void Map::set_pre_allocated_property_fields(int value) {
2857 ASSERT(0 <= value && value < 256);
2858 WRITE_BYTE_FIELD(this,
2859 kPreAllocatedPropertyFieldsOffset,
2860 static_cast<byte>(value));
2861}
2862
2863
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002864InstanceType Map::instance_type() {
2865 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
2866}
2867
2868
2869void Map::set_instance_type(InstanceType value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002870 WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
2871}
2872
2873
2874int Map::unused_property_fields() {
2875 return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset);
2876}
2877
2878
2879void Map::set_unused_property_fields(int value) {
2880 WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255));
2881}
2882
2883
2884byte Map::bit_field() {
2885 return READ_BYTE_FIELD(this, kBitFieldOffset);
2886}
2887
2888
2889void Map::set_bit_field(byte value) {
2890 WRITE_BYTE_FIELD(this, kBitFieldOffset, value);
2891}
2892
2893
ager@chromium.org3a37e9b2009-04-27 09:26:21 +00002894byte Map::bit_field2() {
2895 return READ_BYTE_FIELD(this, kBitField2Offset);
2896}
2897
2898
2899void Map::set_bit_field2(byte value) {
2900 WRITE_BYTE_FIELD(this, kBitField2Offset, value);
2901}
2902
2903
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002904void Map::set_non_instance_prototype(bool value) {
2905 if (value) {
2906 set_bit_field(bit_field() | (1 << kHasNonInstancePrototype));
2907 } else {
2908 set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype));
2909 }
2910}
2911
2912
2913bool Map::has_non_instance_prototype() {
2914 return ((1 << kHasNonInstancePrototype) & bit_field()) != 0;
2915}
2916
2917
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002918void Map::set_function_with_prototype(bool value) {
2919 if (value) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002920 set_bit_field3(bit_field3() | (1 << kFunctionWithPrototype));
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002921 } else {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002922 set_bit_field3(bit_field3() & ~(1 << kFunctionWithPrototype));
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002923 }
2924}
2925
2926
2927bool Map::function_with_prototype() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002928 return ((1 << kFunctionWithPrototype) & bit_field3()) != 0;
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002929}
2930
2931
ager@chromium.org870a0b62008-11-04 11:43:05 +00002932void Map::set_is_access_check_needed(bool access_check_needed) {
2933 if (access_check_needed) {
2934 set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded));
2935 } else {
2936 set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded));
2937 }
2938}
2939
2940
2941bool Map::is_access_check_needed() {
2942 return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0;
2943}
2944
2945
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00002946void Map::set_is_extensible(bool value) {
2947 if (value) {
2948 set_bit_field2(bit_field2() | (1 << kIsExtensible));
2949 } else {
2950 set_bit_field2(bit_field2() & ~(1 << kIsExtensible));
2951 }
2952}
2953
2954bool Map::is_extensible() {
2955 return ((1 << kIsExtensible) & bit_field2()) != 0;
2956}
2957
2958
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002959void Map::set_attached_to_shared_function_info(bool value) {
2960 if (value) {
2961 set_bit_field2(bit_field2() | (1 << kAttachedToSharedFunctionInfo));
2962 } else {
2963 set_bit_field2(bit_field2() & ~(1 << kAttachedToSharedFunctionInfo));
2964 }
2965}
2966
2967bool Map::attached_to_shared_function_info() {
2968 return ((1 << kAttachedToSharedFunctionInfo) & bit_field2()) != 0;
2969}
2970
2971
2972void Map::set_is_shared(bool value) {
2973 if (value) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002974 set_bit_field3(bit_field3() | (1 << kIsShared));
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002975 } else {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002976 set_bit_field3(bit_field3() & ~(1 << kIsShared));
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002977 }
2978}
2979
2980bool Map::is_shared() {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002981 return ((1 << kIsShared) & bit_field3()) != 0;
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002982}
2983
2984
mmassi@chromium.org7028c052012-06-13 11:51:58 +00002985void Map::set_used_for_prototype(bool value) {
2986 if (value) {
2987 set_bit_field3(bit_field3() | (1 << kUsedForPrototype));
2988 } else {
2989 set_bit_field3(bit_field3() & ~(1 << kUsedForPrototype));
2990 }
2991}
2992
2993
2994bool Map::used_for_prototype() {
2995 return ((1 << kUsedForPrototype) & bit_field3()) != 0;
2996}
2997
2998
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002999JSFunction* Map::unchecked_constructor() {
3000 return reinterpret_cast<JSFunction*>(READ_FIELD(this, kConstructorOffset));
3001}
3002
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003003
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003004Code::Flags Code::flags() {
3005 return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
3006}
3007
3008
3009void Code::set_flags(Code::Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003010 STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003011 // Make sure that all call stubs have an arguments count.
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00003012 ASSERT((ExtractKindFromFlags(flags) != CALL_IC &&
3013 ExtractKindFromFlags(flags) != KEYED_CALL_IC) ||
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003014 ExtractArgumentsCountFromFlags(flags) >= 0);
3015 WRITE_INT_FIELD(this, kFlagsOffset, flags);
3016}
3017
3018
3019Code::Kind Code::kind() {
3020 return ExtractKindFromFlags(flags());
3021}
3022
3023
kasper.lund7276f142008-07-30 08:49:36 +00003024InlineCacheState Code::ic_state() {
3025 InlineCacheState result = ExtractICStateFromFlags(flags());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003026 // Only allow uninitialized or debugger states for non-IC code
3027 // objects. This is used in the debugger to determine whether or not
3028 // a call to code object has been replaced with a debug break call.
3029 ASSERT(is_inline_cache_stub() ||
3030 result == UNINITIALIZED ||
3031 result == DEBUG_BREAK ||
3032 result == DEBUG_PREPARE_STEP_IN);
3033 return result;
3034}
3035
3036
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003037Code::ExtraICState Code::extra_ic_state() {
3038 ASSERT(is_inline_cache_stub());
3039 return ExtractExtraICStateFromFlags(flags());
3040}
3041
3042
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003043PropertyType Code::type() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003044 return ExtractTypeFromFlags(flags());
3045}
3046
3047
3048int Code::arguments_count() {
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00003049 ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003050 return ExtractArgumentsCountFromFlags(flags());
3051}
3052
3053
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003054int Code::major_key() {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003055 ASSERT(kind() == STUB ||
danno@chromium.org40cb8782011-05-25 07:58:50 +00003056 kind() == UNARY_OP_IC ||
3057 kind() == BINARY_OP_IC ||
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003058 kind() == COMPARE_IC ||
3059 kind() == TO_BOOLEAN_IC);
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003060 return READ_BYTE_FIELD(this, kStubMajorKeyOffset);
kasper.lund7276f142008-07-30 08:49:36 +00003061}
3062
3063
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003064void Code::set_major_key(int major) {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003065 ASSERT(kind() == STUB ||
danno@chromium.org40cb8782011-05-25 07:58:50 +00003066 kind() == UNARY_OP_IC ||
3067 kind() == BINARY_OP_IC ||
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003068 kind() == COMPARE_IC ||
3069 kind() == TO_BOOLEAN_IC);
kasper.lund7276f142008-07-30 08:49:36 +00003070 ASSERT(0 <= major && major < 256);
3071 WRITE_BYTE_FIELD(this, kStubMajorKeyOffset, major);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003072}
3073
3074
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003075bool Code::is_pregenerated() {
3076 return kind() == STUB && IsPregeneratedField::decode(flags());
3077}
3078
3079
3080void Code::set_is_pregenerated(bool value) {
3081 ASSERT(kind() == STUB);
3082 Flags f = flags();
3083 f = static_cast<Flags>(IsPregeneratedField::update(f, value));
3084 set_flags(f);
3085}
3086
3087
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003088bool Code::optimizable() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003089 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003090 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1;
3091}
3092
3093
3094void Code::set_optimizable(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003095 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003096 WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0);
3097}
3098
3099
3100bool Code::has_deoptimization_support() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003101 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003102 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3103 return FullCodeFlagsHasDeoptimizationSupportField::decode(flags);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003104}
3105
3106
3107void Code::set_has_deoptimization_support(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003108 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003109 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3110 flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value);
3111 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
3112}
3113
3114
3115bool Code::has_debug_break_slots() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003116 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003117 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3118 return FullCodeFlagsHasDebugBreakSlotsField::decode(flags);
3119}
3120
3121
3122void Code::set_has_debug_break_slots(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003123 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003124 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3125 flags = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value);
3126 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003127}
3128
3129
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003130bool Code::is_compiled_optimizable() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003131 ASSERT_EQ(FUNCTION, kind());
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003132 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3133 return FullCodeFlagsIsCompiledOptimizable::decode(flags);
3134}
3135
3136
3137void Code::set_compiled_optimizable(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003138 ASSERT_EQ(FUNCTION, kind());
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003139 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3140 flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value);
3141 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
3142}
3143
3144
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003145int Code::allow_osr_at_loop_nesting_level() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003146 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003147 return READ_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset);
3148}
3149
3150
3151void Code::set_allow_osr_at_loop_nesting_level(int level) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003152 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003153 ASSERT(level >= 0 && level <= kMaxLoopNestingMarker);
3154 WRITE_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset, level);
3155}
3156
3157
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003158int Code::profiler_ticks() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003159 ASSERT_EQ(FUNCTION, kind());
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003160 return READ_BYTE_FIELD(this, kProfilerTicksOffset);
3161}
3162
3163
3164void Code::set_profiler_ticks(int ticks) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003165 ASSERT_EQ(FUNCTION, kind());
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003166 ASSERT(ticks < 256);
3167 WRITE_BYTE_FIELD(this, kProfilerTicksOffset, ticks);
3168}
3169
3170
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003171unsigned Code::stack_slots() {
3172 ASSERT(kind() == OPTIMIZED_FUNCTION);
3173 return READ_UINT32_FIELD(this, kStackSlotsOffset);
3174}
3175
3176
3177void Code::set_stack_slots(unsigned slots) {
3178 ASSERT(kind() == OPTIMIZED_FUNCTION);
3179 WRITE_UINT32_FIELD(this, kStackSlotsOffset, slots);
3180}
3181
3182
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003183unsigned Code::safepoint_table_offset() {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003184 ASSERT(kind() == OPTIMIZED_FUNCTION);
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003185 return READ_UINT32_FIELD(this, kSafepointTableOffsetOffset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003186}
3187
3188
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003189void Code::set_safepoint_table_offset(unsigned offset) {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003190 ASSERT(kind() == OPTIMIZED_FUNCTION);
3191 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003192 WRITE_UINT32_FIELD(this, kSafepointTableOffsetOffset, offset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003193}
3194
3195
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003196unsigned Code::stack_check_table_offset() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003197 ASSERT_EQ(FUNCTION, kind());
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003198 return READ_UINT32_FIELD(this, kStackCheckTableOffsetOffset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003199}
3200
3201
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003202void Code::set_stack_check_table_offset(unsigned offset) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003203 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003204 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003205 WRITE_UINT32_FIELD(this, kStackCheckTableOffsetOffset, offset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003206}
3207
3208
3209CheckType Code::check_type() {
3210 ASSERT(is_call_stub() || is_keyed_call_stub());
3211 byte type = READ_BYTE_FIELD(this, kCheckTypeOffset);
3212 return static_cast<CheckType>(type);
3213}
3214
3215
3216void Code::set_check_type(CheckType value) {
3217 ASSERT(is_call_stub() || is_keyed_call_stub());
3218 WRITE_BYTE_FIELD(this, kCheckTypeOffset, value);
3219}
3220
3221
danno@chromium.org40cb8782011-05-25 07:58:50 +00003222byte Code::unary_op_type() {
3223 ASSERT(is_unary_op_stub());
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00003224 return READ_BYTE_FIELD(this, kUnaryOpTypeOffset);
3225}
3226
3227
danno@chromium.org40cb8782011-05-25 07:58:50 +00003228void Code::set_unary_op_type(byte value) {
3229 ASSERT(is_unary_op_stub());
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00003230 WRITE_BYTE_FIELD(this, kUnaryOpTypeOffset, value);
3231}
3232
3233
danno@chromium.org40cb8782011-05-25 07:58:50 +00003234byte Code::binary_op_type() {
3235 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003236 return READ_BYTE_FIELD(this, kBinaryOpTypeOffset);
3237}
3238
3239
danno@chromium.org40cb8782011-05-25 07:58:50 +00003240void Code::set_binary_op_type(byte value) {
3241 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003242 WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value);
3243}
3244
3245
danno@chromium.org40cb8782011-05-25 07:58:50 +00003246byte Code::binary_op_result_type() {
3247 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003248 return READ_BYTE_FIELD(this, kBinaryOpReturnTypeOffset);
3249}
3250
3251
danno@chromium.org40cb8782011-05-25 07:58:50 +00003252void Code::set_binary_op_result_type(byte value) {
3253 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003254 WRITE_BYTE_FIELD(this, kBinaryOpReturnTypeOffset, value);
3255}
3256
3257
3258byte Code::compare_state() {
3259 ASSERT(is_compare_ic_stub());
3260 return READ_BYTE_FIELD(this, kCompareStateOffset);
3261}
3262
3263
3264void Code::set_compare_state(byte value) {
3265 ASSERT(is_compare_ic_stub());
3266 WRITE_BYTE_FIELD(this, kCompareStateOffset, value);
3267}
3268
3269
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003270byte Code::compare_operation() {
3271 ASSERT(is_compare_ic_stub());
3272 return READ_BYTE_FIELD(this, kCompareOperationOffset);
3273}
3274
3275
3276void Code::set_compare_operation(byte value) {
3277 ASSERT(is_compare_ic_stub());
3278 WRITE_BYTE_FIELD(this, kCompareOperationOffset, value);
3279}
3280
3281
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003282byte Code::to_boolean_state() {
3283 ASSERT(is_to_boolean_ic_stub());
3284 return READ_BYTE_FIELD(this, kToBooleanTypeOffset);
3285}
3286
3287
3288void Code::set_to_boolean_state(byte value) {
3289 ASSERT(is_to_boolean_ic_stub());
3290 WRITE_BYTE_FIELD(this, kToBooleanTypeOffset, value);
3291}
3292
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003293
3294bool Code::has_function_cache() {
3295 ASSERT(kind() == STUB);
3296 return READ_BYTE_FIELD(this, kHasFunctionCacheOffset) != 0;
3297}
3298
3299
3300void Code::set_has_function_cache(bool flag) {
3301 ASSERT(kind() == STUB);
3302 WRITE_BYTE_FIELD(this, kHasFunctionCacheOffset, flag);
3303}
3304
3305
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003306bool Code::is_inline_cache_stub() {
3307 Kind kind = this->kind();
3308 return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND;
3309}
3310
3311
3312Code::Flags Code::ComputeFlags(Kind kind,
kasper.lund7276f142008-07-30 08:49:36 +00003313 InlineCacheState ic_state,
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003314 ExtraICState extra_ic_state,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003315 PropertyType type,
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003316 int argc,
3317 InlineCacheHolderFlag holder) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00003318 // Extra IC state is only allowed for call IC stubs or for store IC
3319 // stubs.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003320 ASSERT(extra_ic_state == kNoExtraICState ||
lrn@chromium.org34e60782011-09-15 07:25:40 +00003321 kind == CALL_IC ||
3322 kind == STORE_IC ||
3323 kind == KEYED_STORE_IC);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003324 // Compute the bit mask.
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003325 int bits = KindField::encode(kind)
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003326 | ICStateField::encode(ic_state)
3327 | TypeField::encode(type)
3328 | ExtraICStateField::encode(extra_ic_state)
lrn@chromium.org34e60782011-09-15 07:25:40 +00003329 | (argc << kArgumentsCountShift)
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003330 | CacheHolderField::encode(holder);
3331 return static_cast<Flags>(bits);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003332}
3333
3334
3335Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
3336 PropertyType type,
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003337 ExtraICState extra_ic_state,
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003338 InlineCacheHolderFlag holder,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003339 int argc) {
lrn@chromium.org34e60782011-09-15 07:25:40 +00003340 return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003341}
3342
3343
3344Code::Kind Code::ExtractKindFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003345 return KindField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003346}
3347
3348
kasper.lund7276f142008-07-30 08:49:36 +00003349InlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003350 return ICStateField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003351}
3352
3353
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003354Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003355 return ExtraICStateField::decode(flags);
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003356}
3357
3358
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003359PropertyType Code::ExtractTypeFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003360 return TypeField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003361}
3362
3363
3364int Code::ExtractArgumentsCountFromFlags(Flags flags) {
lrn@chromium.org34e60782011-09-15 07:25:40 +00003365 return (flags & kArgumentsCountMask) >> kArgumentsCountShift;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003366}
3367
3368
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003369InlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003370 return CacheHolderField::decode(flags);
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003371}
3372
3373
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003374Code::Flags Code::RemoveTypeFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003375 int bits = flags & ~TypeField::kMask;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003376 return static_cast<Flags>(bits);
3377}
3378
3379
ager@chromium.org8bb60582008-12-11 12:02:20 +00003380Code* Code::GetCodeFromTargetAddress(Address address) {
3381 HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
3382 // GetCodeFromTargetAddress might be called when marking objects during mark
3383 // sweep. reinterpret_cast is therefore used instead of the more appropriate
3384 // Code::cast. Code::cast does not work when the object's map is
3385 // marked.
3386 Code* result = reinterpret_cast<Code*>(code);
3387 return result;
3388}
3389
3390
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00003391Object* Code::GetObjectFromEntryAddress(Address location_of_address) {
3392 return HeapObject::
3393 FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize);
3394}
3395
3396
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003397Object* Map::prototype() {
3398 return READ_FIELD(this, kPrototypeOffset);
3399}
3400
3401
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003402void Map::set_prototype(Object* value, WriteBarrierMode mode) {
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00003403 ASSERT(value->IsNull() || value->IsJSReceiver());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003404 WRITE_FIELD(this, kPrototypeOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003405 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode);
fschneider@chromium.org40b9da32010-06-28 11:29:21 +00003406}
3407
3408
danno@chromium.org40cb8782011-05-25 07:58:50 +00003409DescriptorArray* Map::instance_descriptors() {
3410 Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
3411 if (object->IsSmi()) {
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00003412 return GetHeap()->empty_descriptor_array();
danno@chromium.org40cb8782011-05-25 07:58:50 +00003413 } else {
3414 return DescriptorArray::cast(object);
3415 }
3416}
3417
3418
3419void Map::init_instance_descriptors() {
3420 WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, Smi::FromInt(0));
3421}
3422
3423
3424void Map::clear_instance_descriptors() {
3425 Object* object = READ_FIELD(this,
3426 kInstanceDescriptorsOrBitField3Offset);
3427 if (!object->IsSmi()) {
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003428#ifdef DEBUG
3429 ZapInstanceDescriptors();
3430#endif
danno@chromium.org40cb8782011-05-25 07:58:50 +00003431 WRITE_FIELD(
3432 this,
3433 kInstanceDescriptorsOrBitField3Offset,
3434 Smi::FromInt(DescriptorArray::cast(object)->bit_field3_storage()));
3435 }
3436}
3437
3438
3439void Map::set_instance_descriptors(DescriptorArray* value,
3440 WriteBarrierMode mode) {
3441 Object* object = READ_FIELD(this,
3442 kInstanceDescriptorsOrBitField3Offset);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003443 Heap* heap = GetHeap();
3444 if (value == heap->empty_descriptor_array()) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00003445 clear_instance_descriptors();
3446 return;
3447 } else {
3448 if (object->IsSmi()) {
3449 value->set_bit_field3_storage(Smi::cast(object)->value());
3450 } else {
3451 value->set_bit_field3_storage(
3452 DescriptorArray::cast(object)->bit_field3_storage());
3453 }
3454 }
3455 ASSERT(!is_shared());
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003456#ifdef DEBUG
3457 if (value != instance_descriptors()) {
3458 ZapInstanceDescriptors();
3459 }
3460#endif
danno@chromium.org40cb8782011-05-25 07:58:50 +00003461 WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003462 CONDITIONAL_WRITE_BARRIER(
3463 heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode);
danno@chromium.org40cb8782011-05-25 07:58:50 +00003464}
3465
3466
3467int Map::bit_field3() {
3468 Object* object = READ_FIELD(this,
3469 kInstanceDescriptorsOrBitField3Offset);
3470 if (object->IsSmi()) {
3471 return Smi::cast(object)->value();
3472 } else {
3473 return DescriptorArray::cast(object)->bit_field3_storage();
3474 }
3475}
3476
3477
3478void Map::set_bit_field3(int value) {
3479 ASSERT(Smi::IsValid(value));
3480 Object* object = READ_FIELD(this,
3481 kInstanceDescriptorsOrBitField3Offset);
3482 if (object->IsSmi()) {
3483 WRITE_FIELD(this,
3484 kInstanceDescriptorsOrBitField3Offset,
3485 Smi::FromInt(value));
3486 } else {
3487 DescriptorArray::cast(object)->set_bit_field3_storage(value);
3488 }
3489}
3490
3491
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003492Object* Map::GetBackPointer() {
3493 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3494 if (object->IsFixedArray()) {
3495 return FixedArray::cast(object)->get(kProtoTransitionBackPointerOffset);
3496 } else {
3497 return object;
3498 }
3499}
3500
3501
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003502Map* Map::elements_transition_map() {
3503 return instance_descriptors()->elements_transition_map();
3504}
3505
3506
3507void Map::set_elements_transition_map(Map* transitioned_map) {
3508 return instance_descriptors()->set_elements_transition_map(transitioned_map);
3509}
3510
3511
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003512void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
3513 Heap* heap = GetHeap();
3514 ASSERT(instance_type() >= FIRST_JS_RECEIVER_TYPE);
3515 ASSERT((value->IsUndefined() && GetBackPointer()->IsMap()) ||
3516 (value->IsMap() && GetBackPointer()->IsUndefined()));
3517 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3518 if (object->IsFixedArray()) {
3519 FixedArray::cast(object)->set(
3520 kProtoTransitionBackPointerOffset, value, mode);
3521 } else {
3522 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, value);
3523 CONDITIONAL_WRITE_BARRIER(
3524 heap, this, kPrototypeTransitionsOrBackPointerOffset, value, mode);
3525 }
3526}
3527
3528
3529FixedArray* Map::prototype_transitions() {
3530 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3531 if (object->IsFixedArray()) {
3532 return FixedArray::cast(object);
3533 } else {
3534 return GetHeap()->empty_fixed_array();
3535 }
3536}
3537
3538
3539void Map::set_prototype_transitions(FixedArray* value, WriteBarrierMode mode) {
3540 Heap* heap = GetHeap();
3541 ASSERT(value != heap->empty_fixed_array());
3542 value->set(kProtoTransitionBackPointerOffset, GetBackPointer());
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003543#ifdef DEBUG
3544 if (value != prototype_transitions()) {
3545 ZapPrototypeTransitions();
3546 }
3547#endif
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003548 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, value);
3549 CONDITIONAL_WRITE_BARRIER(
3550 heap, this, kPrototypeTransitionsOrBackPointerOffset, value, mode);
3551}
3552
3553
3554void Map::init_prototype_transitions(Object* undefined) {
3555 ASSERT(undefined->IsUndefined());
3556 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, undefined);
3557}
3558
3559
3560HeapObject* Map::unchecked_prototype_transitions() {
3561 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3562 return reinterpret_cast<HeapObject*>(object);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003563}
3564
3565
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00003566ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003567ACCESSORS(Map, constructor, Object, kConstructorOffset)
3568
3569ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003570ACCESSORS(JSFunction, literals_or_bindings, FixedArray, kLiteralsOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003571ACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003572
3573ACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset)
3574ACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003575ACCESSORS(GlobalObject, global_receiver, JSObject, kGlobalReceiverOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003576
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003577ACCESSORS(JSGlobalProxy, context, Object, kContextOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003578
3579ACCESSORS(AccessorInfo, getter, Object, kGetterOffset)
3580ACCESSORS(AccessorInfo, setter, Object, kSetterOffset)
3581ACCESSORS(AccessorInfo, data, Object, kDataOffset)
3582ACCESSORS(AccessorInfo, name, Object, kNameOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003583ACCESSORS_TO_SMI(AccessorInfo, flag, kFlagOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003584ACCESSORS(AccessorInfo, expected_receiver_type, Object,
3585 kExpectedReceiverTypeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003586
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00003587ACCESSORS(AccessorPair, getter, Object, kGetterOffset)
3588ACCESSORS(AccessorPair, setter, Object, kSetterOffset)
3589
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003590ACCESSORS(AccessCheckInfo, named_callback, Object, kNamedCallbackOffset)
3591ACCESSORS(AccessCheckInfo, indexed_callback, Object, kIndexedCallbackOffset)
3592ACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
3593
3594ACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
3595ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
3596ACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
3597ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
3598ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
3599ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
3600
3601ACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
3602ACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
3603
3604ACCESSORS(TemplateInfo, tag, Object, kTagOffset)
3605ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
3606
3607ACCESSORS(FunctionTemplateInfo, serial_number, Object, kSerialNumberOffset)
3608ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003609ACCESSORS(FunctionTemplateInfo, property_accessors, Object,
3610 kPropertyAccessorsOffset)
3611ACCESSORS(FunctionTemplateInfo, prototype_template, Object,
3612 kPrototypeTemplateOffset)
3613ACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset)
3614ACCESSORS(FunctionTemplateInfo, named_property_handler, Object,
3615 kNamedPropertyHandlerOffset)
3616ACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object,
3617 kIndexedPropertyHandlerOffset)
3618ACCESSORS(FunctionTemplateInfo, instance_template, Object,
3619 kInstanceTemplateOffset)
3620ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
3621ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003622ACCESSORS(FunctionTemplateInfo, instance_call_handler, Object,
3623 kInstanceCallHandlerOffset)
3624ACCESSORS(FunctionTemplateInfo, access_check_info, Object,
3625 kAccessCheckInfoOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003626ACCESSORS_TO_SMI(FunctionTemplateInfo, flag, kFlagOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003627
3628ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
kasper.lund212ac232008-07-16 07:07:30 +00003629ACCESSORS(ObjectTemplateInfo, internal_field_count, Object,
3630 kInternalFieldCountOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003631
3632ACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset)
3633ACCESSORS(SignatureInfo, args, Object, kArgsOffset)
3634
3635ACCESSORS(TypeSwitchInfo, types, Object, kTypesOffset)
3636
3637ACCESSORS(Script, source, Object, kSourceOffset)
3638ACCESSORS(Script, name, Object, kNameOffset)
kasperl@chromium.org7be3c992009-03-12 07:19:55 +00003639ACCESSORS(Script, id, Object, kIdOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003640ACCESSORS_TO_SMI(Script, line_offset, kLineOffsetOffset)
3641ACCESSORS_TO_SMI(Script, column_offset, kColumnOffsetOffset)
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003642ACCESSORS(Script, data, Object, kDataOffset)
ager@chromium.org9085a012009-05-11 19:22:57 +00003643ACCESSORS(Script, context_data, Object, kContextOffset)
ager@chromium.orgea91cc52011-05-23 06:06:11 +00003644ACCESSORS(Script, wrapper, Foreign, kWrapperOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003645ACCESSORS_TO_SMI(Script, type, kTypeOffset)
3646ACCESSORS_TO_SMI(Script, compilation_type, kCompilationTypeOffset)
3647ACCESSORS_TO_SMI(Script, compilation_state, kCompilationStateOffset)
sgjesse@chromium.org499aaa52009-11-30 08:07:20 +00003648ACCESSORS(Script, line_ends, Object, kLineEndsOffset)
sgjesse@chromium.org98180592009-12-02 08:17:28 +00003649ACCESSORS(Script, eval_from_shared, Object, kEvalFromSharedOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003650ACCESSORS_TO_SMI(Script, eval_from_instructions_offset,
3651 kEvalFrominstructionsOffsetOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003652
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003653#ifdef ENABLE_DEBUGGER_SUPPORT
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003654ACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex)
3655ACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex)
3656ACCESSORS(DebugInfo, code, Code, kPatchedCodeIndex)
3657ACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex)
3658
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003659ACCESSORS_TO_SMI(BreakPointInfo, code_position, kCodePositionIndex)
3660ACCESSORS_TO_SMI(BreakPointInfo, source_position, kSourcePositionIndex)
3661ACCESSORS_TO_SMI(BreakPointInfo, statement_position, kStatementPositionIndex)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003662ACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex)
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003663#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003664
3665ACCESSORS(SharedFunctionInfo, name, Object, kNameOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003666ACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset)
3667ACCESSORS(SharedFunctionInfo, initial_map, Object, kInitialMapOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003668ACCESSORS(SharedFunctionInfo, instance_class_name, Object,
3669 kInstanceClassNameOffset)
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003670ACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003671ACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset)
3672ACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
kasperl@chromium.orgd1e3e722009-04-14 13:38:25 +00003673ACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset)
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003674ACCESSORS(SharedFunctionInfo, this_property_assignments, Object,
3675 kThisPropertyAssignmentsOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003676SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003677
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +00003678
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003679BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
3680 kHiddenPrototypeBit)
3681BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
3682BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
3683 kNeedsAccessCheckBit)
ricow@chromium.org2c99e282011-07-28 09:15:17 +00003684BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
3685 kReadOnlyPrototypeBit)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003686BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression,
3687 kIsExpressionBit)
3688BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
3689 kIsTopLevelBit)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003690BOOL_GETTER(SharedFunctionInfo,
3691 compiler_hints,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003692 has_only_simple_this_property_assignments,
3693 kHasOnlySimpleThisPropertyAssignments)
ager@chromium.orgc4c92722009-11-18 14:12:51 +00003694BOOL_ACCESSORS(SharedFunctionInfo,
3695 compiler_hints,
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +00003696 allows_lazy_compilation,
3697 kAllowLazyCompilation)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003698BOOL_ACCESSORS(SharedFunctionInfo,
3699 compiler_hints,
3700 uses_arguments,
3701 kUsesArguments)
3702BOOL_ACCESSORS(SharedFunctionInfo,
3703 compiler_hints,
3704 has_duplicate_parameters,
3705 kHasDuplicateParameters)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003706
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003707
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003708#if V8_HOST_ARCH_32_BIT
3709SMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
3710SMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003711 kFormalParameterCountOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003712SMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003713 kExpectedNofPropertiesOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003714SMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
3715SMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003716 kStartPositionAndTypeOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003717SMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
3718SMI_ACCESSORS(SharedFunctionInfo, function_token_position,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003719 kFunctionTokenPositionOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003720SMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003721 kCompilerHintsOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003722SMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003723 kThisPropertyAssignmentsCountOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003724SMI_ACCESSORS(SharedFunctionInfo, opt_count, kOptCountOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003725SMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset)
3726SMI_ACCESSORS(SharedFunctionInfo,
3727 stress_deopt_counter,
3728 kStressDeoptCounterOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003729#else
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003730
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003731#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003732 STATIC_ASSERT(holder::offset % kPointerSize == 0); \
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003733 int holder::name() { \
3734 int value = READ_INT_FIELD(this, offset); \
3735 ASSERT(kHeapObjectTag == 1); \
3736 ASSERT((value & kHeapObjectTag) == 0); \
3737 return value >> 1; \
3738 } \
3739 void holder::set_##name(int value) { \
3740 ASSERT(kHeapObjectTag == 1); \
3741 ASSERT((value & 0xC0000000) == 0xC0000000 || \
3742 (value & 0xC0000000) == 0x000000000); \
3743 WRITE_INT_FIELD(this, \
3744 offset, \
3745 (value << 1) & ~kHeapObjectTag); \
3746 }
3747
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003748#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \
3749 STATIC_ASSERT(holder::offset % kPointerSize == kIntSize); \
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003750 INT_ACCESSORS(holder, name, offset)
3751
3752
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003753PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003754PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3755 formal_parameter_count,
3756 kFormalParameterCountOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003757
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003758PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3759 expected_nof_properties,
3760 kExpectedNofPropertiesOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003761PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
3762
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003763PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, end_position, kEndPositionOffset)
3764PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3765 start_position_and_type,
3766 kStartPositionAndTypeOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003767
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003768PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3769 function_token_position,
3770 kFunctionTokenPositionOffset)
3771PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3772 compiler_hints,
3773 kCompilerHintsOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003774
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003775PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3776 this_property_assignments_count,
3777 kThisPropertyAssignmentsCountOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003778PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, opt_count, kOptCountOffset)
svenpanne@chromium.orgb1df11d2012-02-08 10:26:21 +00003779
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003780PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, counters, kCountersOffset)
3781PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3782 stress_deopt_counter,
3783 kStressDeoptCounterOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003784#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003785
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003786
3787int SharedFunctionInfo::construction_count() {
3788 return READ_BYTE_FIELD(this, kConstructionCountOffset);
3789}
3790
3791
3792void SharedFunctionInfo::set_construction_count(int value) {
3793 ASSERT(0 <= value && value < 256);
3794 WRITE_BYTE_FIELD(this, kConstructionCountOffset, static_cast<byte>(value));
3795}
3796
3797
whesse@chromium.org7b260152011-06-20 15:33:18 +00003798BOOL_ACCESSORS(SharedFunctionInfo,
3799 compiler_hints,
3800 live_objects_may_exist,
3801 kLiveObjectsMayExist)
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003802
3803
3804bool SharedFunctionInfo::IsInobjectSlackTrackingInProgress() {
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00003805 return initial_map() != GetHeap()->undefined_value();
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003806}
3807
3808
whesse@chromium.org7b260152011-06-20 15:33:18 +00003809BOOL_GETTER(SharedFunctionInfo,
3810 compiler_hints,
3811 optimization_disabled,
3812 kOptimizationDisabled)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003813
3814
3815void SharedFunctionInfo::set_optimization_disabled(bool disable) {
3816 set_compiler_hints(BooleanBit::set(compiler_hints(),
3817 kOptimizationDisabled,
3818 disable));
3819 // If disabling optimizations we reflect that in the code object so
3820 // it will not be counted as optimizable code.
3821 if ((code()->kind() == Code::FUNCTION) && disable) {
3822 code()->set_optimizable(false);
3823 }
3824}
3825
3826
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003827int SharedFunctionInfo::profiler_ticks() {
3828 if (code()->kind() != Code::FUNCTION) return 0;
3829 return code()->profiler_ticks();
3830}
3831
3832
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003833LanguageMode SharedFunctionInfo::language_mode() {
3834 int hints = compiler_hints();
3835 if (BooleanBit::get(hints, kExtendedModeFunction)) {
3836 ASSERT(BooleanBit::get(hints, kStrictModeFunction));
3837 return EXTENDED_MODE;
3838 }
3839 return BooleanBit::get(hints, kStrictModeFunction)
3840 ? STRICT_MODE : CLASSIC_MODE;
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003841}
3842
3843
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003844void SharedFunctionInfo::set_language_mode(LanguageMode language_mode) {
3845 // We only allow language mode transitions that go set the same language mode
3846 // again or go up in the chain:
3847 // CLASSIC_MODE -> STRICT_MODE -> EXTENDED_MODE.
3848 ASSERT(this->language_mode() == CLASSIC_MODE ||
3849 this->language_mode() == language_mode ||
3850 language_mode == EXTENDED_MODE);
3851 int hints = compiler_hints();
3852 hints = BooleanBit::set(
3853 hints, kStrictModeFunction, language_mode != CLASSIC_MODE);
3854 hints = BooleanBit::set(
3855 hints, kExtendedModeFunction, language_mode == EXTENDED_MODE);
3856 set_compiler_hints(hints);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003857}
3858
3859
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003860bool SharedFunctionInfo::is_classic_mode() {
3861 return !BooleanBit::get(compiler_hints(), kStrictModeFunction);
3862}
3863
3864BOOL_GETTER(SharedFunctionInfo, compiler_hints, is_extended_mode,
3865 kExtendedModeFunction)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00003866BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative)
3867BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints,
3868 name_should_print_as_anonymous,
3869 kNameShouldPrintAsAnonymous)
3870BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, bound, kBoundFunction)
3871BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_anonymous, kIsAnonymous)
yangguo@chromium.org56454712012-02-16 15:33:53 +00003872BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_function, kIsFunction)
3873BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_optimize,
3874 kDontOptimize)
svenpanne@chromium.orgb1df11d2012-02-08 10:26:21 +00003875BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_inline, kDontInline)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003876
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00003877ACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
3878ACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
3879
jkummerow@chromium.orge297f592011-06-08 10:05:15 +00003880ACCESSORS(PolymorphicCodeCache, cache, Object, kCacheOffset)
3881
sgjesse@chromium.org152a0b02009-10-07 13:50:16 +00003882bool Script::HasValidSource() {
3883 Object* src = this->source();
3884 if (!src->IsString()) return true;
3885 String* src_str = String::cast(src);
3886 if (!StringShape(src_str).IsExternal()) return true;
3887 if (src_str->IsAsciiRepresentation()) {
3888 return ExternalAsciiString::cast(src)->resource() != NULL;
3889 } else if (src_str->IsTwoByteRepresentation()) {
3890 return ExternalTwoByteString::cast(src)->resource() != NULL;
3891 }
3892 return true;
3893}
3894
3895
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00003896void SharedFunctionInfo::DontAdaptArguments() {
3897 ASSERT(code()->kind() == Code::BUILTIN);
3898 set_formal_parameter_count(kDontAdaptArgumentsSentinel);
3899}
3900
3901
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003902int SharedFunctionInfo::start_position() {
3903 return start_position_and_type() >> kStartPositionShift;
3904}
3905
3906
3907void SharedFunctionInfo::set_start_position(int start_position) {
3908 set_start_position_and_type((start_position << kStartPositionShift)
3909 | (start_position_and_type() & ~kStartPositionMask));
3910}
3911
3912
3913Code* SharedFunctionInfo::code() {
3914 return Code::cast(READ_FIELD(this, kCodeOffset));
3915}
3916
3917
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003918Code* SharedFunctionInfo::unchecked_code() {
3919 return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset));
3920}
3921
3922
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003923void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003924 WRITE_FIELD(this, kCodeOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003925 CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003926}
3927
3928
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00003929ScopeInfo* SharedFunctionInfo::scope_info() {
3930 return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset));
ager@chromium.orgb5737492010-07-15 09:29:43 +00003931}
3932
3933
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00003934void SharedFunctionInfo::set_scope_info(ScopeInfo* value,
ager@chromium.orgb5737492010-07-15 09:29:43 +00003935 WriteBarrierMode mode) {
3936 WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003937 CONDITIONAL_WRITE_BARRIER(GetHeap(),
3938 this,
3939 kScopeInfoOffset,
3940 reinterpret_cast<Object*>(value),
3941 mode);
ager@chromium.orgb5737492010-07-15 09:29:43 +00003942}
3943
3944
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003945bool SharedFunctionInfo::is_compiled() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00003946 return code() !=
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00003947 Isolate::Current()->builtins()->builtin(Builtins::kLazyCompile);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003948}
3949
3950
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003951bool SharedFunctionInfo::IsApiFunction() {
3952 return function_data()->IsFunctionTemplateInfo();
3953}
3954
3955
3956FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
3957 ASSERT(IsApiFunction());
3958 return FunctionTemplateInfo::cast(function_data());
3959}
3960
3961
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00003962bool SharedFunctionInfo::HasBuiltinFunctionId() {
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +00003963 return function_data()->IsSmi();
3964}
3965
3966
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00003967BuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
3968 ASSERT(HasBuiltinFunctionId());
3969 return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value());
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003970}
3971
3972
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003973int SharedFunctionInfo::code_age() {
3974 return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask;
3975}
3976
3977
3978void SharedFunctionInfo::set_code_age(int code_age) {
mstarzinger@chromium.orgf8c6bd52011-11-23 12:13:52 +00003979 int hints = compiler_hints() & ~(kCodeAgeMask << kCodeAgeShift);
3980 set_compiler_hints(hints | ((code_age & kCodeAgeMask) << kCodeAgeShift));
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003981}
3982
3983
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003984int SharedFunctionInfo::ic_age() {
3985 return ICAgeBits::decode(counters());
3986}
3987
3988
3989void SharedFunctionInfo::set_ic_age(int ic_age) {
3990 set_counters(ICAgeBits::update(counters(), ic_age));
3991}
3992
3993
3994int SharedFunctionInfo::deopt_count() {
3995 return DeoptCountBits::decode(counters());
3996}
3997
3998
3999void SharedFunctionInfo::set_deopt_count(int deopt_count) {
4000 set_counters(DeoptCountBits::update(counters(), deopt_count));
4001}
4002
4003
4004void SharedFunctionInfo::increment_deopt_count() {
4005 int value = counters();
4006 int deopt_count = DeoptCountBits::decode(value);
4007 deopt_count = (deopt_count + 1) & DeoptCountBits::kMax;
4008 set_counters(DeoptCountBits::update(value, deopt_count));
4009}
4010
4011
4012int SharedFunctionInfo::opt_reenable_tries() {
4013 return OptReenableTriesBits::decode(counters());
4014}
4015
4016
4017void SharedFunctionInfo::set_opt_reenable_tries(int tries) {
4018 set_counters(OptReenableTriesBits::update(counters(), tries));
4019}
4020
4021
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004022bool SharedFunctionInfo::has_deoptimization_support() {
4023 Code* code = this->code();
4024 return code->kind() == Code::FUNCTION && code->has_deoptimization_support();
4025}
4026
4027
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004028void SharedFunctionInfo::TryReenableOptimization() {
4029 int tries = opt_reenable_tries();
4030 set_opt_reenable_tries((tries + 1) & OptReenableTriesBits::kMax);
4031 // We reenable optimization whenever the number of tries is a large
4032 // enough power of 2.
4033 if (tries >= 16 && (((tries - 1) & tries) == 0)) {
4034 set_optimization_disabled(false);
4035 set_opt_count(0);
4036 set_deopt_count(0);
4037 code()->set_optimizable(true);
4038 }
4039}
4040
4041
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004042bool JSFunction::IsBuiltin() {
4043 return context()->global()->IsJSBuiltinsObject();
4044}
4045
4046
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004047bool JSFunction::NeedsArgumentsAdaption() {
4048 return shared()->formal_parameter_count() !=
4049 SharedFunctionInfo::kDontAdaptArgumentsSentinel;
4050}
4051
4052
4053bool JSFunction::IsOptimized() {
4054 return code()->kind() == Code::OPTIMIZED_FUNCTION;
4055}
4056
4057
ager@chromium.orga9aa5fa2011-04-13 08:46:07 +00004058bool JSFunction::IsOptimizable() {
4059 return code()->kind() == Code::FUNCTION && code()->optimizable();
4060}
4061
4062
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004063bool JSFunction::IsMarkedForLazyRecompilation() {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00004064 return code() == GetIsolate()->builtins()->builtin(Builtins::kLazyRecompile);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004065}
4066
4067
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004068Code* JSFunction::code() {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004069 return Code::cast(unchecked_code());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004070}
4071
4072
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004073Code* JSFunction::unchecked_code() {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004074 return reinterpret_cast<Code*>(
4075 Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset)));
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004076}
4077
4078
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004079void JSFunction::set_code(Code* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004080 ASSERT(!HEAP->InNewSpace(value));
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004081 Address entry = value->entry();
4082 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004083 GetHeap()->incremental_marking()->RecordWriteOfCodeEntry(
4084 this,
4085 HeapObject::RawField(this, kCodeEntryOffset),
4086 value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004087}
4088
4089
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004090void JSFunction::ReplaceCode(Code* code) {
4091 bool was_optimized = IsOptimized();
4092 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
4093
4094 set_code(code);
4095
4096 // Add/remove the function from the list of optimized functions for this
4097 // context based on the state change.
4098 if (!was_optimized && is_optimized) {
4099 context()->global_context()->AddOptimizedFunction(this);
4100 }
4101 if (was_optimized && !is_optimized) {
4102 context()->global_context()->RemoveOptimizedFunction(this);
4103 }
4104}
4105
4106
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004107Context* JSFunction::context() {
4108 return Context::cast(READ_FIELD(this, kContextOffset));
4109}
4110
4111
4112Object* JSFunction::unchecked_context() {
4113 return READ_FIELD(this, kContextOffset);
4114}
4115
4116
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004117SharedFunctionInfo* JSFunction::unchecked_shared() {
4118 return reinterpret_cast<SharedFunctionInfo*>(
4119 READ_FIELD(this, kSharedFunctionInfoOffset));
4120}
4121
4122
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004123void JSFunction::set_context(Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004124 ASSERT(value->IsUndefined() || value->IsContext());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004125 WRITE_FIELD(this, kContextOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004126 WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004127}
4128
4129ACCESSORS(JSFunction, prototype_or_initial_map, Object,
4130 kPrototypeOrInitialMapOffset)
4131
4132
4133Map* JSFunction::initial_map() {
4134 return Map::cast(prototype_or_initial_map());
4135}
4136
4137
4138void JSFunction::set_initial_map(Map* value) {
4139 set_prototype_or_initial_map(value);
4140}
4141
4142
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004143MaybeObject* JSFunction::set_initial_map_and_cache_transitions(
4144 Map* initial_map) {
4145 Context* global_context = context()->global_context();
4146 Object* array_function =
4147 global_context->get(Context::ARRAY_FUNCTION_INDEX);
4148 if (array_function->IsJSFunction() &&
4149 this == JSFunction::cast(array_function)) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004150 // Replace all of the cached initial array maps in the global context with
4151 // the appropriate transitioned elements kind maps.
4152 Heap* heap = GetHeap();
4153 MaybeObject* maybe_maps =
4154 heap->AllocateFixedArrayWithHoles(kElementsKindCount);
4155 FixedArray* maps;
4156 if (!maybe_maps->To(&maps)) return maybe_maps;
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004157
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004158 Map* current_map = initial_map;
4159 ElementsKind kind = current_map->elements_kind();
4160 ASSERT(kind == GetInitialFastElementsKind());
4161 maps->set(kind, current_map);
4162 for (int i = GetSequenceIndexFromFastElementsKind(kind) + 1;
4163 i < kFastElementsKindCount; ++i) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004164 Map* new_map;
4165 ElementsKind next_kind = GetFastElementsKindFromSequenceIndex(i);
4166 MaybeObject* maybe_new_map =
4167 current_map->CreateNextElementsTransition(next_kind);
4168 if (!maybe_new_map->To(&new_map)) return maybe_new_map;
4169 maps->set(next_kind, new_map);
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004170 current_map = new_map;
4171 }
4172 global_context->set_js_array_maps(maps);
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004173 }
4174 set_initial_map(initial_map);
4175 return this;
4176}
4177
4178
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004179bool JSFunction::has_initial_map() {
4180 return prototype_or_initial_map()->IsMap();
4181}
4182
4183
4184bool JSFunction::has_instance_prototype() {
4185 return has_initial_map() || !prototype_or_initial_map()->IsTheHole();
4186}
4187
4188
4189bool JSFunction::has_prototype() {
4190 return map()->has_non_instance_prototype() || has_instance_prototype();
4191}
4192
4193
4194Object* JSFunction::instance_prototype() {
4195 ASSERT(has_instance_prototype());
4196 if (has_initial_map()) return initial_map()->prototype();
4197 // When there is no initial map and the prototype is a JSObject, the
4198 // initial map field is used for the prototype field.
4199 return prototype_or_initial_map();
4200}
4201
4202
4203Object* JSFunction::prototype() {
4204 ASSERT(has_prototype());
4205 // If the function's prototype property has been set to a non-JSObject
4206 // value, that value is stored in the constructor field of the map.
4207 if (map()->has_non_instance_prototype()) return map()->constructor();
4208 return instance_prototype();
4209}
4210
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004211
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00004212bool JSFunction::should_have_prototype() {
4213 return map()->function_with_prototype();
4214}
4215
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004216
4217bool JSFunction::is_compiled() {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00004218 return code() != GetIsolate()->builtins()->builtin(Builtins::kLazyCompile);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004219}
4220
4221
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004222FixedArray* JSFunction::literals() {
4223 ASSERT(!shared()->bound());
4224 return literals_or_bindings();
4225}
4226
4227
4228void JSFunction::set_literals(FixedArray* literals) {
4229 ASSERT(!shared()->bound());
4230 set_literals_or_bindings(literals);
4231}
4232
4233
4234FixedArray* JSFunction::function_bindings() {
4235 ASSERT(shared()->bound());
4236 return literals_or_bindings();
4237}
4238
4239
4240void JSFunction::set_function_bindings(FixedArray* bindings) {
4241 ASSERT(shared()->bound());
4242 // Bound function literal may be initialized to the empty fixed array
4243 // before the bindings are set.
4244 ASSERT(bindings == GetHeap()->empty_fixed_array() ||
4245 bindings->map() == GetHeap()->fixed_cow_array_map());
4246 set_literals_or_bindings(bindings);
4247}
4248
4249
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004250int JSFunction::NumberOfLiterals() {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004251 ASSERT(!shared()->bound());
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004252 return literals()->length();
4253}
4254
4255
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004256Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004257 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004258 return READ_FIELD(this, OffsetOfFunctionWithId(id));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004259}
4260
4261
4262void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
4263 Object* value) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004264 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004265 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004266 WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value);
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004267}
4268
4269
4270Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004271 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004272 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
4273}
4274
4275
4276void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
4277 Code* value) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004278 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004279 WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004280 ASSERT(!HEAP->InNewSpace(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004281}
4282
4283
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00004284ACCESSORS(JSProxy, handler, Object, kHandlerOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004285ACCESSORS(JSProxy, hash, Object, kHashOffset)
lrn@chromium.org34e60782011-09-15 07:25:40 +00004286ACCESSORS(JSFunctionProxy, call_trap, Object, kCallTrapOffset)
4287ACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset)
4288
4289
4290void JSProxy::InitializeBody(int object_size, Object* value) {
4291 ASSERT(!value->IsHeapObject() || !GetHeap()->InNewSpace(value));
4292 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
4293 WRITE_FIELD(this, offset, value);
4294 }
4295}
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00004296
4297
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004298ACCESSORS(JSSet, table, Object, kTableOffset)
4299ACCESSORS(JSMap, table, Object, kTableOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004300ACCESSORS(JSWeakMap, table, Object, kTableOffset)
4301ACCESSORS(JSWeakMap, next, Object, kNextOffset)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00004302
4303
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00004304Address Foreign::foreign_address() {
4305 return AddressFrom<Address>(READ_INTPTR_FIELD(this, kForeignAddressOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004306}
4307
4308
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00004309void Foreign::set_foreign_address(Address value) {
4310 WRITE_INTPTR_FIELD(this, kForeignAddressOffset, OffsetFrom(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004311}
4312
4313
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00004314ACCESSORS(JSModule, context, Object, kContextOffset)
4315
4316
4317JSModule* JSModule::cast(Object* obj) {
4318 ASSERT(obj->IsJSModule());
4319 ASSERT(HeapObject::cast(obj)->Size() == JSModule::kSize);
4320 return reinterpret_cast<JSModule*>(obj);
4321}
4322
4323
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004324ACCESSORS(JSValue, value, Object, kValueOffset)
4325
4326
4327JSValue* JSValue::cast(Object* obj) {
4328 ASSERT(obj->IsJSValue());
4329 ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize);
4330 return reinterpret_cast<JSValue*>(obj);
4331}
4332
4333
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +00004334ACCESSORS(JSDate, value, Object, kValueOffset)
4335ACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset)
4336ACCESSORS(JSDate, year, Object, kYearOffset)
4337ACCESSORS(JSDate, month, Object, kMonthOffset)
4338ACCESSORS(JSDate, day, Object, kDayOffset)
4339ACCESSORS(JSDate, weekday, Object, kWeekdayOffset)
4340ACCESSORS(JSDate, hour, Object, kHourOffset)
4341ACCESSORS(JSDate, min, Object, kMinOffset)
4342ACCESSORS(JSDate, sec, Object, kSecOffset)
4343
4344
4345JSDate* JSDate::cast(Object* obj) {
4346 ASSERT(obj->IsJSDate());
4347 ASSERT(HeapObject::cast(obj)->Size() == JSDate::kSize);
4348 return reinterpret_cast<JSDate*>(obj);
4349}
4350
4351
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00004352ACCESSORS(JSMessageObject, type, String, kTypeOffset)
4353ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
4354ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
4355ACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset)
4356ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
4357SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
4358SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
4359
4360
4361JSMessageObject* JSMessageObject::cast(Object* obj) {
4362 ASSERT(obj->IsJSMessageObject());
4363 ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize);
4364 return reinterpret_cast<JSMessageObject*>(obj);
4365}
4366
4367
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004368INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004369ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
jkummerow@chromium.org04e4f1e2011-11-14 13:36:17 +00004370ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004371ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00004372ACCESSORS(Code, type_feedback_info, Object, kTypeFeedbackInfoOffset)
yangguo@chromium.org659ceec2012-01-26 07:37:54 +00004373ACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset)
danno@chromium.org88aa0582012-03-23 15:11:57 +00004374INT_ACCESSORS(Code, ic_age, kICAgeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004375
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004376byte* Code::instruction_start() {
4377 return FIELD_ADDR(this, kHeaderSize);
4378}
4379
4380
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004381byte* Code::instruction_end() {
4382 return instruction_start() + instruction_size();
4383}
4384
4385
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004386int Code::body_size() {
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004387 return RoundUp(instruction_size(), kObjectAlignment);
4388}
4389
4390
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004391FixedArray* Code::unchecked_deoptimization_data() {
4392 return reinterpret_cast<FixedArray*>(
4393 READ_FIELD(this, kDeoptimizationDataOffset));
4394}
4395
4396
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004397ByteArray* Code::unchecked_relocation_info() {
4398 return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004399}
4400
4401
4402byte* Code::relocation_start() {
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004403 return unchecked_relocation_info()->GetDataStartAddress();
4404}
4405
4406
4407int Code::relocation_size() {
4408 return unchecked_relocation_info()->length();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004409}
4410
4411
4412byte* Code::entry() {
4413 return instruction_start();
4414}
4415
4416
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004417bool Code::contains(byte* inner_pointer) {
4418 return (address() <= inner_pointer) && (inner_pointer <= address() + Size());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004419}
4420
4421
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004422ACCESSORS(JSArray, length, Object, kLengthOffset)
4423
4424
ager@chromium.org236ad962008-09-25 09:45:57 +00004425ACCESSORS(JSRegExp, data, Object, kDataOffset)
ager@chromium.org236ad962008-09-25 09:45:57 +00004426
4427
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004428JSRegExp::Type JSRegExp::TypeTag() {
4429 Object* data = this->data();
4430 if (data->IsUndefined()) return JSRegExp::NOT_COMPILED;
4431 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
4432 return static_cast<JSRegExp::Type>(smi->value());
ager@chromium.org236ad962008-09-25 09:45:57 +00004433}
4434
4435
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004436JSRegExp::Type JSRegExp::TypeTagUnchecked() {
4437 Smi* smi = Smi::cast(DataAtUnchecked(kTagIndex));
4438 return static_cast<JSRegExp::Type>(smi->value());
4439}
4440
4441
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00004442int JSRegExp::CaptureCount() {
4443 switch (TypeTag()) {
4444 case ATOM:
4445 return 0;
4446 case IRREGEXP:
4447 return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value();
4448 default:
4449 UNREACHABLE();
4450 return -1;
4451 }
4452}
4453
4454
ager@chromium.orga74f0da2008-12-03 16:05:52 +00004455JSRegExp::Flags JSRegExp::GetFlags() {
4456 ASSERT(this->data()->IsFixedArray());
4457 Object* data = this->data();
4458 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex));
4459 return Flags(smi->value());
4460}
4461
4462
4463String* JSRegExp::Pattern() {
4464 ASSERT(this->data()->IsFixedArray());
4465 Object* data = this->data();
4466 String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex));
4467 return pattern;
4468}
4469
4470
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004471Object* JSRegExp::DataAt(int index) {
4472 ASSERT(TypeTag() != NOT_COMPILED);
4473 return FixedArray::cast(data())->get(index);
ager@chromium.org236ad962008-09-25 09:45:57 +00004474}
4475
4476
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004477Object* JSRegExp::DataAtUnchecked(int index) {
4478 FixedArray* fa = reinterpret_cast<FixedArray*>(data());
4479 int offset = FixedArray::kHeaderSize + index * kPointerSize;
4480 return READ_FIELD(fa, offset);
4481}
4482
4483
kasperl@chromium.org7be3c992009-03-12 07:19:55 +00004484void JSRegExp::SetDataAt(int index, Object* value) {
4485 ASSERT(TypeTag() != NOT_COMPILED);
4486 ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
4487 FixedArray::cast(data())->set(index, value);
4488}
4489
4490
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004491void JSRegExp::SetDataAtUnchecked(int index, Object* value, Heap* heap) {
4492 ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
4493 FixedArray* fa = reinterpret_cast<FixedArray*>(data());
4494 if (value->IsSmi()) {
4495 fa->set_unchecked(index, Smi::cast(value));
4496 } else {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004497 // We only do this during GC, so we don't need to notify the write barrier.
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004498 fa->set_unchecked(heap, index, value, SKIP_WRITE_BARRIER);
4499 }
4500}
4501
4502
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00004503ElementsKind JSObject::GetElementsKind() {
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00004504 ElementsKind kind = map()->elements_kind();
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004505#if DEBUG
4506 FixedArrayBase* fixed_array =
4507 reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset));
4508 Map* map = fixed_array->map();
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004509 ASSERT((IsFastSmiOrObjectElementsKind(kind) &&
4510 (map == GetHeap()->fixed_array_map() ||
4511 map == GetHeap()->fixed_cow_array_map())) ||
4512 (IsFastDoubleElementsKind(kind) &&
4513 (fixed_array->IsFixedDoubleArray() ||
4514 fixed_array == GetHeap()->empty_fixed_array())) ||
4515 (kind == DICTIONARY_ELEMENTS &&
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004516 fixed_array->IsFixedArray() &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004517 fixed_array->IsDictionary()) ||
4518 (kind > DICTIONARY_ELEMENTS));
4519 ASSERT((kind != NON_STRICT_ARGUMENTS_ELEMENTS) ||
4520 (elements()->IsFixedArray() && elements()->length() >= 2));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004521#endif
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00004522 return kind;
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004523}
4524
4525
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00004526ElementsAccessor* JSObject::GetElementsAccessor() {
4527 return ElementsAccessor::ForKind(GetElementsKind());
4528}
4529
4530
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004531bool JSObject::HasFastObjectElements() {
4532 return IsFastObjectElementsKind(GetElementsKind());
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004533}
4534
4535
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004536bool JSObject::HasFastSmiElements() {
4537 return IsFastSmiElementsKind(GetElementsKind());
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004538}
4539
4540
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004541bool JSObject::HasFastSmiOrObjectElements() {
4542 return IsFastSmiOrObjectElementsKind(GetElementsKind());
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004543}
4544
4545
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00004546bool JSObject::HasFastDoubleElements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004547 return IsFastDoubleElementsKind(GetElementsKind());
4548}
4549
4550
4551bool JSObject::HasFastHoleyElements() {
4552 return IsFastHoleyElementsKind(GetElementsKind());
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00004553}
4554
4555
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004556bool JSObject::HasDictionaryElements() {
4557 return GetElementsKind() == DICTIONARY_ELEMENTS;
4558}
4559
4560
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004561bool JSObject::HasNonStrictArgumentsElements() {
4562 return GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS;
4563}
4564
4565
ager@chromium.org3811b432009-10-28 14:53:37 +00004566bool JSObject::HasExternalArrayElements() {
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004567 HeapObject* array = elements();
4568 ASSERT(array != NULL);
4569 return array->IsExternalArray();
ager@chromium.org3811b432009-10-28 14:53:37 +00004570}
4571
4572
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004573#define EXTERNAL_ELEMENTS_CHECK(name, type) \
4574bool JSObject::HasExternal##name##Elements() { \
4575 HeapObject* array = elements(); \
4576 ASSERT(array != NULL); \
4577 if (!array->IsHeapObject()) \
4578 return false; \
4579 return array->map()->instance_type() == type; \
ager@chromium.org3811b432009-10-28 14:53:37 +00004580}
4581
4582
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004583EXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE)
4584EXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
4585EXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE)
4586EXTERNAL_ELEMENTS_CHECK(UnsignedShort,
4587 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
4588EXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE)
4589EXTERNAL_ELEMENTS_CHECK(UnsignedInt,
4590 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
4591EXTERNAL_ELEMENTS_CHECK(Float,
4592 EXTERNAL_FLOAT_ARRAY_TYPE)
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00004593EXTERNAL_ELEMENTS_CHECK(Double,
4594 EXTERNAL_DOUBLE_ARRAY_TYPE)
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004595EXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE)
ager@chromium.org3811b432009-10-28 14:53:37 +00004596
4597
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004598bool JSObject::HasNamedInterceptor() {
4599 return map()->has_named_interceptor();
4600}
4601
4602
4603bool JSObject::HasIndexedInterceptor() {
4604 return map()->has_indexed_interceptor();
4605}
4606
4607
lrn@chromium.org303ada72010-10-27 09:33:13 +00004608MaybeObject* JSObject::EnsureWritableFastElements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004609 ASSERT(HasFastSmiOrObjectElements());
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004610 FixedArray* elems = FixedArray::cast(elements());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004611 Isolate* isolate = GetIsolate();
4612 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems;
lrn@chromium.org303ada72010-10-27 09:33:13 +00004613 Object* writable_elems;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004614 { MaybeObject* maybe_writable_elems = isolate->heap()->CopyFixedArrayWithMap(
4615 elems, isolate->heap()->fixed_array_map());
lrn@chromium.org303ada72010-10-27 09:33:13 +00004616 if (!maybe_writable_elems->ToObject(&writable_elems)) {
4617 return maybe_writable_elems;
4618 }
4619 }
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004620 set_elements(FixedArray::cast(writable_elems));
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004621 isolate->counters()->cow_arrays_converted()->Increment();
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004622 return writable_elems;
4623}
4624
4625
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004626StringDictionary* JSObject::property_dictionary() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004627 ASSERT(!HasFastProperties());
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004628 return StringDictionary::cast(properties());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004629}
4630
4631
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004632SeededNumberDictionary* JSObject::element_dictionary() {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004633 ASSERT(HasDictionaryElements());
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004634 return SeededNumberDictionary::cast(elements());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004635}
4636
4637
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004638bool String::IsHashFieldComputed(uint32_t field) {
4639 return (field & kHashNotComputedMask) == 0;
4640}
4641
4642
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004643bool String::HasHashCode() {
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004644 return IsHashFieldComputed(hash_field());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004645}
4646
4647
4648uint32_t String::Hash() {
4649 // Fast case: has hash code already been computed?
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004650 uint32_t field = hash_field();
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004651 if (IsHashFieldComputed(field)) return field >> kHashShift;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004652 // Slow case: compute hash code and set it.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004653 return ComputeAndSetHash();
4654}
4655
4656
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004657StringHasher::StringHasher(int length, uint32_t seed)
ager@chromium.org7c537e22008-10-16 08:43:32 +00004658 : length_(length),
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004659 raw_running_hash_(seed),
ager@chromium.org7c537e22008-10-16 08:43:32 +00004660 array_index_(0),
4661 is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize),
4662 is_first_char_(true),
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004663 is_valid_(true) {
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004664 ASSERT(FLAG_randomize_hashes || raw_running_hash_ == 0);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004665}
ager@chromium.org7c537e22008-10-16 08:43:32 +00004666
4667
4668bool StringHasher::has_trivial_hash() {
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004669 return length_ > String::kMaxHashCalcLength;
ager@chromium.org7c537e22008-10-16 08:43:32 +00004670}
4671
4672
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004673void StringHasher::AddCharacter(uint32_t c) {
4674 if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
4675 AddSurrogatePair(c); // Not inlined.
4676 return;
4677 }
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004678 // Use the Jenkins one-at-a-time hash function to update the hash
4679 // for the given character.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004680 raw_running_hash_ += c;
4681 raw_running_hash_ += (raw_running_hash_ << 10);
4682 raw_running_hash_ ^= (raw_running_hash_ >> 6);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004683 // Incremental array index computation.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004684 if (is_array_index_) {
4685 if (c < '0' || c > '9') {
4686 is_array_index_ = false;
4687 } else {
4688 int d = c - '0';
4689 if (is_first_char_) {
4690 is_first_char_ = false;
4691 if (c == '0' && length_ > 1) {
4692 is_array_index_ = false;
4693 return;
4694 }
4695 }
4696 if (array_index_ > 429496729U - ((d + 2) >> 3)) {
4697 is_array_index_ = false;
4698 } else {
4699 array_index_ = array_index_ * 10 + d;
4700 }
4701 }
4702 }
4703}
4704
4705
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004706void StringHasher::AddCharacterNoIndex(uint32_t c) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00004707 ASSERT(!is_array_index());
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004708 if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
4709 AddSurrogatePairNoIndex(c); // Not inlined.
4710 return;
4711 }
ager@chromium.org7c537e22008-10-16 08:43:32 +00004712 raw_running_hash_ += c;
4713 raw_running_hash_ += (raw_running_hash_ << 10);
4714 raw_running_hash_ ^= (raw_running_hash_ >> 6);
4715}
4716
4717
4718uint32_t StringHasher::GetHash() {
ager@chromium.org3b45ab52009-03-19 22:21:34 +00004719 // Get the calculated raw hash value and do some more bit ops to distribute
4720 // the hash further. Ensure that we never return zero as the hash value.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004721 uint32_t result = raw_running_hash_;
4722 result += (result << 3);
4723 result ^= (result >> 11);
4724 result += (result << 15);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004725 if ((result & String::kHashBitMask) == 0) {
ager@chromium.org3b45ab52009-03-19 22:21:34 +00004726 result = 27;
4727 }
ager@chromium.org7c537e22008-10-16 08:43:32 +00004728 return result;
4729}
4730
4731
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00004732template <typename schar>
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004733uint32_t HashSequentialString(const schar* chars, int length, uint32_t seed) {
4734 StringHasher hasher(length, seed);
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00004735 if (!hasher.has_trivial_hash()) {
4736 int i;
4737 for (i = 0; hasher.is_array_index() && (i < length); i++) {
4738 hasher.AddCharacter(chars[i]);
4739 }
4740 for (; i < length; i++) {
4741 hasher.AddCharacterNoIndex(chars[i]);
4742 }
4743 }
4744 return hasher.GetHashField();
4745}
4746
4747
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004748bool String::AsArrayIndex(uint32_t* index) {
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004749 uint32_t field = hash_field();
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00004750 if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) {
4751 return false;
4752 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004753 return SlowAsArrayIndex(index);
4754}
4755
4756
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00004757Object* JSReceiver::GetPrototype() {
4758 return HeapObject::cast(this)->map()->prototype();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004759}
4760
4761
rossberg@chromium.org717967f2011-07-20 13:44:42 +00004762bool JSReceiver::HasProperty(String* name) {
4763 if (IsJSProxy()) {
4764 return JSProxy::cast(this)->HasPropertyWithHandler(name);
4765 }
4766 return GetPropertyAttribute(name) != ABSENT;
4767}
4768
4769
4770bool JSReceiver::HasLocalProperty(String* name) {
4771 if (IsJSProxy()) {
4772 return JSProxy::cast(this)->HasPropertyWithHandler(name);
4773 }
4774 return GetLocalPropertyAttribute(name) != ABSENT;
4775}
4776
4777
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00004778PropertyAttributes JSReceiver::GetPropertyAttribute(String* key) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004779 return GetPropertyAttributeWithReceiver(this, key);
4780}
4781
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004782// TODO(504): this may be useful in other places too where JSGlobalProxy
4783// is used.
4784Object* JSObject::BypassGlobalProxy() {
4785 if (IsJSGlobalProxy()) {
4786 Object* proto = GetPrototype();
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004787 if (proto->IsNull()) return GetHeap()->undefined_value();
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004788 ASSERT(proto->IsJSGlobalObject());
4789 return proto;
4790 }
4791 return this;
4792}
4793
4794
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004795MaybeObject* JSReceiver::GetIdentityHash(CreationFlag flag) {
4796 return IsJSProxy()
4797 ? JSProxy::cast(this)->GetIdentityHash(flag)
4798 : JSObject::cast(this)->GetIdentityHash(flag);
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004799}
4800
4801
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004802bool JSReceiver::HasElement(uint32_t index) {
4803 if (IsJSProxy()) {
4804 return JSProxy::cast(this)->HasElementWithHandler(index);
4805 }
4806 return JSObject::cast(this)->HasElementWithReceiver(this, index);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004807}
4808
4809
4810bool AccessorInfo::all_can_read() {
4811 return BooleanBit::get(flag(), kAllCanReadBit);
4812}
4813
4814
4815void AccessorInfo::set_all_can_read(bool value) {
4816 set_flag(BooleanBit::set(flag(), kAllCanReadBit, value));
4817}
4818
4819
4820bool AccessorInfo::all_can_write() {
4821 return BooleanBit::get(flag(), kAllCanWriteBit);
4822}
4823
4824
4825void AccessorInfo::set_all_can_write(bool value) {
4826 set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value));
4827}
4828
4829
ager@chromium.org870a0b62008-11-04 11:43:05 +00004830bool AccessorInfo::prohibits_overwriting() {
4831 return BooleanBit::get(flag(), kProhibitsOverwritingBit);
4832}
4833
4834
4835void AccessorInfo::set_prohibits_overwriting(bool value) {
4836 set_flag(BooleanBit::set(flag(), kProhibitsOverwritingBit, value));
4837}
4838
4839
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004840PropertyAttributes AccessorInfo::property_attributes() {
4841 return AttributesField::decode(static_cast<uint32_t>(flag()->value()));
4842}
4843
4844
4845void AccessorInfo::set_property_attributes(PropertyAttributes attributes) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00004846 set_flag(Smi::FromInt(AttributesField::update(flag()->value(), attributes)));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004847}
4848
karlklose@chromium.org44bc7082011-04-11 12:33:05 +00004849
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004850bool AccessorInfo::IsCompatibleReceiver(Object* receiver) {
4851 Object* function_template = expected_receiver_type();
4852 if (!function_template->IsFunctionTemplateInfo()) return true;
4853 return receiver->IsInstanceOf(FunctionTemplateInfo::cast(function_template));
4854}
4855
4856
karlklose@chromium.org44bc7082011-04-11 12:33:05 +00004857template<typename Shape, typename Key>
4858void Dictionary<Shape, Key>::SetEntry(int entry,
4859 Object* key,
4860 Object* value) {
4861 SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
4862}
4863
4864
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004865template<typename Shape, typename Key>
4866void Dictionary<Shape, Key>::SetEntry(int entry,
4867 Object* key,
4868 Object* value,
4869 PropertyDetails details) {
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00004870 ASSERT(!key->IsString() || details.IsDeleted() || details.index() > 0);
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004871 int index = HashTable<Shape, Key>::EntryToIndex(entry);
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004872 AssertNoAllocation no_gc;
4873 WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004874 FixedArray::set(index, key, mode);
4875 FixedArray::set(index+1, value, mode);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004876 FixedArray::set(index+2, details.AsSmi());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004877}
4878
4879
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004880bool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
4881 ASSERT(other->IsNumber());
4882 return key == static_cast<uint32_t>(other->Number());
4883}
4884
4885
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004886uint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) {
4887 return ComputeIntegerHash(key, 0);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004888}
4889
4890
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004891uint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key,
4892 Object* other) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004893 ASSERT(other->IsNumber());
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004894 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004895}
4896
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004897uint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) {
4898 return ComputeIntegerHash(key, seed);
4899}
4900
4901uint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key,
4902 uint32_t seed,
4903 Object* other) {
4904 ASSERT(other->IsNumber());
4905 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed);
4906}
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004907
4908MaybeObject* NumberDictionaryShape::AsObject(uint32_t key) {
4909 return Isolate::Current()->heap()->NumberFromUint32(key);
4910}
4911
4912
4913bool StringDictionaryShape::IsMatch(String* key, Object* other) {
4914 // We know that all entries in a hash table had their hash keys created.
4915 // Use that knowledge to have fast failure.
4916 if (key->Hash() != String::cast(other)->Hash()) return false;
4917 return key->Equals(String::cast(other));
4918}
4919
4920
4921uint32_t StringDictionaryShape::Hash(String* key) {
4922 return key->Hash();
4923}
4924
4925
4926uint32_t StringDictionaryShape::HashForObject(String* key, Object* other) {
4927 return String::cast(other)->Hash();
4928}
4929
4930
4931MaybeObject* StringDictionaryShape::AsObject(String* key) {
4932 return key;
4933}
4934
4935
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004936template <int entrysize>
4937bool ObjectHashTableShape<entrysize>::IsMatch(Object* key, Object* other) {
4938 return key->SameValue(other);
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004939}
4940
4941
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004942template <int entrysize>
4943uint32_t ObjectHashTableShape<entrysize>::Hash(Object* key) {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004944 MaybeObject* maybe_hash = key->GetHash(OMIT_CREATION);
4945 return Smi::cast(maybe_hash->ToObjectChecked())->value();
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004946}
4947
4948
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004949template <int entrysize>
4950uint32_t ObjectHashTableShape<entrysize>::HashForObject(Object* key,
4951 Object* other) {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004952 MaybeObject* maybe_hash = other->GetHash(OMIT_CREATION);
4953 return Smi::cast(maybe_hash->ToObjectChecked())->value();
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004954}
4955
4956
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004957template <int entrysize>
4958MaybeObject* ObjectHashTableShape<entrysize>::AsObject(Object* key) {
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004959 return key;
4960}
4961
4962
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004963void Map::ClearCodeCache(Heap* heap) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004964 // No write barrier is needed since empty_fixed_array is not in new space.
4965 // Please note this function is used during marking:
4966 // - MarkCompactCollector::MarkUnmarkedObject
danno@chromium.org88aa0582012-03-23 15:11:57 +00004967 // - IncrementalMarking::Step
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004968 ASSERT(!heap->InNewSpace(heap->raw_unchecked_empty_fixed_array()));
4969 WRITE_FIELD(this, kCodeCacheOffset, heap->raw_unchecked_empty_fixed_array());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004970}
4971
4972
ager@chromium.org5aa501c2009-06-23 07:57:28 +00004973void JSArray::EnsureSize(int required_size) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004974 ASSERT(HasFastSmiOrObjectElements());
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004975 FixedArray* elts = FixedArray::cast(elements());
ager@chromium.org6141cbe2009-11-20 12:14:52 +00004976 const int kArraySizeThatFitsComfortablyInNewSpace = 128;
4977 if (elts->length() < required_size) {
4978 // Doubling in size would be overkill, but leave some slack to avoid
4979 // constantly growing.
4980 Expand(required_size + (required_size >> 3));
4981 // It's a performance benefit to keep a frequently used array in new-space.
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004982 } else if (!GetHeap()->new_space()->Contains(elts) &&
ager@chromium.org6141cbe2009-11-20 12:14:52 +00004983 required_size < kArraySizeThatFitsComfortablyInNewSpace) {
4984 // Expand will allocate a new backing store in new space even if the size
4985 // we asked for isn't larger than what we had before.
4986 Expand(required_size);
4987 }
ager@chromium.org5aa501c2009-06-23 07:57:28 +00004988}
4989
4990
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004991void JSArray::set_length(Smi* length) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004992 // Don't need a write barrier for a Smi.
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004993 set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
4994}
4995
4996
ricow@chromium.org7ad65222011-12-19 12:13:11 +00004997bool JSArray::AllowsSetElementsLength() {
4998 bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray();
4999 ASSERT(result == !HasExternalArrayElements());
5000 return result;
5001}
5002
5003
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005004MaybeObject* JSArray::SetContent(FixedArrayBase* storage) {
5005 MaybeObject* maybe_result = EnsureCanContainElements(
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00005006 storage, storage->length(), ALLOW_COPIED_DOUBLE_ELEMENTS);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005007 if (maybe_result->IsFailure()) return maybe_result;
5008 ASSERT((storage->map() == GetHeap()->fixed_double_array_map() &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00005009 IsFastDoubleElementsKind(GetElementsKind())) ||
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005010 ((storage->map() != GetHeap()->fixed_double_array_map()) &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00005011 (IsFastObjectElementsKind(GetElementsKind()) ||
5012 (IsFastSmiElementsKind(GetElementsKind()) &&
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005013 FixedArray::cast(storage)->ContainsOnlySmisOrHoles()))));
ager@chromium.org7c537e22008-10-16 08:43:32 +00005014 set_elements(storage);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005015 set_length(Smi::FromInt(storage->length()));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00005016 return this;
ager@chromium.org7c537e22008-10-16 08:43:32 +00005017}
5018
5019
lrn@chromium.org303ada72010-10-27 09:33:13 +00005020MaybeObject* FixedArray::Copy() {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005021 if (length() == 0) return this;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00005022 return GetHeap()->CopyFixedArray(this);
5023}
5024
5025
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00005026MaybeObject* FixedDoubleArray::Copy() {
5027 if (length() == 0) return this;
5028 return GetHeap()->CopyFixedDoubleArray(this);
5029}
5030
5031
danno@chromium.orgfa458e42012-02-01 10:48:36 +00005032void TypeFeedbackCells::SetAstId(int index, Smi* id) {
5033 set(1 + index * 2, id);
5034}
5035
5036
5037Smi* TypeFeedbackCells::AstId(int index) {
5038 return Smi::cast(get(1 + index * 2));
5039}
5040
5041
5042void TypeFeedbackCells::SetCell(int index, JSGlobalPropertyCell* cell) {
5043 set(index * 2, cell);
5044}
5045
5046
5047JSGlobalPropertyCell* TypeFeedbackCells::Cell(int index) {
5048 return JSGlobalPropertyCell::cast(get(index * 2));
5049}
5050
5051
5052Handle<Object> TypeFeedbackCells::UninitializedSentinel(Isolate* isolate) {
5053 return isolate->factory()->the_hole_value();
5054}
5055
5056
5057Handle<Object> TypeFeedbackCells::MegamorphicSentinel(Isolate* isolate) {
5058 return isolate->factory()->undefined_value();
5059}
5060
5061
5062Object* TypeFeedbackCells::RawUninitializedSentinel(Heap* heap) {
5063 return heap->raw_unchecked_the_hole_value();
5064}
5065
5066
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00005067SMI_ACCESSORS(TypeFeedbackInfo, ic_total_count, kIcTotalCountOffset)
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00005068SMI_ACCESSORS(TypeFeedbackInfo, ic_with_type_info_count,
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00005069 kIcWithTypeinfoCountOffset)
5070ACCESSORS(TypeFeedbackInfo, type_feedback_cells, TypeFeedbackCells,
5071 kTypeFeedbackCellsOffset)
5072
5073
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00005074SMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot)
5075
5076
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00005077Relocatable::Relocatable(Isolate* isolate) {
5078 ASSERT(isolate == Isolate::Current());
5079 isolate_ = isolate;
5080 prev_ = isolate->relocatable_top();
5081 isolate->set_relocatable_top(this);
5082}
5083
5084
5085Relocatable::~Relocatable() {
5086 ASSERT(isolate_ == Isolate::Current());
5087 ASSERT_EQ(isolate_->relocatable_top(), this);
5088 isolate_->set_relocatable_top(prev_);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005089}
5090
5091
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005092int JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) {
5093 return map->instance_size();
5094}
5095
5096
ager@chromium.orgea91cc52011-05-23 06:06:11 +00005097void Foreign::ForeignIterateBody(ObjectVisitor* v) {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005098 v->VisitExternalReference(
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00005099 reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005100}
5101
5102
5103template<typename StaticVisitor>
ager@chromium.orgea91cc52011-05-23 06:06:11 +00005104void Foreign::ForeignIterateBody() {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005105 StaticVisitor::VisitExternalReference(
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00005106 reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005107}
5108
5109
5110void ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) {
5111 typedef v8::String::ExternalAsciiStringResource Resource;
5112 v->VisitExternalAsciiString(
5113 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5114}
5115
5116
5117template<typename StaticVisitor>
5118void ExternalAsciiString::ExternalAsciiStringIterateBody() {
5119 typedef v8::String::ExternalAsciiStringResource Resource;
5120 StaticVisitor::VisitExternalAsciiString(
5121 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5122}
5123
5124
5125void ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) {
5126 typedef v8::String::ExternalStringResource Resource;
5127 v->VisitExternalTwoByteString(
5128 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5129}
5130
5131
5132template<typename StaticVisitor>
5133void ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
5134 typedef v8::String::ExternalStringResource Resource;
5135 StaticVisitor::VisitExternalTwoByteString(
5136 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5137}
5138
5139#define SLOT_ADDR(obj, offset) \
5140 reinterpret_cast<Object**>((obj)->address() + offset)
5141
5142template<int start_offset, int end_offset, int size>
5143void FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody(
5144 HeapObject* obj,
5145 ObjectVisitor* v) {
5146 v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, end_offset));
5147}
5148
5149
5150template<int start_offset>
5151void FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj,
5152 int object_size,
5153 ObjectVisitor* v) {
5154 v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, object_size));
5155}
5156
5157#undef SLOT_ADDR
5158
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005159#undef TYPE_CHECKER
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005160#undef CAST_ACCESSOR
5161#undef INT_ACCESSORS
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005162#undef ACCESSORS
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005163#undef ACCESSORS_TO_SMI
5164#undef SMI_ACCESSORS
5165#undef BOOL_GETTER
5166#undef BOOL_ACCESSORS
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005167#undef FIELD_ADDR
5168#undef READ_FIELD
5169#undef WRITE_FIELD
5170#undef WRITE_BARRIER
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005171#undef CONDITIONAL_WRITE_BARRIER
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005172#undef READ_DOUBLE_FIELD
5173#undef WRITE_DOUBLE_FIELD
5174#undef READ_INT_FIELD
5175#undef WRITE_INT_FIELD
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005176#undef READ_INTPTR_FIELD
5177#undef WRITE_INTPTR_FIELD
5178#undef READ_UINT32_FIELD
5179#undef WRITE_UINT32_FIELD
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005180#undef READ_SHORT_FIELD
5181#undef WRITE_SHORT_FIELD
5182#undef READ_BYTE_FIELD
5183#undef WRITE_BYTE_FIELD
5184
5185
5186} } // namespace v8::internal
5187
5188#endif // V8_OBJECTS_INL_H_