blob: 4f66af28aa7506870f9e54e9b97a7fd5f7ffe3a1 [file] [log] [blame]
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001// Copyright 2012 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27//
28// Review notes:
29//
ager@chromium.org32912102009-01-16 10:38:43 +000030// - The use of macros in these inline functions may seem superfluous
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000031// but it is absolutely needed to make sure gcc generates optimal
32// code. gcc is not happy when attempting to inline too deep.
33//
34
35#ifndef V8_OBJECTS_INL_H_
36#define V8_OBJECTS_INL_H_
37
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +000038#include "elements.h"
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +000039#include "objects.h"
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000040#include "contexts.h"
41#include "conversions-inl.h"
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +000042#include "heap.h"
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000043#include "isolate.h"
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000044#include "property.h"
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +000045#include "spaces.h"
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000046#include "store-buffer.h"
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +000047#include "v8memory.h"
danno@chromium.orgfa458e42012-02-01 10:48:36 +000048#include "factory.h"
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000049#include "incremental-marking.h"
50
kasperl@chromium.org71affb52009-05-26 05:44:31 +000051namespace v8 {
52namespace internal {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000053
54PropertyDetails::PropertyDetails(Smi* smi) {
55 value_ = smi->value();
56}
57
58
59Smi* PropertyDetails::AsSmi() {
60 return Smi::FromInt(value_);
61}
62
63
kasperl@chromium.org2abc4502009-07-02 07:00:29 +000064PropertyDetails PropertyDetails::AsDeleted() {
ager@chromium.org378b34e2011-01-28 08:04:38 +000065 Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
kasperl@chromium.org2abc4502009-07-02 07:00:29 +000066 return PropertyDetails(smi);
67}
68
69
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +000070#define TYPE_CHECKER(type, instancetype) \
71 bool Object::Is##type() { \
72 return Object::IsHeapObject() && \
73 HeapObject::cast(this)->map()->instance_type() == instancetype; \
74 }
75
76
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000077#define CAST_ACCESSOR(type) \
78 type* type::cast(Object* object) { \
79 ASSERT(object->Is##type()); \
80 return reinterpret_cast<type*>(object); \
81 }
82
83
84#define INT_ACCESSORS(holder, name, offset) \
85 int holder::name() { return READ_INT_FIELD(this, offset); } \
86 void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); }
87
88
89#define ACCESSORS(holder, name, type, offset) \
90 type* holder::name() { return type::cast(READ_FIELD(this, offset)); } \
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +000091 void holder::set_##name(type* value, WriteBarrierMode mode) { \
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000092 WRITE_FIELD(this, offset, value); \
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +000093 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); \
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000094 }
95
96
rossberg@chromium.org2c067b12012-03-19 11:01:52 +000097// Getter that returns a tagged Smi and setter that writes a tagged Smi.
98#define ACCESSORS_TO_SMI(holder, name, offset) \
99 Smi* holder::name() { return Smi::cast(READ_FIELD(this, offset)); } \
100 void holder::set_##name(Smi* value, WriteBarrierMode mode) { \
101 WRITE_FIELD(this, offset, value); \
102 }
103
104
105// Getter that returns a Smi as an int and writes an int as a Smi.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000106#define SMI_ACCESSORS(holder, name, offset) \
107 int holder::name() { \
108 Object* value = READ_FIELD(this, offset); \
109 return Smi::cast(value)->value(); \
110 } \
111 void holder::set_##name(int value) { \
112 WRITE_FIELD(this, offset, Smi::FromInt(value)); \
113 }
114
115
sgjesse@chromium.org911335c2009-08-19 12:59:44 +0000116#define BOOL_GETTER(holder, field, name, offset) \
117 bool holder::name() { \
118 return BooleanBit::get(field(), offset); \
119 } \
120
121
122#define BOOL_ACCESSORS(holder, field, name, offset) \
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000123 bool holder::name() { \
124 return BooleanBit::get(field(), offset); \
125 } \
126 void holder::set_##name(bool value) { \
127 set_##field(BooleanBit::set(field(), offset, value)); \
128 }
129
130
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000131bool Object::IsFixedArrayBase() {
132 return IsFixedArray() || IsFixedDoubleArray();
133}
134
135
sgjesse@chromium.org900d3b72009-08-07 11:24:25 +0000136bool Object::IsInstanceOf(FunctionTemplateInfo* expected) {
137 // There is a constraint on the object; check.
138 if (!this->IsJSObject()) return false;
139 // Fetch the constructor function of the object.
140 Object* cons_obj = JSObject::cast(this)->map()->constructor();
141 if (!cons_obj->IsJSFunction()) return false;
142 JSFunction* fun = JSFunction::cast(cons_obj);
143 // Iterate through the chain of inheriting function templates to
144 // see if the required one occurs.
145 for (Object* type = fun->shared()->function_data();
146 type->IsFunctionTemplateInfo();
147 type = FunctionTemplateInfo::cast(type)->parent_template()) {
148 if (type == expected) return true;
149 }
150 // Didn't find the required type in the inheritance chain.
151 return false;
152}
153
154
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000155bool Object::IsSmi() {
156 return HAS_SMI_TAG(this);
157}
158
159
160bool Object::IsHeapObject() {
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000161 return Internals::HasHeapObjectTag(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000162}
163
164
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000165bool Object::NonFailureIsHeapObject() {
166 ASSERT(!this->IsFailure());
167 return (reinterpret_cast<intptr_t>(this) & kSmiTagMask) != 0;
168}
169
170
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000171TYPE_CHECKER(HeapNumber, HEAP_NUMBER_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000172
173
174bool Object::IsString() {
175 return Object::IsHeapObject()
176 && HeapObject::cast(this)->map()->instance_type() < FIRST_NONSTRING_TYPE;
177}
178
179
ricow@chromium.org9fa09672011-07-25 11:05:35 +0000180bool Object::IsSpecObject() {
181 return Object::IsHeapObject()
182 && HeapObject::cast(this)->map()->instance_type() >= FIRST_SPEC_OBJECT_TYPE;
183}
184
185
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000186bool Object::IsSpecFunction() {
187 if (!Object::IsHeapObject()) return false;
188 InstanceType type = HeapObject::cast(this)->map()->instance_type();
189 return type == JS_FUNCTION_TYPE || type == JS_FUNCTION_PROXY_TYPE;
190}
191
192
ager@chromium.org870a0b62008-11-04 11:43:05 +0000193bool Object::IsSymbol() {
194 if (!this->IsHeapObject()) return false;
195 uint32_t type = HeapObject::cast(this)->map()->instance_type();
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000196 // Because the symbol tag is non-zero and no non-string types have the
197 // symbol bit set we can test for symbols with a very simple test
198 // operation.
yangguo@chromium.org80c42ed2011-08-31 09:03:56 +0000199 STATIC_ASSERT(kSymbolTag != 0);
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000200 ASSERT(kNotStringTag + kIsSymbolMask > LAST_TYPE);
201 return (type & kIsSymbolMask) != 0;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000202}
203
204
205bool Object::IsConsString() {
ricow@chromium.org4668a2c2011-08-29 10:41:00 +0000206 if (!IsString()) return false;
207 return StringShape(String::cast(this)).IsCons();
208}
209
210
211bool Object::IsSlicedString() {
212 if (!IsString()) return false;
213 return StringShape(String::cast(this)).IsSliced();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000214}
215
216
ager@chromium.org870a0b62008-11-04 11:43:05 +0000217bool Object::IsSeqString() {
218 if (!IsString()) return false;
219 return StringShape(String::cast(this)).IsSequential();
220}
221
222
223bool Object::IsSeqAsciiString() {
224 if (!IsString()) return false;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000225 return StringShape(String::cast(this)).IsSequential() &&
ager@chromium.org5ec48922009-05-05 07:25:34 +0000226 String::cast(this)->IsAsciiRepresentation();
ager@chromium.org870a0b62008-11-04 11:43:05 +0000227}
228
229
230bool Object::IsSeqTwoByteString() {
231 if (!IsString()) return false;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000232 return StringShape(String::cast(this)).IsSequential() &&
ager@chromium.org5ec48922009-05-05 07:25:34 +0000233 String::cast(this)->IsTwoByteRepresentation();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000234}
235
236
237bool Object::IsExternalString() {
ager@chromium.org870a0b62008-11-04 11:43:05 +0000238 if (!IsString()) return false;
239 return StringShape(String::cast(this)).IsExternal();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000240}
241
242
243bool Object::IsExternalAsciiString() {
ager@chromium.org870a0b62008-11-04 11:43:05 +0000244 if (!IsString()) return false;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000245 return StringShape(String::cast(this)).IsExternal() &&
ager@chromium.org5ec48922009-05-05 07:25:34 +0000246 String::cast(this)->IsAsciiRepresentation();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000247}
248
249
250bool Object::IsExternalTwoByteString() {
ager@chromium.org870a0b62008-11-04 11:43:05 +0000251 if (!IsString()) return false;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000252 return StringShape(String::cast(this)).IsExternal() &&
ager@chromium.org5ec48922009-05-05 07:25:34 +0000253 String::cast(this)->IsTwoByteRepresentation();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000254}
255
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000256bool Object::HasValidElements() {
257 // Dictionary is covered under FixedArray.
258 return IsFixedArray() || IsFixedDoubleArray() || IsExternalArray();
259}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000260
ager@chromium.org870a0b62008-11-04 11:43:05 +0000261StringShape::StringShape(String* str)
262 : type_(str->map()->instance_type()) {
263 set_valid();
264 ASSERT((type_ & kIsNotStringMask) == kStringTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000265}
266
267
ager@chromium.org870a0b62008-11-04 11:43:05 +0000268StringShape::StringShape(Map* map)
269 : type_(map->instance_type()) {
270 set_valid();
271 ASSERT((type_ & kIsNotStringMask) == kStringTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000272}
273
274
ager@chromium.org870a0b62008-11-04 11:43:05 +0000275StringShape::StringShape(InstanceType t)
276 : type_(static_cast<uint32_t>(t)) {
277 set_valid();
278 ASSERT((type_ & kIsNotStringMask) == kStringTag);
279}
280
281
282bool StringShape::IsSymbol() {
283 ASSERT(valid());
yangguo@chromium.org80c42ed2011-08-31 09:03:56 +0000284 STATIC_ASSERT(kSymbolTag != 0);
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000285 return (type_ & kIsSymbolMask) != 0;
ager@chromium.org870a0b62008-11-04 11:43:05 +0000286}
287
288
ager@chromium.org5ec48922009-05-05 07:25:34 +0000289bool String::IsAsciiRepresentation() {
290 uint32_t type = map()->instance_type();
ager@chromium.org5ec48922009-05-05 07:25:34 +0000291 return (type & kStringEncodingMask) == kAsciiStringTag;
ager@chromium.org870a0b62008-11-04 11:43:05 +0000292}
293
294
ager@chromium.org5ec48922009-05-05 07:25:34 +0000295bool String::IsTwoByteRepresentation() {
296 uint32_t type = map()->instance_type();
ager@chromium.org5ec48922009-05-05 07:25:34 +0000297 return (type & kStringEncodingMask) == kTwoByteStringTag;
ager@chromium.org870a0b62008-11-04 11:43:05 +0000298}
299
300
ricow@chromium.org4668a2c2011-08-29 10:41:00 +0000301bool String::IsAsciiRepresentationUnderneath() {
302 uint32_t type = map()->instance_type();
303 STATIC_ASSERT(kIsIndirectStringTag != 0);
304 STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
305 ASSERT(IsFlat());
306 switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
307 case kAsciiStringTag:
308 return true;
309 case kTwoByteStringTag:
310 return false;
311 default: // Cons or sliced string. Need to go deeper.
312 return GetUnderlying()->IsAsciiRepresentation();
313 }
314}
315
316
317bool String::IsTwoByteRepresentationUnderneath() {
318 uint32_t type = map()->instance_type();
319 STATIC_ASSERT(kIsIndirectStringTag != 0);
320 STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
321 ASSERT(IsFlat());
322 switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
323 case kAsciiStringTag:
324 return false;
325 case kTwoByteStringTag:
326 return true;
327 default: // Cons or sliced string. Need to go deeper.
328 return GetUnderlying()->IsTwoByteRepresentation();
329 }
330}
331
332
ricow@chromium.org5ad5ace2010-06-23 09:06:43 +0000333bool String::HasOnlyAsciiChars() {
334 uint32_t type = map()->instance_type();
335 return (type & kStringEncodingMask) == kAsciiStringTag ||
336 (type & kAsciiDataHintMask) == kAsciiDataHintTag;
ricow@chromium.orgaa1b6162010-03-29 07:44:58 +0000337}
338
339
ager@chromium.org870a0b62008-11-04 11:43:05 +0000340bool StringShape::IsCons() {
341 return (type_ & kStringRepresentationMask) == kConsStringTag;
342}
343
344
ricow@chromium.org4668a2c2011-08-29 10:41:00 +0000345bool StringShape::IsSliced() {
346 return (type_ & kStringRepresentationMask) == kSlicedStringTag;
347}
348
349
350bool StringShape::IsIndirect() {
351 return (type_ & kIsIndirectStringMask) == kIsIndirectStringTag;
352}
353
354
ager@chromium.org870a0b62008-11-04 11:43:05 +0000355bool StringShape::IsExternal() {
356 return (type_ & kStringRepresentationMask) == kExternalStringTag;
357}
358
359
360bool StringShape::IsSequential() {
361 return (type_ & kStringRepresentationMask) == kSeqStringTag;
362}
363
364
365StringRepresentationTag StringShape::representation_tag() {
366 uint32_t tag = (type_ & kStringRepresentationMask);
367 return static_cast<StringRepresentationTag>(tag);
368}
369
370
ricow@chromium.orgddd545c2011-08-24 12:02:41 +0000371uint32_t StringShape::encoding_tag() {
372 return type_ & kStringEncodingMask;
373}
374
375
ager@chromium.org870a0b62008-11-04 11:43:05 +0000376uint32_t StringShape::full_representation_tag() {
377 return (type_ & (kStringRepresentationMask | kStringEncodingMask));
378}
379
380
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000381STATIC_CHECK((kStringRepresentationMask | kStringEncodingMask) ==
382 Internals::kFullStringRepresentationMask);
383
384
ager@chromium.org870a0b62008-11-04 11:43:05 +0000385bool StringShape::IsSequentialAscii() {
386 return full_representation_tag() == (kSeqStringTag | kAsciiStringTag);
387}
388
389
390bool StringShape::IsSequentialTwoByte() {
ager@chromium.org80787b72009-04-17 10:24:24 +0000391 return full_representation_tag() == (kSeqStringTag | kTwoByteStringTag);
ager@chromium.org870a0b62008-11-04 11:43:05 +0000392}
393
394
395bool StringShape::IsExternalAscii() {
396 return full_representation_tag() == (kExternalStringTag | kAsciiStringTag);
397}
398
399
400bool StringShape::IsExternalTwoByte() {
ager@chromium.org80787b72009-04-17 10:24:24 +0000401 return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000402}
403
404
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000405STATIC_CHECK((kExternalStringTag | kTwoByteStringTag) ==
406 Internals::kExternalTwoByteRepresentationTag);
407
408
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000409uc32 FlatStringReader::Get(int index) {
410 ASSERT(0 <= index && index <= length_);
411 if (is_ascii_) {
412 return static_cast<const byte*>(start_)[index];
413 } else {
414 return static_cast<const uc16*>(start_)[index];
415 }
416}
417
418
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000419bool Object::IsNumber() {
420 return IsSmi() || IsHeapNumber();
421}
422
423
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000424TYPE_CHECKER(ByteArray, BYTE_ARRAY_TYPE)
425TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000426
427
428bool Object::IsFiller() {
429 if (!Object::IsHeapObject()) return false;
430 InstanceType instance_type = HeapObject::cast(this)->map()->instance_type();
431 return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE;
432}
433
434
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000435TYPE_CHECKER(ExternalPixelArray, EXTERNAL_PIXEL_ARRAY_TYPE)
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +0000436
437
ager@chromium.org3811b432009-10-28 14:53:37 +0000438bool Object::IsExternalArray() {
439 if (!Object::IsHeapObject())
440 return false;
441 InstanceType instance_type =
442 HeapObject::cast(this)->map()->instance_type();
fschneider@chromium.org0c20e672010-01-14 15:28:53 +0000443 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE &&
444 instance_type <= LAST_EXTERNAL_ARRAY_TYPE);
ager@chromium.org3811b432009-10-28 14:53:37 +0000445}
446
447
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000448TYPE_CHECKER(ExternalByteArray, EXTERNAL_BYTE_ARRAY_TYPE)
449TYPE_CHECKER(ExternalUnsignedByteArray, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
450TYPE_CHECKER(ExternalShortArray, EXTERNAL_SHORT_ARRAY_TYPE)
451TYPE_CHECKER(ExternalUnsignedShortArray, EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
452TYPE_CHECKER(ExternalIntArray, EXTERNAL_INT_ARRAY_TYPE)
453TYPE_CHECKER(ExternalUnsignedIntArray, EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
454TYPE_CHECKER(ExternalFloatArray, EXTERNAL_FLOAT_ARRAY_TYPE)
455TYPE_CHECKER(ExternalDoubleArray, EXTERNAL_DOUBLE_ARRAY_TYPE)
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +0000456
457
lrn@chromium.org303ada72010-10-27 09:33:13 +0000458bool MaybeObject::IsFailure() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000459 return HAS_FAILURE_TAG(this);
460}
461
462
lrn@chromium.org303ada72010-10-27 09:33:13 +0000463bool MaybeObject::IsRetryAfterGC() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000464 return HAS_FAILURE_TAG(this)
465 && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC;
466}
467
468
lrn@chromium.org303ada72010-10-27 09:33:13 +0000469bool MaybeObject::IsOutOfMemory() {
ager@chromium.org7c537e22008-10-16 08:43:32 +0000470 return HAS_FAILURE_TAG(this)
kmillikin@chromium.org31b12772011-02-02 16:08:26 +0000471 && Failure::cast(this)->IsOutOfMemoryException();
ager@chromium.org7c537e22008-10-16 08:43:32 +0000472}
473
474
lrn@chromium.org303ada72010-10-27 09:33:13 +0000475bool MaybeObject::IsException() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000476 return this == Failure::Exception();
477}
478
479
lrn@chromium.org303ada72010-10-27 09:33:13 +0000480bool MaybeObject::IsTheHole() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000481 return !IsFailure() && ToObjectUnchecked()->IsTheHole();
lrn@chromium.org303ada72010-10-27 09:33:13 +0000482}
483
484
485Failure* Failure::cast(MaybeObject* obj) {
486 ASSERT(HAS_FAILURE_TAG(obj));
487 return reinterpret_cast<Failure*>(obj);
488}
489
490
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000491bool Object::IsJSReceiver() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000492 STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE);
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000493 return IsHeapObject() &&
494 HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_RECEIVER_TYPE;
495}
496
497
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000498bool Object::IsJSObject() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000499 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE);
500 return IsHeapObject() &&
501 HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000502}
503
504
505bool Object::IsJSProxy() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000506 if (!Object::IsHeapObject()) return false;
507 InstanceType type = HeapObject::cast(this)->map()->instance_type();
508 return FIRST_JS_PROXY_TYPE <= type && type <= LAST_JS_PROXY_TYPE;
ricow@chromium.orgd2be9012011-06-01 06:00:58 +0000509}
510
511
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000512TYPE_CHECKER(JSFunctionProxy, JS_FUNCTION_PROXY_TYPE)
513TYPE_CHECKER(JSSet, JS_SET_TYPE)
514TYPE_CHECKER(JSMap, JS_MAP_TYPE)
515TYPE_CHECKER(JSWeakMap, JS_WEAK_MAP_TYPE)
516TYPE_CHECKER(JSContextExtensionObject, JS_CONTEXT_EXTENSION_OBJECT_TYPE)
517TYPE_CHECKER(Map, MAP_TYPE)
518TYPE_CHECKER(FixedArray, FIXED_ARRAY_TYPE)
519TYPE_CHECKER(FixedDoubleArray, FIXED_DOUBLE_ARRAY_TYPE)
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000520
521
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000522bool Object::IsDescriptorArray() {
523 return IsFixedArray();
524}
525
526
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000527bool Object::IsDeoptimizationInputData() {
528 // Must be a fixed array.
529 if (!IsFixedArray()) return false;
530
531 // There's no sure way to detect the difference between a fixed array and
532 // a deoptimization data array. Since this is used for asserts we can
533 // check that the length is zero or else the fixed size plus a multiple of
534 // the entry size.
535 int length = FixedArray::cast(this)->length();
536 if (length == 0) return true;
537
538 length -= DeoptimizationInputData::kFirstDeoptEntryIndex;
539 return length >= 0 &&
540 length % DeoptimizationInputData::kDeoptEntrySize == 0;
541}
542
543
544bool Object::IsDeoptimizationOutputData() {
545 if (!IsFixedArray()) return false;
546 // There's actually no way to see the difference between a fixed array and
547 // a deoptimization data array. Since this is used for asserts we can check
548 // that the length is plausible though.
549 if (FixedArray::cast(this)->length() % 2 != 0) return false;
550 return true;
551}
552
553
danno@chromium.orgfa458e42012-02-01 10:48:36 +0000554bool Object::IsTypeFeedbackCells() {
555 if (!IsFixedArray()) return false;
556 // There's actually no way to see the difference between a fixed array and
557 // a cache cells array. Since this is used for asserts we can check that
558 // the length is plausible though.
559 if (FixedArray::cast(this)->length() % 2 != 0) return false;
560 return true;
561}
562
563
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000564bool Object::IsContext() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000565 if (Object::IsHeapObject()) {
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000566 Map* map = HeapObject::cast(this)->map();
567 Heap* heap = map->GetHeap();
568 return (map == heap->function_context_map() ||
569 map == heap->catch_context_map() ||
570 map == heap->with_context_map() ||
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000571 map == heap->global_context_map() ||
erik.corry@gmail.comed49e962012-04-17 11:57:53 +0000572 map == heap->block_context_map() ||
573 map == heap->module_context_map());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000574 }
575 return false;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000576}
577
578
579bool Object::IsGlobalContext() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000580 return Object::IsHeapObject() &&
581 HeapObject::cast(this)->map() ==
582 HeapObject::cast(this)->GetHeap()->global_context_map();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000583}
584
585
erik.corry@gmail.comed49e962012-04-17 11:57:53 +0000586bool Object::IsModuleContext() {
587 return Object::IsHeapObject() &&
588 HeapObject::cast(this)->map() ==
589 HeapObject::cast(this)->GetHeap()->module_context_map();
590}
591
592
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000593bool Object::IsScopeInfo() {
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000594 return Object::IsHeapObject() &&
595 HeapObject::cast(this)->map() ==
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +0000596 HeapObject::cast(this)->GetHeap()->scope_info_map();
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +0000597}
598
599
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000600TYPE_CHECKER(JSFunction, JS_FUNCTION_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000601
602
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000603template <> inline bool Is<JSFunction>(Object* obj) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000604 return obj->IsJSFunction();
605}
606
607
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000608TYPE_CHECKER(Code, CODE_TYPE)
609TYPE_CHECKER(Oddball, ODDBALL_TYPE)
610TYPE_CHECKER(JSGlobalPropertyCell, JS_GLOBAL_PROPERTY_CELL_TYPE)
611TYPE_CHECKER(SharedFunctionInfo, SHARED_FUNCTION_INFO_TYPE)
erik.corry@gmail.comed49e962012-04-17 11:57:53 +0000612TYPE_CHECKER(JSModule, JS_MODULE_TYPE)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000613TYPE_CHECKER(JSValue, JS_VALUE_TYPE)
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000614TYPE_CHECKER(JSDate, JS_DATE_TYPE)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000615TYPE_CHECKER(JSMessageObject, JS_MESSAGE_OBJECT_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000616
617
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +0000618bool Object::IsStringWrapper() {
619 return IsJSValue() && JSValue::cast(this)->value()->IsString();
620}
621
622
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000623TYPE_CHECKER(Foreign, FOREIGN_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000624
625
626bool Object::IsBoolean() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000627 return IsOddball() &&
628 ((Oddball::cast(this)->kind() & Oddball::kNotBooleanMask) == 0);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000629}
630
631
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000632TYPE_CHECKER(JSArray, JS_ARRAY_TYPE)
633TYPE_CHECKER(JSRegExp, JS_REGEXP_TYPE)
ager@chromium.org236ad962008-09-25 09:45:57 +0000634
635
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000636template <> inline bool Is<JSArray>(Object* obj) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000637 return obj->IsJSArray();
638}
639
640
641bool Object::IsHashTable() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000642 return Object::IsHeapObject() &&
643 HeapObject::cast(this)->map() ==
644 HeapObject::cast(this)->GetHeap()->hash_table_map();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000645}
646
647
648bool Object::IsDictionary() {
whesse@chromium.org7b260152011-06-20 15:33:18 +0000649 return IsHashTable() &&
650 this != HeapObject::cast(this)->GetHeap()->symbol_table();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000651}
652
653
654bool Object::IsSymbolTable() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000655 return IsHashTable() && this ==
656 HeapObject::cast(this)->GetHeap()->raw_unchecked_symbol_table();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000657}
658
659
ager@chromium.orgac091b72010-05-05 07:34:42 +0000660bool Object::IsJSFunctionResultCache() {
661 if (!IsFixedArray()) return false;
662 FixedArray* self = FixedArray::cast(this);
663 int length = self->length();
664 if (length < JSFunctionResultCache::kEntriesIndex) return false;
665 if ((length - JSFunctionResultCache::kEntriesIndex)
666 % JSFunctionResultCache::kEntrySize != 0) {
667 return false;
668 }
669#ifdef DEBUG
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000670 if (FLAG_verify_heap) {
671 reinterpret_cast<JSFunctionResultCache*>(this)->
672 JSFunctionResultCacheVerify();
673 }
ager@chromium.orgac091b72010-05-05 07:34:42 +0000674#endif
675 return true;
676}
677
678
ricow@chromium.org65fae842010-08-25 15:26:24 +0000679bool Object::IsNormalizedMapCache() {
680 if (!IsFixedArray()) return false;
681 if (FixedArray::cast(this)->length() != NormalizedMapCache::kEntries) {
682 return false;
683 }
684#ifdef DEBUG
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000685 if (FLAG_verify_heap) {
686 reinterpret_cast<NormalizedMapCache*>(this)->NormalizedMapCacheVerify();
687 }
ricow@chromium.org65fae842010-08-25 15:26:24 +0000688#endif
689 return true;
690}
691
692
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000693bool Object::IsCompilationCacheTable() {
694 return IsHashTable();
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000695}
696
697
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000698bool Object::IsCodeCacheHashTable() {
699 return IsHashTable();
700}
701
702
jkummerow@chromium.orge297f592011-06-08 10:05:15 +0000703bool Object::IsPolymorphicCodeCacheHashTable() {
704 return IsHashTable();
705}
706
707
ager@chromium.org236ad962008-09-25 09:45:57 +0000708bool Object::IsMapCache() {
709 return IsHashTable();
710}
711
712
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000713bool Object::IsPrimitive() {
714 return IsOddball() || IsNumber() || IsString();
715}
716
717
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000718bool Object::IsJSGlobalProxy() {
719 bool result = IsHeapObject() &&
720 (HeapObject::cast(this)->map()->instance_type() ==
721 JS_GLOBAL_PROXY_TYPE);
722 ASSERT(!result || IsAccessCheckNeeded());
723 return result;
724}
725
726
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000727bool Object::IsGlobalObject() {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000728 if (!IsHeapObject()) return false;
729
kasperl@chromium.org9bbf9682008-10-30 11:53:07 +0000730 InstanceType type = HeapObject::cast(this)->map()->instance_type();
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000731 return type == JS_GLOBAL_OBJECT_TYPE ||
732 type == JS_BUILTINS_OBJECT_TYPE;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000733}
734
735
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +0000736TYPE_CHECKER(JSGlobalObject, JS_GLOBAL_OBJECT_TYPE)
737TYPE_CHECKER(JSBuiltinsObject, JS_BUILTINS_OBJECT_TYPE)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000738
739
740bool Object::IsUndetectableObject() {
741 return IsHeapObject()
742 && HeapObject::cast(this)->map()->is_undetectable();
743}
744
745
746bool Object::IsAccessCheckNeeded() {
747 return IsHeapObject()
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000748 && HeapObject::cast(this)->map()->is_access_check_needed();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000749}
750
751
752bool Object::IsStruct() {
753 if (!IsHeapObject()) return false;
754 switch (HeapObject::cast(this)->map()->instance_type()) {
755#define MAKE_STRUCT_CASE(NAME, Name, name) case NAME##_TYPE: return true;
756 STRUCT_LIST(MAKE_STRUCT_CASE)
757#undef MAKE_STRUCT_CASE
758 default: return false;
759 }
760}
761
762
763#define MAKE_STRUCT_PREDICATE(NAME, Name, name) \
764 bool Object::Is##Name() { \
765 return Object::IsHeapObject() \
766 && HeapObject::cast(this)->map()->instance_type() == NAME##_TYPE; \
767 }
768 STRUCT_LIST(MAKE_STRUCT_PREDICATE)
769#undef MAKE_STRUCT_PREDICATE
770
771
772bool Object::IsUndefined() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000773 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kUndefined;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000774}
775
776
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000777bool Object::IsNull() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000778 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kNull;
779}
780
781
782bool Object::IsTheHole() {
783 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTheHole;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000784}
785
786
787bool Object::IsTrue() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000788 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kTrue;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000789}
790
791
792bool Object::IsFalse() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000793 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000794}
795
796
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000797bool Object::IsArgumentsMarker() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000798 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker;
kmillikin@chromium.orgd2c22f02011-01-10 08:15:37 +0000799}
800
801
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000802double Object::Number() {
803 ASSERT(IsNumber());
804 return IsSmi()
805 ? static_cast<double>(reinterpret_cast<Smi*>(this)->value())
806 : reinterpret_cast<HeapNumber*>(this)->value();
807}
808
809
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +0000810bool Object::IsNaN() {
811 return this->IsHeapNumber() && isnan(HeapNumber::cast(this)->value());
812}
813
814
lrn@chromium.org303ada72010-10-27 09:33:13 +0000815MaybeObject* Object::ToSmi() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000816 if (IsSmi()) return this;
817 if (IsHeapNumber()) {
818 double value = HeapNumber::cast(this)->value();
819 int int_value = FastD2I(value);
820 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) {
821 return Smi::FromInt(int_value);
822 }
823 }
824 return Failure::Exception();
825}
826
827
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000828bool Object::HasSpecificClassOf(String* name) {
829 return this->IsJSObject() && (JSObject::cast(this)->class_name() == name);
830}
831
832
lrn@chromium.org303ada72010-10-27 09:33:13 +0000833MaybeObject* Object::GetElement(uint32_t index) {
vegorov@chromium.org5d6c1f52011-02-28 13:13:38 +0000834 // GetElement can trigger a getter which can cause allocation.
835 // This was not always the case. This ASSERT is here to catch
836 // leftover incorrect uses.
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000837 ASSERT(HEAP->IsAllocationAllowed());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000838 return GetElementWithReceiver(this, index);
839}
840
841
lrn@chromium.org303ada72010-10-27 09:33:13 +0000842Object* Object::GetElementNoExceptionThrown(uint32_t index) {
843 MaybeObject* maybe = GetElementWithReceiver(this, index);
844 ASSERT(!maybe->IsFailure());
845 Object* result = NULL; // Initialization to please compiler.
846 maybe->ToObject(&result);
847 return result;
848}
849
850
851MaybeObject* Object::GetProperty(String* key) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000852 PropertyAttributes attributes;
853 return GetPropertyWithReceiver(this, key, &attributes);
854}
855
856
lrn@chromium.org303ada72010-10-27 09:33:13 +0000857MaybeObject* Object::GetProperty(String* key, PropertyAttributes* attributes) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000858 return GetPropertyWithReceiver(this, key, attributes);
859}
860
861
862#define FIELD_ADDR(p, offset) \
863 (reinterpret_cast<byte*>(p) + offset - kHeapObjectTag)
864
865#define READ_FIELD(p, offset) \
866 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)))
867
868#define WRITE_FIELD(p, offset, value) \
869 (*reinterpret_cast<Object**>(FIELD_ADDR(p, offset)) = value)
870
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000871#define WRITE_BARRIER(heap, object, offset, value) \
872 heap->incremental_marking()->RecordWrite( \
873 object, HeapObject::RawField(object, offset), value); \
874 if (heap->InNewSpace(value)) { \
875 heap->RecordWrite(object->address(), offset); \
876 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000877
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +0000878#define CONDITIONAL_WRITE_BARRIER(heap, object, offset, value, mode) \
879 if (mode == UPDATE_WRITE_BARRIER) { \
880 heap->incremental_marking()->RecordWrite( \
881 object, HeapObject::RawField(object, offset), value); \
882 if (heap->InNewSpace(value)) { \
883 heap->RecordWrite(object->address(), offset); \
884 } \
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000885 }
886
lrn@chromium.org7516f052011-03-30 08:52:27 +0000887#ifndef V8_TARGET_ARCH_MIPS
888 #define READ_DOUBLE_FIELD(p, offset) \
889 (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)))
890#else // V8_TARGET_ARCH_MIPS
891 // Prevent gcc from using load-double (mips ldc1) on (possibly)
892 // non-64-bit aligned HeapNumber::value.
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000893 static inline double read_double_field(void* p, int offset) {
lrn@chromium.org7516f052011-03-30 08:52:27 +0000894 union conversion {
895 double d;
896 uint32_t u[2];
897 } c;
898 c.u[0] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)));
899 c.u[1] = (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4)));
900 return c.d;
901 }
902 #define READ_DOUBLE_FIELD(p, offset) read_double_field(p, offset)
903#endif // V8_TARGET_ARCH_MIPS
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000904
lrn@chromium.org7516f052011-03-30 08:52:27 +0000905#ifndef V8_TARGET_ARCH_MIPS
906 #define WRITE_DOUBLE_FIELD(p, offset, value) \
907 (*reinterpret_cast<double*>(FIELD_ADDR(p, offset)) = value)
908#else // V8_TARGET_ARCH_MIPS
909 // Prevent gcc from using store-double (mips sdc1) on (possibly)
910 // non-64-bit aligned HeapNumber::value.
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000911 static inline void write_double_field(void* p, int offset,
lrn@chromium.org7516f052011-03-30 08:52:27 +0000912 double value) {
913 union conversion {
914 double d;
915 uint32_t u[2];
916 } c;
917 c.d = value;
918 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset))) = c.u[0];
919 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset + 4))) = c.u[1];
920 }
921 #define WRITE_DOUBLE_FIELD(p, offset, value) \
922 write_double_field(p, offset, value)
923#endif // V8_TARGET_ARCH_MIPS
924
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000925
926#define READ_INT_FIELD(p, offset) \
927 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)))
928
929#define WRITE_INT_FIELD(p, offset, value) \
930 (*reinterpret_cast<int*>(FIELD_ADDR(p, offset)) = value)
931
ager@chromium.org3e875802009-06-29 08:26:34 +0000932#define READ_INTPTR_FIELD(p, offset) \
933 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)))
934
935#define WRITE_INTPTR_FIELD(p, offset, value) \
936 (*reinterpret_cast<intptr_t*>(FIELD_ADDR(p, offset)) = value)
937
ager@chromium.org7c537e22008-10-16 08:43:32 +0000938#define READ_UINT32_FIELD(p, offset) \
939 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)))
940
941#define WRITE_UINT32_FIELD(p, offset, value) \
942 (*reinterpret_cast<uint32_t*>(FIELD_ADDR(p, offset)) = value)
943
danno@chromium.org88aa0582012-03-23 15:11:57 +0000944#define READ_INT64_FIELD(p, offset) \
945 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)))
946
947#define WRITE_INT64_FIELD(p, offset, value) \
948 (*reinterpret_cast<int64_t*>(FIELD_ADDR(p, offset)) = value)
949
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000950#define READ_SHORT_FIELD(p, offset) \
951 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)))
952
953#define WRITE_SHORT_FIELD(p, offset, value) \
954 (*reinterpret_cast<uint16_t*>(FIELD_ADDR(p, offset)) = value)
955
956#define READ_BYTE_FIELD(p, offset) \
957 (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)))
958
959#define WRITE_BYTE_FIELD(p, offset, value) \
960 (*reinterpret_cast<byte*>(FIELD_ADDR(p, offset)) = value)
961
962
kasperl@chromium.org9bbf9682008-10-30 11:53:07 +0000963Object** HeapObject::RawField(HeapObject* obj, int byte_offset) {
964 return &READ_FIELD(obj, byte_offset);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000965}
966
967
968int Smi::value() {
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000969 return Internals::SmiValue(this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000970}
971
972
973Smi* Smi::FromInt(int value) {
974 ASSERT(Smi::IsValid(value));
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000975 int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
ager@chromium.org9085a012009-05-11 19:22:57 +0000976 intptr_t tagged_value =
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000977 (static_cast<intptr_t>(value) << smi_shift_bits) | kSmiTag;
ager@chromium.org9085a012009-05-11 19:22:57 +0000978 return reinterpret_cast<Smi*>(tagged_value);
979}
980
981
982Smi* Smi::FromIntptr(intptr_t value) {
983 ASSERT(Smi::IsValid(value));
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000984 int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
985 return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000986}
987
988
989Failure::Type Failure::type() const {
990 return static_cast<Type>(value() & kFailureTypeTagMask);
991}
992
993
994bool Failure::IsInternalError() const {
995 return type() == INTERNAL_ERROR;
996}
997
998
999bool Failure::IsOutOfMemoryException() const {
1000 return type() == OUT_OF_MEMORY_EXCEPTION;
1001}
1002
1003
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001004AllocationSpace Failure::allocation_space() const {
1005 ASSERT_EQ(RETRY_AFTER_GC, type());
1006 return static_cast<AllocationSpace>((value() >> kFailureTypeTagSize)
1007 & kSpaceTagMask);
1008}
1009
1010
1011Failure* Failure::InternalError() {
1012 return Construct(INTERNAL_ERROR);
1013}
1014
1015
1016Failure* Failure::Exception() {
1017 return Construct(EXCEPTION);
1018}
1019
sgjesse@chromium.orgc81c8942009-08-21 10:54:26 +00001020
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001021Failure* Failure::OutOfMemoryException() {
1022 return Construct(OUT_OF_MEMORY_EXCEPTION);
1023}
1024
1025
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001026intptr_t Failure::value() const {
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001027 return static_cast<intptr_t>(
1028 reinterpret_cast<uintptr_t>(this) >> kFailureTagSize);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001029}
1030
1031
whesse@chromium.org4a5224e2010-10-20 12:37:07 +00001032Failure* Failure::RetryAfterGC() {
1033 return RetryAfterGC(NEW_SPACE);
1034}
1035
1036
1037Failure* Failure::RetryAfterGC(AllocationSpace space) {
1038 ASSERT((space & ~kSpaceTagMask) == 0);
1039 return Construct(RETRY_AFTER_GC, space);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001040}
1041
1042
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001043Failure* Failure::Construct(Type type, intptr_t value) {
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001044 uintptr_t info =
1045 (static_cast<uintptr_t>(value) << kFailureTypeTagSize) | type;
ager@chromium.orgab99eea2009-08-25 07:05:41 +00001046 ASSERT(((info << kFailureTagSize) >> kFailureTagSize) == info);
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001047 return reinterpret_cast<Failure*>((info << kFailureTagSize) | kFailureTag);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001048}
1049
1050
ager@chromium.orgab99eea2009-08-25 07:05:41 +00001051bool Smi::IsValid(intptr_t value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001052#ifdef DEBUG
1053 bool in_range = (value >= kMinValue) && (value <= kMaxValue);
1054#endif
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001055
1056#ifdef V8_TARGET_ARCH_X64
1057 // To be representable as a long smi, the value must be a 32-bit integer.
1058 bool result = (value == static_cast<int32_t>(value));
1059#else
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001060 // To be representable as an tagged small integer, the two
1061 // most-significant bits of 'value' must be either 00 or 11 due to
1062 // sign-extension. To check this we add 01 to the two
1063 // most-significant bits, and check if the most-significant bit is 0
1064 //
1065 // CAUTION: The original code below:
1066 // bool result = ((value + 0x40000000) & 0x80000000) == 0;
1067 // may lead to incorrect results according to the C language spec, and
1068 // in fact doesn't work correctly with gcc4.1.1 in some cases: The
1069 // compiler may produce undefined results in case of signed integer
1070 // overflow. The computation must be done w/ unsigned ints.
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +00001071 bool result = (static_cast<uintptr_t>(value + 0x40000000U) < 0x80000000U);
ager@chromium.org9085a012009-05-11 19:22:57 +00001072#endif
ager@chromium.org9085a012009-05-11 19:22:57 +00001073 ASSERT(result == in_range);
1074 return result;
1075}
1076
1077
kasper.lund7276f142008-07-30 08:49:36 +00001078MapWord MapWord::FromMap(Map* map) {
1079 return MapWord(reinterpret_cast<uintptr_t>(map));
1080}
1081
1082
1083Map* MapWord::ToMap() {
1084 return reinterpret_cast<Map*>(value_);
1085}
1086
1087
1088bool MapWord::IsForwardingAddress() {
ager@chromium.org7c537e22008-10-16 08:43:32 +00001089 return HAS_SMI_TAG(reinterpret_cast<Object*>(value_));
kasper.lund7276f142008-07-30 08:49:36 +00001090}
1091
1092
1093MapWord MapWord::FromForwardingAddress(HeapObject* object) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00001094 Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag;
1095 return MapWord(reinterpret_cast<uintptr_t>(raw));
kasper.lund7276f142008-07-30 08:49:36 +00001096}
1097
1098
1099HeapObject* MapWord::ToForwardingAddress() {
1100 ASSERT(IsForwardingAddress());
ager@chromium.org7c537e22008-10-16 08:43:32 +00001101 return HeapObject::FromAddress(reinterpret_cast<Address>(value_));
kasper.lund7276f142008-07-30 08:49:36 +00001102}
1103
1104
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001105#ifdef DEBUG
1106void HeapObject::VerifyObjectField(int offset) {
1107 VerifyPointer(READ_FIELD(this, offset));
1108}
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001109
1110void HeapObject::VerifySmiField(int offset) {
1111 ASSERT(READ_FIELD(this, offset)->IsSmi());
1112}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001113#endif
1114
1115
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001116Heap* HeapObject::GetHeap() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001117 Heap* heap =
1118 MemoryChunk::FromAddress(reinterpret_cast<Address>(this))->heap();
1119 ASSERT(heap != NULL);
1120 ASSERT(heap->isolate() == Isolate::Current());
1121 return heap;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001122}
1123
1124
1125Isolate* HeapObject::GetIsolate() {
1126 return GetHeap()->isolate();
1127}
1128
1129
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001130Map* HeapObject::map() {
kasper.lund7276f142008-07-30 08:49:36 +00001131 return map_word().ToMap();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001132}
1133
1134
1135void HeapObject::set_map(Map* value) {
kasper.lund7276f142008-07-30 08:49:36 +00001136 set_map_word(MapWord::FromMap(value));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001137 if (value != NULL) {
1138 // TODO(1600) We are passing NULL as a slot because maps can never be on
1139 // evacuation candidate.
1140 value->GetHeap()->incremental_marking()->RecordWrite(this, NULL, value);
1141 }
1142}
1143
1144
1145// Unsafe accessor omitting write barrier.
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001146void HeapObject::set_map_no_write_barrier(Map* value) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001147 set_map_word(MapWord::FromMap(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001148}
1149
1150
kasper.lund7276f142008-07-30 08:49:36 +00001151MapWord HeapObject::map_word() {
1152 return MapWord(reinterpret_cast<uintptr_t>(READ_FIELD(this, kMapOffset)));
1153}
1154
1155
1156void HeapObject::set_map_word(MapWord map_word) {
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001157 // WRITE_FIELD does not invoke write barrier, but there is no need
kasper.lund7276f142008-07-30 08:49:36 +00001158 // here.
1159 WRITE_FIELD(this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
1160}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001161
1162
1163HeapObject* HeapObject::FromAddress(Address address) {
1164 ASSERT_TAG_ALIGNED(address);
1165 return reinterpret_cast<HeapObject*>(address + kHeapObjectTag);
1166}
1167
1168
1169Address HeapObject::address() {
1170 return reinterpret_cast<Address>(this) - kHeapObjectTag;
1171}
1172
1173
1174int HeapObject::Size() {
1175 return SizeFromMap(map());
1176}
1177
1178
1179void HeapObject::IteratePointers(ObjectVisitor* v, int start, int end) {
1180 v->VisitPointers(reinterpret_cast<Object**>(FIELD_ADDR(this, start)),
1181 reinterpret_cast<Object**>(FIELD_ADDR(this, end)));
1182}
1183
1184
1185void HeapObject::IteratePointer(ObjectVisitor* v, int offset) {
1186 v->VisitPointer(reinterpret_cast<Object**>(FIELD_ADDR(this, offset)));
1187}
1188
1189
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001190double HeapNumber::value() {
1191 return READ_DOUBLE_FIELD(this, kValueOffset);
1192}
1193
1194
1195void HeapNumber::set_value(double value) {
1196 WRITE_DOUBLE_FIELD(this, kValueOffset, value);
1197}
1198
1199
whesse@chromium.orgcec079d2010-03-22 14:44:04 +00001200int HeapNumber::get_exponent() {
1201 return ((READ_INT_FIELD(this, kExponentOffset) & kExponentMask) >>
1202 kExponentShift) - kExponentBias;
1203}
1204
1205
1206int HeapNumber::get_sign() {
1207 return READ_INT_FIELD(this, kExponentOffset) & kSignMask;
1208}
1209
1210
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001211ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001212
1213
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001214Object** FixedArray::GetFirstElementAddress() {
1215 return reinterpret_cast<Object**>(FIELD_ADDR(this, OffsetOfElementAt(0)));
1216}
1217
1218
1219bool FixedArray::ContainsOnlySmisOrHoles() {
1220 Object* the_hole = GetHeap()->the_hole_value();
1221 Object** current = GetFirstElementAddress();
1222 for (int i = 0; i < length(); ++i) {
1223 Object* candidate = *current++;
1224 if (!candidate->IsSmi() && candidate != the_hole) return false;
1225 }
1226 return true;
1227}
1228
1229
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +00001230FixedArrayBase* JSObject::elements() {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001231 Object* array = READ_FIELD(this, kElementsOffset);
whesse@chromium.org4acdc2c2011-08-15 13:01:23 +00001232 return static_cast<FixedArrayBase*>(array);
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001233}
1234
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001235
1236void JSObject::ValidateElements() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001237#if DEBUG
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001238 if (FLAG_enable_slow_asserts) {
1239 ElementsAccessor* accessor = GetElementsAccessor();
1240 accessor->Validate(this);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001241 }
1242#endif
1243}
1244
1245
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001246MaybeObject* JSObject::EnsureCanContainHeapObjectElements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001247 ValidateElements();
1248 ElementsKind elements_kind = map()->elements_kind();
1249 if (!IsFastObjectElementsKind(elements_kind)) {
1250 if (IsFastHoleyElementsKind(elements_kind)) {
1251 return TransitionElementsKind(FAST_HOLEY_ELEMENTS);
1252 } else {
1253 return TransitionElementsKind(FAST_ELEMENTS);
1254 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001255 }
1256 return this;
1257}
1258
1259
1260MaybeObject* JSObject::EnsureCanContainElements(Object** objects,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001261 uint32_t count,
1262 EnsureElementsMode mode) {
1263 ElementsKind current_kind = map()->elements_kind();
1264 ElementsKind target_kind = current_kind;
1265 ASSERT(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001266 bool is_holey = IsFastHoleyElementsKind(current_kind);
1267 if (current_kind == FAST_HOLEY_ELEMENTS) return this;
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001268 Heap* heap = GetHeap();
1269 Object* the_hole = heap->the_hole_value();
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001270 for (uint32_t i = 0; i < count; ++i) {
1271 Object* current = *objects++;
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001272 if (current == the_hole) {
1273 is_holey = true;
1274 target_kind = GetHoleyElementsKind(target_kind);
1275 } else if (!current->IsSmi()) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001276 if (mode == ALLOW_CONVERTED_DOUBLE_ELEMENTS && current->IsNumber()) {
1277 if (IsFastSmiElementsKind(target_kind)) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001278 if (is_holey) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001279 target_kind = FAST_HOLEY_DOUBLE_ELEMENTS;
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001280 } else {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001281 target_kind = FAST_DOUBLE_ELEMENTS;
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001282 }
1283 }
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001284 } else if (is_holey) {
1285 target_kind = FAST_HOLEY_ELEMENTS;
1286 break;
1287 } else {
1288 target_kind = FAST_ELEMENTS;
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001289 }
1290 }
1291 }
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001292
1293 if (target_kind != current_kind) {
1294 return TransitionElementsKind(target_kind);
1295 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001296 return this;
1297}
1298
1299
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001300MaybeObject* JSObject::EnsureCanContainElements(FixedArrayBase* elements,
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001301 uint32_t length,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001302 EnsureElementsMode mode) {
1303 if (elements->map() != GetHeap()->fixed_double_array_map()) {
1304 ASSERT(elements->map() == GetHeap()->fixed_array_map() ||
1305 elements->map() == GetHeap()->fixed_cow_array_map());
1306 if (mode == ALLOW_COPIED_DOUBLE_ELEMENTS) {
1307 mode = DONT_ALLOW_DOUBLE_ELEMENTS;
1308 }
1309 Object** objects = FixedArray::cast(elements)->GetFirstElementAddress();
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001310 return EnsureCanContainElements(objects, length, mode);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001311 }
1312
1313 ASSERT(mode == ALLOW_COPIED_DOUBLE_ELEMENTS);
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001314 if (GetElementsKind() == FAST_HOLEY_SMI_ELEMENTS) {
1315 return TransitionElementsKind(FAST_HOLEY_DOUBLE_ELEMENTS);
1316 } else if (GetElementsKind() == FAST_SMI_ELEMENTS) {
1317 FixedDoubleArray* double_array = FixedDoubleArray::cast(elements);
1318 for (uint32_t i = 0; i < length; ++i) {
1319 if (double_array->is_the_hole(i)) {
1320 return TransitionElementsKind(FAST_HOLEY_DOUBLE_ELEMENTS);
1321 }
1322 }
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001323 return TransitionElementsKind(FAST_DOUBLE_ELEMENTS);
1324 }
1325
1326 return this;
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001327}
1328
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001329
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001330MaybeObject* JSObject::GetElementsTransitionMap(Isolate* isolate,
1331 ElementsKind to_kind) {
1332 Map* current_map = map();
1333 ElementsKind from_kind = current_map->elements_kind();
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001334 if (from_kind == to_kind) return current_map;
1335
1336 Context* global_context = isolate->context()->global_context();
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001337 Object* maybe_array_maps = global_context->js_array_maps();
1338 if (maybe_array_maps->IsFixedArray()) {
1339 FixedArray* array_maps = FixedArray::cast(maybe_array_maps);
1340 if (array_maps->get(from_kind) == current_map) {
1341 Object* maybe_transitioned_map = array_maps->get(to_kind);
1342 if (maybe_transitioned_map->IsMap()) {
1343 return Map::cast(maybe_transitioned_map);
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001344 }
1345 }
1346 }
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001347
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001348 return GetElementsTransitionMapSlow(to_kind);
1349}
1350
1351
svenpanne@chromium.org3c93e772012-01-02 09:26:59 +00001352void JSObject::set_map_and_elements(Map* new_map,
1353 FixedArrayBase* value,
1354 WriteBarrierMode mode) {
1355 ASSERT(value->HasValidElements());
svenpanne@chromium.org3c93e772012-01-02 09:26:59 +00001356 if (new_map != NULL) {
1357 if (mode == UPDATE_WRITE_BARRIER) {
1358 set_map(new_map);
1359 } else {
1360 ASSERT(mode == SKIP_WRITE_BARRIER);
1361 set_map_no_write_barrier(new_map);
1362 }
1363 }
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001364 ASSERT((map()->has_fast_smi_or_object_elements() ||
ulan@chromium.org65a89c22012-02-14 11:46:07 +00001365 (value == GetHeap()->empty_fixed_array())) ==
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001366 (value->map() == GetHeap()->fixed_array_map() ||
1367 value->map() == GetHeap()->fixed_cow_array_map()));
ulan@chromium.org65a89c22012-02-14 11:46:07 +00001368 ASSERT((value == GetHeap()->empty_fixed_array()) ||
1369 (map()->has_fast_double_elements() == value->IsFixedDoubleArray()));
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001370 WRITE_FIELD(this, kElementsOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001371 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00001372}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001373
1374
svenpanne@chromium.org3c93e772012-01-02 09:26:59 +00001375void JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) {
1376 set_map_and_elements(NULL, value, mode);
1377}
1378
1379
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001380void JSObject::initialize_properties() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001381 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
1382 WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001383}
1384
1385
1386void JSObject::initialize_elements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001387 ASSERT(map()->has_fast_smi_or_object_elements() ||
danno@chromium.org2c26cb12012-05-03 09:06:43 +00001388 map()->has_fast_double_elements());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001389 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
1390 WRITE_FIELD(this, kElementsOffset, GetHeap()->empty_fixed_array());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001391}
1392
1393
lrn@chromium.org303ada72010-10-27 09:33:13 +00001394MaybeObject* JSObject::ResetElements() {
1395 Object* obj;
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001396 ElementsKind elements_kind = GetInitialFastElementsKind();
1397 if (!FLAG_smi_only_arrays) {
1398 elements_kind = FastSmiToObjectElementsKind(elements_kind);
1399 }
danno@chromium.orgfa458e42012-02-01 10:48:36 +00001400 MaybeObject* maybe_obj = GetElementsTransitionMap(GetIsolate(),
1401 elements_kind);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001402 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
fschneider@chromium.org40b9da32010-06-28 11:29:21 +00001403 set_map(Map::cast(obj));
1404 initialize_elements();
1405 return this;
1406}
1407
1408
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001409ACCESSORS(Oddball, to_string, String, kToStringOffset)
1410ACCESSORS(Oddball, to_number, Object, kToNumberOffset)
1411
1412
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001413byte Oddball::kind() {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001414 return Smi::cast(READ_FIELD(this, kKindOffset))->value();
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001415}
1416
1417
1418void Oddball::set_kind(byte value) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001419 WRITE_FIELD(this, kKindOffset, Smi::FromInt(value));
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001420}
1421
1422
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00001423Object* JSGlobalPropertyCell::value() {
1424 return READ_FIELD(this, kValueOffset);
1425}
1426
1427
1428void JSGlobalPropertyCell::set_value(Object* val, WriteBarrierMode ignored) {
1429 // The write barrier is not used for global property cells.
1430 ASSERT(!val->IsJSGlobalPropertyCell());
1431 WRITE_FIELD(this, kValueOffset, val);
1432}
1433
kasperl@chromium.org2abc4502009-07-02 07:00:29 +00001434
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001435int JSObject::GetHeaderSize() {
kasperl@chromium.orge959c182009-07-27 08:59:04 +00001436 InstanceType type = map()->instance_type();
1437 // Check for the most common kind of JavaScript object before
1438 // falling into the generic switch. This speeds up the internal
1439 // field operations considerably on average.
1440 if (type == JS_OBJECT_TYPE) return JSObject::kHeaderSize;
1441 switch (type) {
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00001442 case JS_MODULE_TYPE:
1443 return JSModule::kSize;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001444 case JS_GLOBAL_PROXY_TYPE:
1445 return JSGlobalProxy::kSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001446 case JS_GLOBAL_OBJECT_TYPE:
1447 return JSGlobalObject::kSize;
1448 case JS_BUILTINS_OBJECT_TYPE:
1449 return JSBuiltinsObject::kSize;
1450 case JS_FUNCTION_TYPE:
1451 return JSFunction::kSize;
1452 case JS_VALUE_TYPE:
1453 return JSValue::kSize;
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +00001454 case JS_DATE_TYPE:
1455 return JSDate::kSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001456 case JS_ARRAY_TYPE:
ulan@chromium.org2efb9002012-01-19 15:36:35 +00001457 return JSArray::kSize;
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001458 case JS_WEAK_MAP_TYPE:
1459 return JSWeakMap::kSize;
ager@chromium.org236ad962008-09-25 09:45:57 +00001460 case JS_REGEXP_TYPE:
ulan@chromium.org2efb9002012-01-19 15:36:35 +00001461 return JSRegExp::kSize;
ager@chromium.org32912102009-01-16 10:38:43 +00001462 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001463 return JSObject::kHeaderSize;
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00001464 case JS_MESSAGE_OBJECT_TYPE:
1465 return JSMessageObject::kSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001466 default:
1467 UNREACHABLE();
1468 return 0;
1469 }
1470}
1471
1472
1473int JSObject::GetInternalFieldCount() {
1474 ASSERT(1 << kPointerSizeLog2 == kPointerSize);
ager@chromium.org7c537e22008-10-16 08:43:32 +00001475 // Make sure to adjust for the number of in-object properties. These
1476 // properties do contribute to the size, but are not internal fields.
1477 return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) -
1478 map()->inobject_properties();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001479}
1480
1481
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001482int JSObject::GetInternalFieldOffset(int index) {
1483 ASSERT(index < GetInternalFieldCount() && index >= 0);
1484 return GetHeaderSize() + (kPointerSize * index);
1485}
1486
1487
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001488Object* JSObject::GetInternalField(int index) {
1489 ASSERT(index < GetInternalFieldCount() && index >= 0);
ager@chromium.org7c537e22008-10-16 08:43:32 +00001490 // Internal objects do follow immediately after the header, whereas in-object
1491 // properties are at the end of the object. Therefore there is no need
1492 // to adjust the index here.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001493 return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index));
1494}
1495
1496
1497void JSObject::SetInternalField(int index, Object* value) {
1498 ASSERT(index < GetInternalFieldCount() && index >= 0);
ager@chromium.org7c537e22008-10-16 08:43:32 +00001499 // Internal objects do follow immediately after the header, whereas in-object
1500 // properties are at the end of the object. Therefore there is no need
1501 // to adjust the index here.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001502 int offset = GetHeaderSize() + (kPointerSize * index);
1503 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001504 WRITE_BARRIER(GetHeap(), this, offset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001505}
1506
1507
ricow@chromium.org27bf2882011-11-17 08:34:43 +00001508void JSObject::SetInternalField(int index, Smi* value) {
1509 ASSERT(index < GetInternalFieldCount() && index >= 0);
1510 // Internal objects do follow immediately after the header, whereas in-object
1511 // properties are at the end of the object. Therefore there is no need
1512 // to adjust the index here.
1513 int offset = GetHeaderSize() + (kPointerSize * index);
1514 WRITE_FIELD(this, offset, value);
1515}
1516
1517
ager@chromium.org7c537e22008-10-16 08:43:32 +00001518// Access fast-case object properties at index. The use of these routines
1519// is needed to correctly distinguish between properties stored in-object and
1520// properties stored in the properties array.
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001521Object* JSObject::FastPropertyAt(int index) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00001522 // Adjust for the number of properties stored in the object.
1523 index -= map()->inobject_properties();
1524 if (index < 0) {
1525 int offset = map()->instance_size() + (index * kPointerSize);
1526 return READ_FIELD(this, offset);
1527 } else {
1528 ASSERT(index < properties()->length());
1529 return properties()->get(index);
1530 }
1531}
1532
1533
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001534Object* JSObject::FastPropertyAtPut(int index, Object* value) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00001535 // Adjust for the number of properties stored in the object.
1536 index -= map()->inobject_properties();
1537 if (index < 0) {
1538 int offset = map()->instance_size() + (index * kPointerSize);
1539 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001540 WRITE_BARRIER(GetHeap(), this, offset, value);
ager@chromium.org7c537e22008-10-16 08:43:32 +00001541 } else {
1542 ASSERT(index < properties()->length());
1543 properties()->set(index, value);
1544 }
1545 return value;
1546}
1547
1548
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001549int JSObject::GetInObjectPropertyOffset(int index) {
1550 // Adjust for the number of properties stored in the object.
1551 index -= map()->inobject_properties();
1552 ASSERT(index < 0);
1553 return map()->instance_size() + (index * kPointerSize);
1554}
1555
1556
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001557Object* JSObject::InObjectPropertyAt(int index) {
1558 // Adjust for the number of properties stored in the object.
1559 index -= map()->inobject_properties();
1560 ASSERT(index < 0);
1561 int offset = map()->instance_size() + (index * kPointerSize);
1562 return READ_FIELD(this, offset);
1563}
1564
1565
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001566Object* JSObject::InObjectPropertyAtPut(int index,
1567 Object* value,
1568 WriteBarrierMode mode) {
1569 // Adjust for the number of properties stored in the object.
1570 index -= map()->inobject_properties();
1571 ASSERT(index < 0);
1572 int offset = map()->instance_size() + (index * kPointerSize);
1573 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001574 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001575 return value;
1576}
1577
1578
1579
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001580void JSObject::InitializeBody(Map* map,
1581 Object* pre_allocated_value,
1582 Object* filler_value) {
1583 ASSERT(!filler_value->IsHeapObject() ||
1584 !GetHeap()->InNewSpace(filler_value));
1585 ASSERT(!pre_allocated_value->IsHeapObject() ||
1586 !GetHeap()->InNewSpace(pre_allocated_value));
1587 int size = map->instance_size();
1588 int offset = kHeaderSize;
1589 if (filler_value != pre_allocated_value) {
1590 int pre_allocated = map->pre_allocated_property_fields();
1591 ASSERT(pre_allocated * kPointerSize + kHeaderSize <= size);
1592 for (int i = 0; i < pre_allocated; i++) {
1593 WRITE_FIELD(this, offset, pre_allocated_value);
1594 offset += kPointerSize;
1595 }
1596 }
1597 while (offset < size) {
1598 WRITE_FIELD(this, offset, filler_value);
1599 offset += kPointerSize;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001600 }
1601}
1602
1603
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001604bool JSObject::HasFastProperties() {
1605 return !properties()->IsDictionary();
1606}
1607
1608
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001609bool JSObject::TooManyFastProperties(int properties,
1610 JSObject::StoreFromKeyed store_mode) {
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001611 // Allow extra fast properties if the object has more than
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001612 // kFastPropertiesSoftLimit in-object properties. When this is the case,
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001613 // it is very unlikely that the object is being used as a dictionary
1614 // and there is a good chance that allowing more map transitions
1615 // will be worth it.
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001616 int inobject = map()->inobject_properties();
1617
1618 int limit;
ulan@chromium.orgf6a0c412012-06-15 12:31:06 +00001619 if (store_mode == CERTAINLY_NOT_STORE_FROM_KEYED) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001620 limit = Max(inobject, kMaxFastProperties);
1621 } else {
1622 limit = Max(inobject, kFastPropertiesSoftLimit);
1623 }
1624 return properties > limit;
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00001625}
1626
1627
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001628void Struct::InitializeBody(int object_size) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001629 Object* value = GetHeap()->undefined_value();
ager@chromium.org236ad962008-09-25 09:45:57 +00001630 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001631 WRITE_FIELD(this, offset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001632 }
1633}
1634
1635
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001636bool Object::ToArrayIndex(uint32_t* index) {
1637 if (IsSmi()) {
1638 int value = Smi::cast(this)->value();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001639 if (value < 0) return false;
1640 *index = value;
1641 return true;
1642 }
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001643 if (IsHeapNumber()) {
1644 double value = HeapNumber::cast(this)->value();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001645 uint32_t uint_value = static_cast<uint32_t>(value);
1646 if (value == static_cast<double>(uint_value)) {
1647 *index = uint_value;
1648 return true;
1649 }
1650 }
1651 return false;
1652}
1653
1654
1655bool Object::IsStringObjectWithCharacterAt(uint32_t index) {
1656 if (!this->IsJSValue()) return false;
1657
1658 JSValue* js_value = JSValue::cast(this);
1659 if (!js_value->value()->IsString()) return false;
1660
1661 String* str = String::cast(js_value->value());
1662 if (index >= (uint32_t)str->length()) return false;
1663
1664 return true;
1665}
1666
1667
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001668FixedArrayBase* FixedArrayBase::cast(Object* object) {
1669 ASSERT(object->IsFixedArray() || object->IsFixedDoubleArray());
1670 return reinterpret_cast<FixedArrayBase*>(object);
1671}
1672
1673
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001674Object* FixedArray::get(int index) {
1675 ASSERT(index >= 0 && index < this->length());
1676 return READ_FIELD(this, kHeaderSize + index * kPointerSize);
1677}
1678
1679
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00001680bool FixedArray::is_the_hole(int index) {
1681 return get(index) == GetHeap()->the_hole_value();
1682}
1683
1684
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001685void FixedArray::set(int index, Smi* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001686 ASSERT(map() != HEAP->fixed_cow_array_map());
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001687 ASSERT(index >= 0 && index < this->length());
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001688 ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1689 int offset = kHeaderSize + index * kPointerSize;
1690 WRITE_FIELD(this, offset, value);
1691}
1692
1693
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001694void FixedArray::set(int index, Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001695 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001696 ASSERT(index >= 0 && index < this->length());
1697 int offset = kHeaderSize + index * kPointerSize;
1698 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001699 WRITE_BARRIER(GetHeap(), this, offset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001700}
1701
1702
svenpanne@chromium.org84bcc552011-07-18 09:50:57 +00001703inline bool FixedDoubleArray::is_the_hole_nan(double value) {
1704 return BitCast<uint64_t, double>(value) == kHoleNanInt64;
1705}
1706
1707
1708inline double FixedDoubleArray::hole_nan_as_double() {
1709 return BitCast<double, uint64_t>(kHoleNanInt64);
1710}
1711
1712
1713inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() {
1714 ASSERT(BitCast<uint64_t>(OS::nan_value()) != kHoleNanInt64);
1715 ASSERT((BitCast<uint64_t>(OS::nan_value()) >> 32) != kHoleNanUpper32);
1716 return OS::nan_value();
1717}
1718
1719
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001720double FixedDoubleArray::get_scalar(int index) {
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001721 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1722 map() != HEAP->fixed_array_map());
1723 ASSERT(index >= 0 && index < this->length());
1724 double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize);
1725 ASSERT(!is_the_hole_nan(result));
1726 return result;
1727}
1728
danno@chromium.org88aa0582012-03-23 15:11:57 +00001729int64_t FixedDoubleArray::get_representation(int index) {
1730 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1731 map() != HEAP->fixed_array_map());
1732 ASSERT(index >= 0 && index < this->length());
1733 return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize);
1734}
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001735
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001736MaybeObject* FixedDoubleArray::get(int index) {
1737 if (is_the_hole(index)) {
1738 return GetHeap()->the_hole_value();
1739 } else {
1740 return GetHeap()->NumberFromDouble(get_scalar(index));
1741 }
1742}
1743
1744
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00001745void FixedDoubleArray::set(int index, double value) {
1746 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1747 map() != HEAP->fixed_array_map());
1748 int offset = kHeaderSize + index * kDoubleSize;
1749 if (isnan(value)) value = canonical_not_the_hole_nan_as_double();
1750 WRITE_DOUBLE_FIELD(this, offset, value);
1751}
1752
1753
1754void FixedDoubleArray::set_the_hole(int index) {
1755 ASSERT(map() != HEAP->fixed_cow_array_map() &&
1756 map() != HEAP->fixed_array_map());
1757 int offset = kHeaderSize + index * kDoubleSize;
1758 WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double());
1759}
1760
1761
1762bool FixedDoubleArray::is_the_hole(int index) {
1763 int offset = kHeaderSize + index * kDoubleSize;
1764 return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset));
1765}
1766
1767
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00001768WriteBarrierMode HeapObject::GetWriteBarrierMode(const AssertNoAllocation&) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001769 Heap* heap = GetHeap();
1770 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
1771 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001772 return UPDATE_WRITE_BARRIER;
1773}
1774
1775
1776void FixedArray::set(int index,
1777 Object* value,
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001778 WriteBarrierMode mode) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001779 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001780 ASSERT(index >= 0 && index < this->length());
1781 int offset = kHeaderSize + index * kPointerSize;
1782 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001783 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001784}
1785
1786
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001787void FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array,
1788 int index,
1789 Object* value) {
1790 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map());
1791 ASSERT(index >= 0 && index < array->length());
1792 int offset = kHeaderSize + index * kPointerSize;
1793 WRITE_FIELD(array, offset, value);
1794 Heap* heap = array->GetHeap();
1795 if (heap->InNewSpace(value)) {
1796 heap->RecordWrite(array->address(), offset);
1797 }
1798}
1799
1800
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00001801void FixedArray::NoWriteBarrierSet(FixedArray* array,
1802 int index,
1803 Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001804 ASSERT(array->map() != HEAP->raw_unchecked_fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001805 ASSERT(index >= 0 && index < array->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001806 ASSERT(!HEAP->InNewSpace(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001807 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value);
1808}
1809
1810
1811void FixedArray::set_undefined(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001812 ASSERT(map() != HEAP->fixed_cow_array_map());
1813 set_undefined(GetHeap(), index);
1814}
1815
1816
1817void FixedArray::set_undefined(Heap* heap, int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001818 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001819 ASSERT(!heap->InNewSpace(heap->undefined_value()));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001820 WRITE_FIELD(this, kHeaderSize + index * kPointerSize,
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001821 heap->undefined_value());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001822}
1823
1824
ager@chromium.org236ad962008-09-25 09:45:57 +00001825void FixedArray::set_null(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001826 set_null(GetHeap(), index);
1827}
1828
1829
1830void FixedArray::set_null(Heap* heap, int index) {
ager@chromium.org236ad962008-09-25 09:45:57 +00001831 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001832 ASSERT(!heap->InNewSpace(heap->null_value()));
1833 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
ager@chromium.org236ad962008-09-25 09:45:57 +00001834}
1835
1836
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001837void FixedArray::set_the_hole(int index) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001838 ASSERT(map() != HEAP->fixed_cow_array_map());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001839 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001840 ASSERT(!HEAP->InNewSpace(HEAP->the_hole_value()));
1841 WRITE_FIELD(this,
1842 kHeaderSize + index * kPointerSize,
1843 GetHeap()->the_hole_value());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001844}
1845
1846
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001847void FixedArray::set_unchecked(int index, Smi* value) {
1848 ASSERT(reinterpret_cast<Object*>(value)->IsSmi());
1849 int offset = kHeaderSize + index * kPointerSize;
1850 WRITE_FIELD(this, offset, value);
1851}
1852
1853
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001854void FixedArray::set_unchecked(Heap* heap,
1855 int index,
whesse@chromium.org4a5224e2010-10-20 12:37:07 +00001856 Object* value,
1857 WriteBarrierMode mode) {
1858 int offset = kHeaderSize + index * kPointerSize;
1859 WRITE_FIELD(this, offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00001860 CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode);
whesse@chromium.org4a5224e2010-10-20 12:37:07 +00001861}
1862
1863
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001864void FixedArray::set_null_unchecked(Heap* heap, int index) {
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001865 ASSERT(index >= 0 && index < this->length());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001866 ASSERT(!HEAP->InNewSpace(heap->null_value()));
1867 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00001868}
1869
1870
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001871Object** FixedArray::data_start() {
1872 return HeapObject::RawField(this, kHeaderSize);
1873}
1874
1875
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001876bool DescriptorArray::IsEmpty() {
danno@chromium.org40cb8782011-05-25 07:58:50 +00001877 ASSERT(this->IsSmi() ||
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001878 this->MayContainTransitions() ||
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001879 this == HEAP->empty_descriptor_array());
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001880 return this->IsSmi() || length() < kFirstIndex;
1881}
1882
1883
1884bool DescriptorArray::MayContainTransitions() {
1885 return length() >= kTransitionsIndex;
danno@chromium.org40cb8782011-05-25 07:58:50 +00001886}
1887
1888
1889int DescriptorArray::bit_field3_storage() {
1890 Object* storage = READ_FIELD(this, kBitField3StorageOffset);
1891 return Smi::cast(storage)->value();
1892}
1893
1894void DescriptorArray::set_bit_field3_storage(int value) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001895 ASSERT(this->MayContainTransitions());
danno@chromium.org40cb8782011-05-25 07:58:50 +00001896 WRITE_FIELD(this, kBitField3StorageOffset, Smi::FromInt(value));
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001897}
1898
1899
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001900void DescriptorArray::NoIncrementalWriteBarrierSwap(FixedArray* array,
1901 int first,
1902 int second) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001903 Object* tmp = array->get(first);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00001904 NoIncrementalWriteBarrierSet(array, first, array->get(second));
1905 NoIncrementalWriteBarrierSet(array, second, tmp);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001906}
1907
1908
1909int DescriptorArray::Search(String* name) {
1910 SLOW_ASSERT(IsSortedNoDuplicates());
1911
1912 // Check for empty descriptor array.
1913 int nof = number_of_descriptors();
1914 if (nof == 0) return kNotFound;
1915
1916 // Fast case: do linear search for small arrays.
1917 const int kMaxElementsForLinearSearch = 8;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001918 if (StringShape(name).IsSymbol() && nof < kMaxElementsForLinearSearch) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001919 return LinearSearch(EXPECT_SORTED, name, nof);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001920 }
1921
1922 // Slow case: perform binary search.
1923 return BinarySearch(name, 0, nof - 1);
1924}
1925
1926
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001927int DescriptorArray::SearchWithCache(String* name) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001928 int number = GetIsolate()->descriptor_lookup_cache()->Lookup(this, name);
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001929 if (number == DescriptorLookupCache::kAbsent) {
1930 number = Search(name);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00001931 GetIsolate()->descriptor_lookup_cache()->Update(this, name, number);
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00001932 }
1933 return number;
1934}
1935
1936
mmassi@chromium.org7028c052012-06-13 11:51:58 +00001937Map* DescriptorArray::elements_transition_map() {
1938 if (!this->MayContainTransitions()) {
1939 return NULL;
1940 }
1941 Object* transition_map = get(kTransitionsIndex);
1942 if (transition_map == Smi::FromInt(0)) {
1943 return NULL;
1944 } else {
1945 return Map::cast(transition_map);
1946 }
1947}
1948
1949
1950void DescriptorArray::set_elements_transition_map(
1951 Map* transition_map, WriteBarrierMode mode) {
1952 ASSERT(this->length() > kTransitionsIndex);
1953 Heap* heap = GetHeap();
1954 WRITE_FIELD(this, kTransitionsOffset, transition_map);
1955 CONDITIONAL_WRITE_BARRIER(
1956 heap, this, kTransitionsOffset, transition_map, mode);
1957 ASSERT(DescriptorArray::cast(this));
1958}
1959
1960
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001961Object** DescriptorArray::GetKeySlot(int descriptor_number) {
1962 ASSERT(descriptor_number < number_of_descriptors());
1963 return HeapObject::RawField(
1964 reinterpret_cast<HeapObject*>(this),
1965 OffsetOfElementAt(ToKeyIndex(descriptor_number)));
1966}
1967
1968
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001969String* DescriptorArray::GetKey(int descriptor_number) {
1970 ASSERT(descriptor_number < number_of_descriptors());
1971 return String::cast(get(ToKeyIndex(descriptor_number)));
1972}
1973
1974
verwaest@chromium.org37141392012-05-31 13:27:02 +00001975Object** DescriptorArray::GetValueSlot(int descriptor_number) {
1976 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001977 return HeapObject::RawField(
1978 reinterpret_cast<HeapObject*>(this),
1979 OffsetOfElementAt(ToValueIndex(descriptor_number)));
verwaest@chromium.org37141392012-05-31 13:27:02 +00001980}
1981
1982
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001983Object* DescriptorArray::GetValue(int descriptor_number) {
1984 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001985 return get(ToValueIndex(descriptor_number));
1986}
1987
1988
1989void DescriptorArray::SetNullValueUnchecked(int descriptor_number, Heap* heap) {
1990 ASSERT(descriptor_number < number_of_descriptors());
1991 set_null_unchecked(heap, ToValueIndex(descriptor_number));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001992}
1993
1994
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00001995PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001996 ASSERT(descriptor_number < number_of_descriptors());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00001997 Object* details = get(ToDetailsIndex(descriptor_number));
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00001998 return PropertyDetails(Smi::cast(details));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001999}
2000
2001
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002002void DescriptorArray::SetDetailsUnchecked(int descriptor_number, Smi* value) {
2003 ASSERT(descriptor_number < number_of_descriptors());
2004 set_unchecked(ToDetailsIndex(descriptor_number), value);
2005}
2006
2007
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002008PropertyType DescriptorArray::GetType(int descriptor_number) {
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00002009 return GetDetails(descriptor_number).type();
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002010}
2011
2012
2013int DescriptorArray::GetFieldIndex(int descriptor_number) {
2014 return Descriptor::IndexFromValue(GetValue(descriptor_number));
2015}
2016
2017
2018JSFunction* DescriptorArray::GetConstantFunction(int descriptor_number) {
2019 return JSFunction::cast(GetValue(descriptor_number));
2020}
2021
2022
2023Object* DescriptorArray::GetCallbacksObject(int descriptor_number) {
2024 ASSERT(GetType(descriptor_number) == CALLBACKS);
2025 return GetValue(descriptor_number);
2026}
2027
2028
2029AccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) {
2030 ASSERT(GetType(descriptor_number) == CALLBACKS);
ager@chromium.orgea91cc52011-05-23 06:06:11 +00002031 Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number));
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002032 return reinterpret_cast<AccessorDescriptor*>(p->foreign_address());
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002033}
2034
2035
2036bool DescriptorArray::IsProperty(int descriptor_number) {
ulan@chromium.org9a21ec42012-03-06 08:42:24 +00002037 Entry entry(this, descriptor_number);
2038 return IsPropertyDescriptor(&entry);
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002039}
2040
2041
rossberg@chromium.org994edf62012-02-06 10:12:55 +00002042bool DescriptorArray::IsTransitionOnly(int descriptor_number) {
2043 switch (GetType(descriptor_number)) {
2044 case MAP_TRANSITION:
2045 case CONSTANT_TRANSITION:
rossberg@chromium.org994edf62012-02-06 10:12:55 +00002046 return true;
2047 case CALLBACKS: {
2048 Object* value = GetValue(descriptor_number);
2049 if (!value->IsAccessorPair()) return false;
2050 AccessorPair* accessors = AccessorPair::cast(value);
2051 return accessors->getter()->IsMap() && accessors->setter()->IsMap();
2052 }
2053 case NORMAL:
2054 case FIELD:
2055 case CONSTANT_FUNCTION:
2056 case HANDLER:
2057 case INTERCEPTOR:
2058 case NULL_DESCRIPTOR:
2059 return false;
2060 }
2061 UNREACHABLE(); // Keep the compiler happy.
2062 return false;
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00002063}
2064
2065
2066bool DescriptorArray::IsNullDescriptor(int descriptor_number) {
2067 return GetType(descriptor_number) == NULL_DESCRIPTOR;
2068}
2069
2070
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002071void DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
2072 desc->Init(GetKey(descriptor_number),
2073 GetValue(descriptor_number),
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00002074 GetDetails(descriptor_number));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002075}
2076
2077
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002078void DescriptorArray::Set(int descriptor_number,
2079 Descriptor* desc,
2080 const WhitenessWitness&) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002081 // Range check.
2082 ASSERT(descriptor_number < number_of_descriptors());
2083
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002084 NoIncrementalWriteBarrierSet(this,
2085 ToKeyIndex(descriptor_number),
2086 desc->GetKey());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002087 NoIncrementalWriteBarrierSet(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002088 ToValueIndex(descriptor_number),
2089 desc->GetValue());
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002090 NoIncrementalWriteBarrierSet(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002091 ToDetailsIndex(descriptor_number),
2092 desc->GetDetails().AsSmi());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002093}
2094
2095
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002096void DescriptorArray::NoIncrementalWriteBarrierSwapDescriptors(
2097 int first, int second) {
2098 NoIncrementalWriteBarrierSwap(this, ToKeyIndex(first), ToKeyIndex(second));
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002099 NoIncrementalWriteBarrierSwap(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002100 ToValueIndex(first),
2101 ToValueIndex(second));
rossberg@chromium.org400388e2012-06-06 09:29:22 +00002102 NoIncrementalWriteBarrierSwap(this,
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00002103 ToDetailsIndex(first),
2104 ToDetailsIndex(second));
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002105}
2106
2107
2108DescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array)
2109 : marking_(array->GetHeap()->incremental_marking()) {
2110 marking_->EnterNoMarkingScope();
2111 if (array->number_of_descriptors() > 0) {
2112 ASSERT(Marking::Color(array) == Marking::WHITE_OBJECT);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002113 }
2114}
2115
2116
2117DescriptorArray::WhitenessWitness::~WhitenessWitness() {
2118 marking_->LeaveNoMarkingScope();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002119}
2120
2121
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002122template<typename Shape, typename Key>
ricow@chromium.org2c99e282011-07-28 09:15:17 +00002123int HashTable<Shape, Key>::ComputeCapacity(int at_least_space_for) {
2124 const int kMinCapacity = 32;
2125 int capacity = RoundUpToPowerOf2(at_least_space_for * 2);
2126 if (capacity < kMinCapacity) {
2127 capacity = kMinCapacity; // Guarantee min capacity.
2128 }
2129 return capacity;
2130}
2131
2132
2133template<typename Shape, typename Key>
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002134int HashTable<Shape, Key>::FindEntry(Key key) {
2135 return FindEntry(GetIsolate(), key);
2136}
2137
2138
2139// Find entry for key otherwise return kNotFound.
2140template<typename Shape, typename Key>
2141int HashTable<Shape, Key>::FindEntry(Isolate* isolate, Key key) {
2142 uint32_t capacity = Capacity();
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002143 uint32_t entry = FirstProbe(HashTable<Shape, Key>::Hash(key), capacity);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002144 uint32_t count = 1;
2145 // EnsureCapacity will guarantee the hash table is never full.
2146 while (true) {
2147 Object* element = KeyAt(entry);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00002148 // Empty entry.
2149 if (element == isolate->heap()->raw_unchecked_undefined_value()) break;
2150 if (element != isolate->heap()->raw_unchecked_the_hole_value() &&
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002151 Shape::IsMatch(key, element)) return entry;
2152 entry = NextProbe(entry, count++, capacity);
2153 }
2154 return kNotFound;
2155}
2156
2157
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002158bool SeededNumberDictionary::requires_slow_elements() {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002159 Object* max_index_object = get(kMaxNumberKeyIndex);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002160 if (!max_index_object->IsSmi()) return false;
2161 return 0 !=
2162 (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
2163}
2164
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002165uint32_t SeededNumberDictionary::max_number_key() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002166 ASSERT(!requires_slow_elements());
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002167 Object* max_index_object = get(kMaxNumberKeyIndex);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002168 if (!max_index_object->IsSmi()) return 0;
2169 uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
2170 return value >> kRequiresSlowElementsTagSize;
2171}
2172
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00002173void SeededNumberDictionary::set_requires_slow_elements() {
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00002174 set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002175}
2176
2177
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002178// ------------------------------------
2179// Cast operations
2180
2181
2182CAST_ACCESSOR(FixedArray)
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002183CAST_ACCESSOR(FixedDoubleArray)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002184CAST_ACCESSOR(DescriptorArray)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00002185CAST_ACCESSOR(DeoptimizationInputData)
2186CAST_ACCESSOR(DeoptimizationOutputData)
danno@chromium.orgfa458e42012-02-01 10:48:36 +00002187CAST_ACCESSOR(TypeFeedbackCells)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002188CAST_ACCESSOR(SymbolTable)
ager@chromium.orgac091b72010-05-05 07:34:42 +00002189CAST_ACCESSOR(JSFunctionResultCache)
ricow@chromium.org65fae842010-08-25 15:26:24 +00002190CAST_ACCESSOR(NormalizedMapCache)
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00002191CAST_ACCESSOR(ScopeInfo)
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00002192CAST_ACCESSOR(CompilationCacheTable)
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00002193CAST_ACCESSOR(CodeCacheHashTable)
jkummerow@chromium.orge297f592011-06-08 10:05:15 +00002194CAST_ACCESSOR(PolymorphicCodeCacheHashTable)
ager@chromium.org236ad962008-09-25 09:45:57 +00002195CAST_ACCESSOR(MapCache)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002196CAST_ACCESSOR(String)
2197CAST_ACCESSOR(SeqString)
ager@chromium.org7c537e22008-10-16 08:43:32 +00002198CAST_ACCESSOR(SeqAsciiString)
2199CAST_ACCESSOR(SeqTwoByteString)
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002200CAST_ACCESSOR(SlicedString)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002201CAST_ACCESSOR(ConsString)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002202CAST_ACCESSOR(ExternalString)
2203CAST_ACCESSOR(ExternalAsciiString)
2204CAST_ACCESSOR(ExternalTwoByteString)
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00002205CAST_ACCESSOR(JSReceiver)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002206CAST_ACCESSOR(JSObject)
2207CAST_ACCESSOR(Smi)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002208CAST_ACCESSOR(HeapObject)
2209CAST_ACCESSOR(HeapNumber)
2210CAST_ACCESSOR(Oddball)
kasperl@chromium.org2abc4502009-07-02 07:00:29 +00002211CAST_ACCESSOR(JSGlobalPropertyCell)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002212CAST_ACCESSOR(SharedFunctionInfo)
2213CAST_ACCESSOR(Map)
2214CAST_ACCESSOR(JSFunction)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002215CAST_ACCESSOR(GlobalObject)
2216CAST_ACCESSOR(JSGlobalProxy)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002217CAST_ACCESSOR(JSGlobalObject)
2218CAST_ACCESSOR(JSBuiltinsObject)
2219CAST_ACCESSOR(Code)
2220CAST_ACCESSOR(JSArray)
ager@chromium.org236ad962008-09-25 09:45:57 +00002221CAST_ACCESSOR(JSRegExp)
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00002222CAST_ACCESSOR(JSProxy)
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00002223CAST_ACCESSOR(JSFunctionProxy)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00002224CAST_ACCESSOR(JSSet)
2225CAST_ACCESSOR(JSMap)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002226CAST_ACCESSOR(JSWeakMap)
ager@chromium.orgea91cc52011-05-23 06:06:11 +00002227CAST_ACCESSOR(Foreign)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002228CAST_ACCESSOR(ByteArray)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002229CAST_ACCESSOR(FreeSpace)
ager@chromium.org3811b432009-10-28 14:53:37 +00002230CAST_ACCESSOR(ExternalArray)
2231CAST_ACCESSOR(ExternalByteArray)
2232CAST_ACCESSOR(ExternalUnsignedByteArray)
2233CAST_ACCESSOR(ExternalShortArray)
2234CAST_ACCESSOR(ExternalUnsignedShortArray)
2235CAST_ACCESSOR(ExternalIntArray)
2236CAST_ACCESSOR(ExternalUnsignedIntArray)
2237CAST_ACCESSOR(ExternalFloatArray)
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002238CAST_ACCESSOR(ExternalDoubleArray)
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002239CAST_ACCESSOR(ExternalPixelArray)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002240CAST_ACCESSOR(Struct)
2241
2242
2243#define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name)
2244 STRUCT_LIST(MAKE_STRUCT_CAST)
2245#undef MAKE_STRUCT_CAST
2246
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00002247
2248template <typename Shape, typename Key>
2249HashTable<Shape, Key>* HashTable<Shape, Key>::cast(Object* obj) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002250 ASSERT(obj->IsHashTable());
2251 return reinterpret_cast<HashTable*>(obj);
2252}
2253
2254
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002255SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002256SMI_ACCESSORS(FreeSpace, size, kSizeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002257
ager@chromium.orgac091b72010-05-05 07:34:42 +00002258SMI_ACCESSORS(String, length, kLengthOffset)
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00002259
2260
2261uint32_t String::hash_field() {
2262 return READ_UINT32_FIELD(this, kHashFieldOffset);
2263}
2264
2265
2266void String::set_hash_field(uint32_t value) {
2267 WRITE_UINT32_FIELD(this, kHashFieldOffset, value);
ricow@chromium.org30ce4112010-05-31 10:38:25 +00002268#if V8_HOST_ARCH_64_BIT
2269 WRITE_UINT32_FIELD(this, kHashFieldOffset + kIntSize, 0);
2270#endif
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00002271}
2272
2273
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002274bool String::Equals(String* other) {
2275 if (other == this) return true;
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002276 if (StringShape(this).IsSymbol() && StringShape(other).IsSymbol()) {
2277 return false;
2278 }
2279 return SlowEquals(other);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002280}
2281
2282
lrn@chromium.org303ada72010-10-27 09:33:13 +00002283MaybeObject* String::TryFlatten(PretenureFlag pretenure) {
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002284 if (!StringShape(this).IsCons()) return this;
2285 ConsString* cons = ConsString::cast(this);
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002286 if (cons->IsFlat()) return cons->first();
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00002287 return SlowTryFlatten(pretenure);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002288}
2289
2290
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002291String* String::TryFlattenGetString(PretenureFlag pretenure) {
lrn@chromium.org303ada72010-10-27 09:33:13 +00002292 MaybeObject* flat = TryFlatten(pretenure);
2293 Object* successfully_flattened;
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002294 if (!flat->ToObject(&successfully_flattened)) return this;
2295 return String::cast(successfully_flattened);
erik.corry@gmail.com9dfbea42010-05-21 12:58:28 +00002296}
2297
2298
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002299uint16_t String::Get(int index) {
2300 ASSERT(index >= 0 && index < length());
2301 switch (StringShape(this).full_representation_tag()) {
ager@chromium.org870a0b62008-11-04 11:43:05 +00002302 case kSeqStringTag | kAsciiStringTag:
2303 return SeqAsciiString::cast(this)->SeqAsciiStringGet(index);
2304 case kSeqStringTag | kTwoByteStringTag:
2305 return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
2306 case kConsStringTag | kAsciiStringTag:
2307 case kConsStringTag | kTwoByteStringTag:
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002308 return ConsString::cast(this)->ConsStringGet(index);
ager@chromium.org870a0b62008-11-04 11:43:05 +00002309 case kExternalStringTag | kAsciiStringTag:
2310 return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
2311 case kExternalStringTag | kTwoByteStringTag:
2312 return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002313 case kSlicedStringTag | kAsciiStringTag:
2314 case kSlicedStringTag | kTwoByteStringTag:
2315 return SlicedString::cast(this)->SlicedStringGet(index);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002316 default:
2317 break;
2318 }
2319
2320 UNREACHABLE();
2321 return 0;
2322}
2323
2324
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002325void String::Set(int index, uint16_t value) {
2326 ASSERT(index >= 0 && index < length());
2327 ASSERT(StringShape(this).IsSequential());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002328
ager@chromium.org5ec48922009-05-05 07:25:34 +00002329 return this->IsAsciiRepresentation()
ager@chromium.org7c537e22008-10-16 08:43:32 +00002330 ? SeqAsciiString::cast(this)->SeqAsciiStringSet(index, value)
2331 : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002332}
2333
2334
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002335bool String::IsFlat() {
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002336 if (!StringShape(this).IsCons()) return true;
2337 return ConsString::cast(this)->second()->length() == 0;
2338}
2339
2340
2341String* String::GetUnderlying() {
2342 // Giving direct access to underlying string only makes sense if the
2343 // wrapping string is already flattened.
2344 ASSERT(this->IsFlat());
2345 ASSERT(StringShape(this).IsIndirect());
2346 STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset);
2347 const int kUnderlyingOffset = SlicedString::kParentOffset;
2348 return String::cast(READ_FIELD(this, kUnderlyingOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002349}
2350
2351
ager@chromium.org7c537e22008-10-16 08:43:32 +00002352uint16_t SeqAsciiString::SeqAsciiStringGet(int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002353 ASSERT(index >= 0 && index < length());
2354 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
2355}
2356
2357
ager@chromium.org7c537e22008-10-16 08:43:32 +00002358void SeqAsciiString::SeqAsciiStringSet(int index, uint16_t value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002359 ASSERT(index >= 0 && index < length() && value <= kMaxAsciiCharCode);
2360 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize,
2361 static_cast<byte>(value));
2362}
2363
2364
ager@chromium.org7c537e22008-10-16 08:43:32 +00002365Address SeqAsciiString::GetCharsAddress() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002366 return FIELD_ADDR(this, kHeaderSize);
2367}
2368
2369
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002370char* SeqAsciiString::GetChars() {
2371 return reinterpret_cast<char*>(GetCharsAddress());
2372}
2373
2374
ager@chromium.org7c537e22008-10-16 08:43:32 +00002375Address SeqTwoByteString::GetCharsAddress() {
2376 return FIELD_ADDR(this, kHeaderSize);
2377}
2378
2379
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00002380uc16* SeqTwoByteString::GetChars() {
2381 return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize));
2382}
2383
2384
ager@chromium.org7c537e22008-10-16 08:43:32 +00002385uint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002386 ASSERT(index >= 0 && index < length());
2387 return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize);
2388}
2389
2390
ager@chromium.org7c537e22008-10-16 08:43:32 +00002391void SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002392 ASSERT(index >= 0 && index < length());
2393 WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value);
2394}
2395
2396
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002397int SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) {
ager@chromium.orgac091b72010-05-05 07:34:42 +00002398 return SizeFor(length());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002399}
2400
2401
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00002402int SeqAsciiString::SeqAsciiStringSize(InstanceType instance_type) {
ager@chromium.orgac091b72010-05-05 07:34:42 +00002403 return SizeFor(length());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002404}
2405
2406
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002407String* SlicedString::parent() {
2408 return String::cast(READ_FIELD(this, kParentOffset));
2409}
2410
2411
2412void SlicedString::set_parent(String* parent) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002413 ASSERT(parent->IsSeqString() || parent->IsExternalString());
ricow@chromium.org4668a2c2011-08-29 10:41:00 +00002414 WRITE_FIELD(this, kParentOffset, parent);
2415}
2416
2417
2418SMI_ACCESSORS(SlicedString, offset, kOffsetOffset)
2419
2420
ager@chromium.org870a0b62008-11-04 11:43:05 +00002421String* ConsString::first() {
2422 return String::cast(READ_FIELD(this, kFirstOffset));
2423}
2424
2425
2426Object* ConsString::unchecked_first() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002427 return READ_FIELD(this, kFirstOffset);
2428}
2429
2430
ager@chromium.org870a0b62008-11-04 11:43:05 +00002431void ConsString::set_first(String* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002432 WRITE_FIELD(this, kFirstOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002433 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kFirstOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002434}
2435
2436
ager@chromium.org870a0b62008-11-04 11:43:05 +00002437String* ConsString::second() {
2438 return String::cast(READ_FIELD(this, kSecondOffset));
2439}
2440
2441
2442Object* ConsString::unchecked_second() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002443 return READ_FIELD(this, kSecondOffset);
2444}
2445
2446
ager@chromium.org870a0b62008-11-04 11:43:05 +00002447void ConsString::set_second(String* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002448 WRITE_FIELD(this, kSecondOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002449 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kSecondOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002450}
2451
2452
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002453bool ExternalString::is_short() {
2454 InstanceType type = map()->instance_type();
2455 return (type & kShortExternalStringMask) == kShortExternalStringTag;
erikcorry0ad885c2011-11-21 13:51:57 +00002456}
2457
2458
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002459const ExternalAsciiString::Resource* ExternalAsciiString::resource() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002460 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
2461}
2462
2463
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002464void ExternalAsciiString::update_data_cache() {
2465 if (is_short()) return;
2466 const char** data_field =
2467 reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset));
2468 *data_field = resource()->data();
2469}
2470
2471
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002472void ExternalAsciiString::set_resource(
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002473 const ExternalAsciiString::Resource* resource) {
2474 *reinterpret_cast<const Resource**>(
2475 FIELD_ADDR(this, kResourceOffset)) = resource;
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002476 if (resource != NULL) update_data_cache();
erikcorry0ad885c2011-11-21 13:51:57 +00002477}
2478
2479
2480const char* ExternalAsciiString::GetChars() {
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002481 return resource()->data();
erikcorry0ad885c2011-11-21 13:51:57 +00002482}
2483
2484
2485uint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) {
2486 ASSERT(index >= 0 && index < length());
2487 return GetChars()[index];
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002488}
2489
2490
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002491const ExternalTwoByteString::Resource* ExternalTwoByteString::resource() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002492 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
2493}
2494
2495
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002496void ExternalTwoByteString::update_data_cache() {
2497 if (is_short()) return;
2498 const uint16_t** data_field =
2499 reinterpret_cast<const uint16_t**>(FIELD_ADDR(this, kResourceDataOffset));
2500 *data_field = resource()->data();
2501}
2502
2503
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002504void ExternalTwoByteString::set_resource(
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002505 const ExternalTwoByteString::Resource* resource) {
2506 *reinterpret_cast<const Resource**>(
2507 FIELD_ADDR(this, kResourceOffset)) = resource;
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002508 if (resource != NULL) update_data_cache();
erikcorry0ad885c2011-11-21 13:51:57 +00002509}
2510
2511
2512const uint16_t* ExternalTwoByteString::GetChars() {
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00002513 return resource()->data();
erikcorry0ad885c2011-11-21 13:51:57 +00002514}
2515
2516
2517uint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) {
2518 ASSERT(index >= 0 && index < length());
2519 return GetChars()[index];
2520}
2521
2522
2523const uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData(
2524 unsigned start) {
2525 return GetChars() + start;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002526}
2527
2528
ager@chromium.orgac091b72010-05-05 07:34:42 +00002529void JSFunctionResultCache::MakeZeroSize() {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002530 set_finger_index(kEntriesIndex);
2531 set_size(kEntriesIndex);
ager@chromium.orgac091b72010-05-05 07:34:42 +00002532}
2533
2534
2535void JSFunctionResultCache::Clear() {
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002536 int cache_size = size();
ager@chromium.orgac091b72010-05-05 07:34:42 +00002537 Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex));
fschneider@chromium.orge03fb642010-11-01 12:34:09 +00002538 MemsetPointer(entries_start,
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00002539 GetHeap()->the_hole_value(),
fschneider@chromium.orge03fb642010-11-01 12:34:09 +00002540 cache_size - kEntriesIndex);
ager@chromium.orgac091b72010-05-05 07:34:42 +00002541 MakeZeroSize();
2542}
2543
2544
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00002545int JSFunctionResultCache::size() {
2546 return Smi::cast(get(kCacheSizeIndex))->value();
2547}
2548
2549
2550void JSFunctionResultCache::set_size(int size) {
2551 set(kCacheSizeIndex, Smi::FromInt(size));
2552}
2553
2554
2555int JSFunctionResultCache::finger_index() {
2556 return Smi::cast(get(kFingerIndex))->value();
2557}
2558
2559
2560void JSFunctionResultCache::set_finger_index(int finger_index) {
2561 set(kFingerIndex, Smi::FromInt(finger_index));
2562}
2563
2564
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002565byte ByteArray::get(int index) {
2566 ASSERT(index >= 0 && index < this->length());
2567 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
2568}
2569
2570
2571void ByteArray::set(int index, byte value) {
2572 ASSERT(index >= 0 && index < this->length());
2573 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
2574}
2575
2576
2577int ByteArray::get_int(int index) {
2578 ASSERT(index >= 0 && (index * kIntSize) < this->length());
2579 return READ_INT_FIELD(this, kHeaderSize + index * kIntSize);
2580}
2581
2582
2583ByteArray* ByteArray::FromDataStartAddress(Address address) {
2584 ASSERT_TAG_ALIGNED(address);
2585 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
2586}
2587
2588
2589Address ByteArray::GetDataStartAddress() {
2590 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
2591}
2592
2593
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002594uint8_t* ExternalPixelArray::external_pixel_pointer() {
2595 return reinterpret_cast<uint8_t*>(external_pointer());
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002596}
2597
2598
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002599uint8_t ExternalPixelArray::get_scalar(int index) {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002600 ASSERT((index >= 0) && (index < this->length()));
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002601 uint8_t* ptr = external_pixel_pointer();
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002602 return ptr[index];
2603}
2604
2605
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002606MaybeObject* ExternalPixelArray::get(int index) {
2607 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2608}
2609
2610
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002611void ExternalPixelArray::set(int index, uint8_t value) {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002612 ASSERT((index >= 0) && (index < this->length()));
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00002613 uint8_t* ptr = external_pixel_pointer();
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00002614 ptr[index] = value;
2615}
2616
2617
ager@chromium.org3811b432009-10-28 14:53:37 +00002618void* ExternalArray::external_pointer() {
2619 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
2620 return reinterpret_cast<void*>(ptr);
2621}
2622
2623
2624void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
2625 intptr_t ptr = reinterpret_cast<intptr_t>(value);
2626 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
2627}
2628
2629
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002630int8_t ExternalByteArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002631 ASSERT((index >= 0) && (index < this->length()));
2632 int8_t* ptr = static_cast<int8_t*>(external_pointer());
2633 return ptr[index];
2634}
2635
2636
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002637MaybeObject* ExternalByteArray::get(int index) {
2638 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2639}
2640
2641
ager@chromium.org3811b432009-10-28 14:53:37 +00002642void ExternalByteArray::set(int index, int8_t value) {
2643 ASSERT((index >= 0) && (index < this->length()));
2644 int8_t* ptr = static_cast<int8_t*>(external_pointer());
2645 ptr[index] = value;
2646}
2647
2648
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002649uint8_t ExternalUnsignedByteArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002650 ASSERT((index >= 0) && (index < this->length()));
2651 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
2652 return ptr[index];
2653}
2654
2655
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002656MaybeObject* ExternalUnsignedByteArray::get(int index) {
2657 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2658}
2659
2660
ager@chromium.org3811b432009-10-28 14:53:37 +00002661void ExternalUnsignedByteArray::set(int index, uint8_t value) {
2662 ASSERT((index >= 0) && (index < this->length()));
2663 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
2664 ptr[index] = value;
2665}
2666
2667
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002668int16_t ExternalShortArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002669 ASSERT((index >= 0) && (index < this->length()));
2670 int16_t* ptr = static_cast<int16_t*>(external_pointer());
2671 return ptr[index];
2672}
2673
2674
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002675MaybeObject* ExternalShortArray::get(int index) {
2676 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2677}
2678
2679
ager@chromium.org3811b432009-10-28 14:53:37 +00002680void ExternalShortArray::set(int index, int16_t value) {
2681 ASSERT((index >= 0) && (index < this->length()));
2682 int16_t* ptr = static_cast<int16_t*>(external_pointer());
2683 ptr[index] = value;
2684}
2685
2686
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002687uint16_t ExternalUnsignedShortArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002688 ASSERT((index >= 0) && (index < this->length()));
2689 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
2690 return ptr[index];
2691}
2692
2693
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002694MaybeObject* ExternalUnsignedShortArray::get(int index) {
2695 return Smi::FromInt(static_cast<int>(get_scalar(index)));
2696}
2697
2698
ager@chromium.org3811b432009-10-28 14:53:37 +00002699void ExternalUnsignedShortArray::set(int index, uint16_t value) {
2700 ASSERT((index >= 0) && (index < this->length()));
2701 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
2702 ptr[index] = value;
2703}
2704
2705
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002706int32_t ExternalIntArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002707 ASSERT((index >= 0) && (index < this->length()));
2708 int32_t* ptr = static_cast<int32_t*>(external_pointer());
2709 return ptr[index];
2710}
2711
2712
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002713MaybeObject* ExternalIntArray::get(int index) {
2714 return GetHeap()->NumberFromInt32(get_scalar(index));
2715}
2716
2717
ager@chromium.org3811b432009-10-28 14:53:37 +00002718void ExternalIntArray::set(int index, int32_t value) {
2719 ASSERT((index >= 0) && (index < this->length()));
2720 int32_t* ptr = static_cast<int32_t*>(external_pointer());
2721 ptr[index] = value;
2722}
2723
2724
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002725uint32_t ExternalUnsignedIntArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002726 ASSERT((index >= 0) && (index < this->length()));
2727 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
2728 return ptr[index];
2729}
2730
2731
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002732MaybeObject* ExternalUnsignedIntArray::get(int index) {
2733 return GetHeap()->NumberFromUint32(get_scalar(index));
2734}
2735
2736
ager@chromium.org3811b432009-10-28 14:53:37 +00002737void ExternalUnsignedIntArray::set(int index, uint32_t value) {
2738 ASSERT((index >= 0) && (index < this->length()));
2739 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
2740 ptr[index] = value;
2741}
2742
2743
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002744float ExternalFloatArray::get_scalar(int index) {
ager@chromium.org3811b432009-10-28 14:53:37 +00002745 ASSERT((index >= 0) && (index < this->length()));
2746 float* ptr = static_cast<float*>(external_pointer());
2747 return ptr[index];
2748}
2749
2750
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002751MaybeObject* ExternalFloatArray::get(int index) {
2752 return GetHeap()->NumberFromDouble(get_scalar(index));
2753}
2754
2755
ager@chromium.org3811b432009-10-28 14:53:37 +00002756void ExternalFloatArray::set(int index, float value) {
2757 ASSERT((index >= 0) && (index < this->length()));
2758 float* ptr = static_cast<float*>(external_pointer());
2759 ptr[index] = value;
2760}
2761
ager@chromium.org6a2b0aa2010-07-13 20:58:03 +00002762
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002763double ExternalDoubleArray::get_scalar(int index) {
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002764 ASSERT((index >= 0) && (index < this->length()));
2765 double* ptr = static_cast<double*>(external_pointer());
2766 return ptr[index];
2767}
2768
2769
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00002770MaybeObject* ExternalDoubleArray::get(int index) {
2771 return GetHeap()->NumberFromDouble(get_scalar(index));
2772}
2773
2774
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00002775void ExternalDoubleArray::set(int index, double value) {
2776 ASSERT((index >= 0) && (index < this->length()));
2777 double* ptr = static_cast<double*>(external_pointer());
2778 ptr[index] = value;
2779}
2780
2781
ager@chromium.org5b2fbee2010-09-08 06:38:15 +00002782int Map::visitor_id() {
2783 return READ_BYTE_FIELD(this, kVisitorIdOffset);
2784}
2785
2786
2787void Map::set_visitor_id(int id) {
2788 ASSERT(0 <= id && id < 256);
2789 WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id));
2790}
2791
ager@chromium.org3811b432009-10-28 14:53:37 +00002792
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002793int Map::instance_size() {
ager@chromium.org7c537e22008-10-16 08:43:32 +00002794 return READ_BYTE_FIELD(this, kInstanceSizeOffset) << kPointerSizeLog2;
2795}
2796
2797
2798int Map::inobject_properties() {
2799 return READ_BYTE_FIELD(this, kInObjectPropertiesOffset);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002800}
2801
2802
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00002803int Map::pre_allocated_property_fields() {
2804 return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset);
2805}
2806
2807
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002808int HeapObject::SizeFromMap(Map* map) {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002809 int instance_size = map->instance_size();
2810 if (instance_size != kVariableSizeSentinel) return instance_size;
2811 // We can ignore the "symbol" bit becase it is only set for symbols
2812 // and implies a string type.
2813 int instance_type = static_cast<int>(map->instance_type()) & ~kIsSymbolMask;
ager@chromium.org5aa501c2009-06-23 07:57:28 +00002814 // Only inline the most frequent cases.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002815 if (instance_type == FIXED_ARRAY_TYPE) {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00002816 return FixedArray::BodyDescriptor::SizeOf(map, this);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002817 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002818 if (instance_type == ASCII_STRING_TYPE) {
2819 return SeqAsciiString::SizeFor(
2820 reinterpret_cast<SeqAsciiString*>(this)->length());
2821 }
ager@chromium.org5aa501c2009-06-23 07:57:28 +00002822 if (instance_type == BYTE_ARRAY_TYPE) {
2823 return reinterpret_cast<ByteArray*>(this)->ByteArraySize();
2824 }
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00002825 if (instance_type == FREE_SPACE_TYPE) {
2826 return reinterpret_cast<FreeSpace*>(this)->size();
2827 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002828 if (instance_type == STRING_TYPE) {
2829 return SeqTwoByteString::SizeFor(
2830 reinterpret_cast<SeqTwoByteString*>(this)->length());
2831 }
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00002832 if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) {
2833 return FixedDoubleArray::SizeFor(
2834 reinterpret_cast<FixedDoubleArray*>(this)->length());
2835 }
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00002836 ASSERT(instance_type == CODE_TYPE);
2837 return reinterpret_cast<Code*>(this)->CodeSize();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002838}
2839
2840
2841void Map::set_instance_size(int value) {
kasperl@chromium.org71affb52009-05-26 05:44:31 +00002842 ASSERT_EQ(0, value & (kPointerSize - 1));
ager@chromium.org7c537e22008-10-16 08:43:32 +00002843 value >>= kPointerSizeLog2;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002844 ASSERT(0 <= value && value < 256);
2845 WRITE_BYTE_FIELD(this, kInstanceSizeOffset, static_cast<byte>(value));
2846}
2847
2848
ager@chromium.org7c537e22008-10-16 08:43:32 +00002849void Map::set_inobject_properties(int value) {
2850 ASSERT(0 <= value && value < 256);
2851 WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value));
2852}
2853
2854
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00002855void Map::set_pre_allocated_property_fields(int value) {
2856 ASSERT(0 <= value && value < 256);
2857 WRITE_BYTE_FIELD(this,
2858 kPreAllocatedPropertyFieldsOffset,
2859 static_cast<byte>(value));
2860}
2861
2862
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002863InstanceType Map::instance_type() {
2864 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
2865}
2866
2867
2868void Map::set_instance_type(InstanceType value) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002869 WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
2870}
2871
2872
2873int Map::unused_property_fields() {
2874 return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset);
2875}
2876
2877
2878void Map::set_unused_property_fields(int value) {
2879 WRITE_BYTE_FIELD(this, kUnusedPropertyFieldsOffset, Min(value, 255));
2880}
2881
2882
2883byte Map::bit_field() {
2884 return READ_BYTE_FIELD(this, kBitFieldOffset);
2885}
2886
2887
2888void Map::set_bit_field(byte value) {
2889 WRITE_BYTE_FIELD(this, kBitFieldOffset, value);
2890}
2891
2892
ager@chromium.org3a37e9b2009-04-27 09:26:21 +00002893byte Map::bit_field2() {
2894 return READ_BYTE_FIELD(this, kBitField2Offset);
2895}
2896
2897
2898void Map::set_bit_field2(byte value) {
2899 WRITE_BYTE_FIELD(this, kBitField2Offset, value);
2900}
2901
2902
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002903void Map::set_non_instance_prototype(bool value) {
2904 if (value) {
2905 set_bit_field(bit_field() | (1 << kHasNonInstancePrototype));
2906 } else {
2907 set_bit_field(bit_field() & ~(1 << kHasNonInstancePrototype));
2908 }
2909}
2910
2911
2912bool Map::has_non_instance_prototype() {
2913 return ((1 << kHasNonInstancePrototype) & bit_field()) != 0;
2914}
2915
2916
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002917void Map::set_function_with_prototype(bool value) {
2918 if (value) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002919 set_bit_field3(bit_field3() | (1 << kFunctionWithPrototype));
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002920 } else {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002921 set_bit_field3(bit_field3() & ~(1 << kFunctionWithPrototype));
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002922 }
2923}
2924
2925
2926bool Map::function_with_prototype() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00002927 return ((1 << kFunctionWithPrototype) & bit_field3()) != 0;
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00002928}
2929
2930
ager@chromium.org870a0b62008-11-04 11:43:05 +00002931void Map::set_is_access_check_needed(bool access_check_needed) {
2932 if (access_check_needed) {
2933 set_bit_field(bit_field() | (1 << kIsAccessCheckNeeded));
2934 } else {
2935 set_bit_field(bit_field() & ~(1 << kIsAccessCheckNeeded));
2936 }
2937}
2938
2939
2940bool Map::is_access_check_needed() {
2941 return ((1 << kIsAccessCheckNeeded) & bit_field()) != 0;
2942}
2943
2944
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00002945void Map::set_is_extensible(bool value) {
2946 if (value) {
2947 set_bit_field2(bit_field2() | (1 << kIsExtensible));
2948 } else {
2949 set_bit_field2(bit_field2() & ~(1 << kIsExtensible));
2950 }
2951}
2952
2953bool Map::is_extensible() {
2954 return ((1 << kIsExtensible) & bit_field2()) != 0;
2955}
2956
2957
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002958void Map::set_attached_to_shared_function_info(bool value) {
2959 if (value) {
2960 set_bit_field2(bit_field2() | (1 << kAttachedToSharedFunctionInfo));
2961 } else {
2962 set_bit_field2(bit_field2() & ~(1 << kAttachedToSharedFunctionInfo));
2963 }
2964}
2965
2966bool Map::attached_to_shared_function_info() {
2967 return ((1 << kAttachedToSharedFunctionInfo) & bit_field2()) != 0;
2968}
2969
2970
2971void Map::set_is_shared(bool value) {
2972 if (value) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002973 set_bit_field3(bit_field3() | (1 << kIsShared));
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002974 } else {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002975 set_bit_field3(bit_field3() & ~(1 << kIsShared));
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002976 }
2977}
2978
2979bool Map::is_shared() {
danno@chromium.org40cb8782011-05-25 07:58:50 +00002980 return ((1 << kIsShared) & bit_field3()) != 0;
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00002981}
2982
2983
2984JSFunction* Map::unchecked_constructor() {
2985 return reinterpret_cast<JSFunction*>(READ_FIELD(this, kConstructorOffset));
2986}
2987
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00002988
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002989Code::Flags Code::flags() {
2990 return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
2991}
2992
2993
2994void Code::set_flags(Code::Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00002995 STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002996 // Make sure that all call stubs have an arguments count.
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00002997 ASSERT((ExtractKindFromFlags(flags) != CALL_IC &&
2998 ExtractKindFromFlags(flags) != KEYED_CALL_IC) ||
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002999 ExtractArgumentsCountFromFlags(flags) >= 0);
3000 WRITE_INT_FIELD(this, kFlagsOffset, flags);
3001}
3002
3003
3004Code::Kind Code::kind() {
3005 return ExtractKindFromFlags(flags());
3006}
3007
3008
kasper.lund7276f142008-07-30 08:49:36 +00003009InlineCacheState Code::ic_state() {
3010 InlineCacheState result = ExtractICStateFromFlags(flags());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003011 // Only allow uninitialized or debugger states for non-IC code
3012 // objects. This is used in the debugger to determine whether or not
3013 // a call to code object has been replaced with a debug break call.
3014 ASSERT(is_inline_cache_stub() ||
3015 result == UNINITIALIZED ||
3016 result == DEBUG_BREAK ||
3017 result == DEBUG_PREPARE_STEP_IN);
3018 return result;
3019}
3020
3021
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003022Code::ExtraICState Code::extra_ic_state() {
3023 ASSERT(is_inline_cache_stub());
3024 return ExtractExtraICStateFromFlags(flags());
3025}
3026
3027
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003028PropertyType Code::type() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003029 return ExtractTypeFromFlags(flags());
3030}
3031
3032
3033int Code::arguments_count() {
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00003034 ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003035 return ExtractArgumentsCountFromFlags(flags());
3036}
3037
3038
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003039int Code::major_key() {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003040 ASSERT(kind() == STUB ||
danno@chromium.org40cb8782011-05-25 07:58:50 +00003041 kind() == UNARY_OP_IC ||
3042 kind() == BINARY_OP_IC ||
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003043 kind() == COMPARE_IC ||
3044 kind() == TO_BOOLEAN_IC);
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003045 return READ_BYTE_FIELD(this, kStubMajorKeyOffset);
kasper.lund7276f142008-07-30 08:49:36 +00003046}
3047
3048
ricow@chromium.orgd236f4d2010-09-01 06:52:08 +00003049void Code::set_major_key(int major) {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003050 ASSERT(kind() == STUB ||
danno@chromium.org40cb8782011-05-25 07:58:50 +00003051 kind() == UNARY_OP_IC ||
3052 kind() == BINARY_OP_IC ||
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003053 kind() == COMPARE_IC ||
3054 kind() == TO_BOOLEAN_IC);
kasper.lund7276f142008-07-30 08:49:36 +00003055 ASSERT(0 <= major && major < 256);
3056 WRITE_BYTE_FIELD(this, kStubMajorKeyOffset, major);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003057}
3058
3059
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003060bool Code::is_pregenerated() {
3061 return kind() == STUB && IsPregeneratedField::decode(flags());
3062}
3063
3064
3065void Code::set_is_pregenerated(bool value) {
3066 ASSERT(kind() == STUB);
3067 Flags f = flags();
3068 f = static_cast<Flags>(IsPregeneratedField::update(f, value));
3069 set_flags(f);
3070}
3071
3072
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003073bool Code::optimizable() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003074 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003075 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1;
3076}
3077
3078
3079void Code::set_optimizable(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003080 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003081 WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0);
3082}
3083
3084
3085bool Code::has_deoptimization_support() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003086 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003087 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3088 return FullCodeFlagsHasDeoptimizationSupportField::decode(flags);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003089}
3090
3091
3092void Code::set_has_deoptimization_support(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003093 ASSERT_EQ(FUNCTION, kind());
lrn@chromium.org34e60782011-09-15 07:25:40 +00003094 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3095 flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value);
3096 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
3097}
3098
3099
3100bool Code::has_debug_break_slots() {
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 FullCodeFlagsHasDebugBreakSlotsField::decode(flags);
3104}
3105
3106
3107void Code::set_has_debug_break_slots(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 = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value);
3111 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003112}
3113
3114
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003115bool Code::is_compiled_optimizable() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003116 ASSERT_EQ(FUNCTION, kind());
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003117 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3118 return FullCodeFlagsIsCompiledOptimizable::decode(flags);
3119}
3120
3121
3122void Code::set_compiled_optimizable(bool value) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003123 ASSERT_EQ(FUNCTION, kind());
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003124 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
3125 flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value);
3126 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
3127}
3128
3129
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003130int Code::allow_osr_at_loop_nesting_level() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003131 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003132 return READ_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset);
3133}
3134
3135
3136void Code::set_allow_osr_at_loop_nesting_level(int level) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003137 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003138 ASSERT(level >= 0 && level <= kMaxLoopNestingMarker);
3139 WRITE_BYTE_FIELD(this, kAllowOSRAtLoopNestingLevelOffset, level);
3140}
3141
3142
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003143int Code::profiler_ticks() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003144 ASSERT_EQ(FUNCTION, kind());
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003145 return READ_BYTE_FIELD(this, kProfilerTicksOffset);
3146}
3147
3148
3149void Code::set_profiler_ticks(int ticks) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003150 ASSERT_EQ(FUNCTION, kind());
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00003151 ASSERT(ticks < 256);
3152 WRITE_BYTE_FIELD(this, kProfilerTicksOffset, ticks);
3153}
3154
3155
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003156unsigned Code::stack_slots() {
3157 ASSERT(kind() == OPTIMIZED_FUNCTION);
3158 return READ_UINT32_FIELD(this, kStackSlotsOffset);
3159}
3160
3161
3162void Code::set_stack_slots(unsigned slots) {
3163 ASSERT(kind() == OPTIMIZED_FUNCTION);
3164 WRITE_UINT32_FIELD(this, kStackSlotsOffset, slots);
3165}
3166
3167
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003168unsigned Code::safepoint_table_offset() {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003169 ASSERT(kind() == OPTIMIZED_FUNCTION);
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003170 return READ_UINT32_FIELD(this, kSafepointTableOffsetOffset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003171}
3172
3173
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003174void Code::set_safepoint_table_offset(unsigned offset) {
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003175 ASSERT(kind() == OPTIMIZED_FUNCTION);
3176 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003177 WRITE_UINT32_FIELD(this, kSafepointTableOffsetOffset, offset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003178}
3179
3180
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003181unsigned Code::stack_check_table_offset() {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003182 ASSERT_EQ(FUNCTION, kind());
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003183 return READ_UINT32_FIELD(this, kStackCheckTableOffsetOffset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003184}
3185
3186
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003187void Code::set_stack_check_table_offset(unsigned offset) {
fschneider@chromium.org7d10be52012-04-10 12:30:14 +00003188 ASSERT_EQ(FUNCTION, kind());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003189 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
ricow@chromium.org83aa5492011-02-07 12:42:56 +00003190 WRITE_UINT32_FIELD(this, kStackCheckTableOffsetOffset, offset);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003191}
3192
3193
3194CheckType Code::check_type() {
3195 ASSERT(is_call_stub() || is_keyed_call_stub());
3196 byte type = READ_BYTE_FIELD(this, kCheckTypeOffset);
3197 return static_cast<CheckType>(type);
3198}
3199
3200
3201void Code::set_check_type(CheckType value) {
3202 ASSERT(is_call_stub() || is_keyed_call_stub());
3203 WRITE_BYTE_FIELD(this, kCheckTypeOffset, value);
3204}
3205
3206
danno@chromium.org40cb8782011-05-25 07:58:50 +00003207byte Code::unary_op_type() {
3208 ASSERT(is_unary_op_stub());
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00003209 return READ_BYTE_FIELD(this, kUnaryOpTypeOffset);
3210}
3211
3212
danno@chromium.org40cb8782011-05-25 07:58:50 +00003213void Code::set_unary_op_type(byte value) {
3214 ASSERT(is_unary_op_stub());
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00003215 WRITE_BYTE_FIELD(this, kUnaryOpTypeOffset, value);
3216}
3217
3218
danno@chromium.org40cb8782011-05-25 07:58:50 +00003219byte Code::binary_op_type() {
3220 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003221 return READ_BYTE_FIELD(this, kBinaryOpTypeOffset);
3222}
3223
3224
danno@chromium.org40cb8782011-05-25 07:58:50 +00003225void Code::set_binary_op_type(byte value) {
3226 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003227 WRITE_BYTE_FIELD(this, kBinaryOpTypeOffset, value);
3228}
3229
3230
danno@chromium.org40cb8782011-05-25 07:58:50 +00003231byte Code::binary_op_result_type() {
3232 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003233 return READ_BYTE_FIELD(this, kBinaryOpReturnTypeOffset);
3234}
3235
3236
danno@chromium.org40cb8782011-05-25 07:58:50 +00003237void Code::set_binary_op_result_type(byte value) {
3238 ASSERT(is_binary_op_stub());
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003239 WRITE_BYTE_FIELD(this, kBinaryOpReturnTypeOffset, value);
3240}
3241
3242
3243byte Code::compare_state() {
3244 ASSERT(is_compare_ic_stub());
3245 return READ_BYTE_FIELD(this, kCompareStateOffset);
3246}
3247
3248
3249void Code::set_compare_state(byte value) {
3250 ASSERT(is_compare_ic_stub());
3251 WRITE_BYTE_FIELD(this, kCompareStateOffset, value);
3252}
3253
3254
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003255byte Code::compare_operation() {
3256 ASSERT(is_compare_ic_stub());
3257 return READ_BYTE_FIELD(this, kCompareOperationOffset);
3258}
3259
3260
3261void Code::set_compare_operation(byte value) {
3262 ASSERT(is_compare_ic_stub());
3263 WRITE_BYTE_FIELD(this, kCompareOperationOffset, value);
3264}
3265
3266
ricow@chromium.org9fa09672011-07-25 11:05:35 +00003267byte Code::to_boolean_state() {
3268 ASSERT(is_to_boolean_ic_stub());
3269 return READ_BYTE_FIELD(this, kToBooleanTypeOffset);
3270}
3271
3272
3273void Code::set_to_boolean_state(byte value) {
3274 ASSERT(is_to_boolean_ic_stub());
3275 WRITE_BYTE_FIELD(this, kToBooleanTypeOffset, value);
3276}
3277
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003278
3279bool Code::has_function_cache() {
3280 ASSERT(kind() == STUB);
3281 return READ_BYTE_FIELD(this, kHasFunctionCacheOffset) != 0;
3282}
3283
3284
3285void Code::set_has_function_cache(bool flag) {
3286 ASSERT(kind() == STUB);
3287 WRITE_BYTE_FIELD(this, kHasFunctionCacheOffset, flag);
3288}
3289
3290
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003291bool Code::is_inline_cache_stub() {
3292 Kind kind = this->kind();
3293 return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND;
3294}
3295
3296
3297Code::Flags Code::ComputeFlags(Kind kind,
kasper.lund7276f142008-07-30 08:49:36 +00003298 InlineCacheState ic_state,
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003299 ExtraICState extra_ic_state,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003300 PropertyType type,
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003301 int argc,
3302 InlineCacheHolderFlag holder) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00003303 // Extra IC state is only allowed for call IC stubs or for store IC
3304 // stubs.
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003305 ASSERT(extra_ic_state == kNoExtraICState ||
lrn@chromium.org34e60782011-09-15 07:25:40 +00003306 kind == CALL_IC ||
3307 kind == STORE_IC ||
3308 kind == KEYED_STORE_IC);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003309 // Compute the bit mask.
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003310 int bits = KindField::encode(kind)
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003311 | ICStateField::encode(ic_state)
3312 | TypeField::encode(type)
3313 | ExtraICStateField::encode(extra_ic_state)
lrn@chromium.org34e60782011-09-15 07:25:40 +00003314 | (argc << kArgumentsCountShift)
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003315 | CacheHolderField::encode(holder);
3316 return static_cast<Flags>(bits);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003317}
3318
3319
3320Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
3321 PropertyType type,
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003322 ExtraICState extra_ic_state,
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003323 InlineCacheHolderFlag holder,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003324 int argc) {
lrn@chromium.org34e60782011-09-15 07:25:40 +00003325 return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003326}
3327
3328
3329Code::Kind Code::ExtractKindFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003330 return KindField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003331}
3332
3333
kasper.lund7276f142008-07-30 08:49:36 +00003334InlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003335 return ICStateField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003336}
3337
3338
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003339Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003340 return ExtraICStateField::decode(flags);
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00003341}
3342
3343
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003344PropertyType Code::ExtractTypeFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003345 return TypeField::decode(flags);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003346}
3347
3348
3349int Code::ExtractArgumentsCountFromFlags(Flags flags) {
lrn@chromium.org34e60782011-09-15 07:25:40 +00003350 return (flags & kArgumentsCountMask) >> kArgumentsCountShift;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003351}
3352
3353
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003354InlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003355 return CacheHolderField::decode(flags);
kmillikin@chromium.org69ea3962010-07-05 11:01:40 +00003356}
3357
3358
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003359Code::Flags Code::RemoveTypeFromFlags(Flags flags) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00003360 int bits = flags & ~TypeField::kMask;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003361 return static_cast<Flags>(bits);
3362}
3363
3364
ager@chromium.org8bb60582008-12-11 12:02:20 +00003365Code* Code::GetCodeFromTargetAddress(Address address) {
3366 HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
3367 // GetCodeFromTargetAddress might be called when marking objects during mark
3368 // sweep. reinterpret_cast is therefore used instead of the more appropriate
3369 // Code::cast. Code::cast does not work when the object's map is
3370 // marked.
3371 Code* result = reinterpret_cast<Code*>(code);
3372 return result;
3373}
3374
3375
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00003376Object* Code::GetObjectFromEntryAddress(Address location_of_address) {
3377 return HeapObject::
3378 FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize);
3379}
3380
3381
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003382Object* Map::prototype() {
3383 return READ_FIELD(this, kPrototypeOffset);
3384}
3385
3386
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003387void Map::set_prototype(Object* value, WriteBarrierMode mode) {
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00003388 ASSERT(value->IsNull() || value->IsJSReceiver());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003389 WRITE_FIELD(this, kPrototypeOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003390 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode);
fschneider@chromium.org40b9da32010-06-28 11:29:21 +00003391}
3392
3393
danno@chromium.org40cb8782011-05-25 07:58:50 +00003394DescriptorArray* Map::instance_descriptors() {
3395 Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
3396 if (object->IsSmi()) {
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00003397 return GetHeap()->empty_descriptor_array();
danno@chromium.org40cb8782011-05-25 07:58:50 +00003398 } else {
3399 return DescriptorArray::cast(object);
3400 }
3401}
3402
3403
3404void Map::init_instance_descriptors() {
3405 WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, Smi::FromInt(0));
3406}
3407
3408
3409void Map::clear_instance_descriptors() {
3410 Object* object = READ_FIELD(this,
3411 kInstanceDescriptorsOrBitField3Offset);
3412 if (!object->IsSmi()) {
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003413#ifdef DEBUG
3414 ZapInstanceDescriptors();
3415#endif
danno@chromium.org40cb8782011-05-25 07:58:50 +00003416 WRITE_FIELD(
3417 this,
3418 kInstanceDescriptorsOrBitField3Offset,
3419 Smi::FromInt(DescriptorArray::cast(object)->bit_field3_storage()));
3420 }
3421}
3422
3423
3424void Map::set_instance_descriptors(DescriptorArray* value,
3425 WriteBarrierMode mode) {
3426 Object* object = READ_FIELD(this,
3427 kInstanceDescriptorsOrBitField3Offset);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003428 Heap* heap = GetHeap();
3429 if (value == heap->empty_descriptor_array()) {
danno@chromium.org40cb8782011-05-25 07:58:50 +00003430 clear_instance_descriptors();
3431 return;
3432 } else {
3433 if (object->IsSmi()) {
3434 value->set_bit_field3_storage(Smi::cast(object)->value());
3435 } else {
3436 value->set_bit_field3_storage(
3437 DescriptorArray::cast(object)->bit_field3_storage());
3438 }
3439 }
3440 ASSERT(!is_shared());
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003441#ifdef DEBUG
3442 if (value != instance_descriptors()) {
3443 ZapInstanceDescriptors();
3444 }
3445#endif
danno@chromium.org40cb8782011-05-25 07:58:50 +00003446 WRITE_FIELD(this, kInstanceDescriptorsOrBitField3Offset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003447 CONDITIONAL_WRITE_BARRIER(
3448 heap, this, kInstanceDescriptorsOrBitField3Offset, value, mode);
danno@chromium.org40cb8782011-05-25 07:58:50 +00003449}
3450
3451
3452int Map::bit_field3() {
3453 Object* object = READ_FIELD(this,
3454 kInstanceDescriptorsOrBitField3Offset);
3455 if (object->IsSmi()) {
3456 return Smi::cast(object)->value();
3457 } else {
3458 return DescriptorArray::cast(object)->bit_field3_storage();
3459 }
3460}
3461
3462
3463void Map::set_bit_field3(int value) {
3464 ASSERT(Smi::IsValid(value));
3465 Object* object = READ_FIELD(this,
3466 kInstanceDescriptorsOrBitField3Offset);
3467 if (object->IsSmi()) {
3468 WRITE_FIELD(this,
3469 kInstanceDescriptorsOrBitField3Offset,
3470 Smi::FromInt(value));
3471 } else {
3472 DescriptorArray::cast(object)->set_bit_field3_storage(value);
3473 }
3474}
3475
3476
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003477Object* Map::GetBackPointer() {
3478 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3479 if (object->IsFixedArray()) {
3480 return FixedArray::cast(object)->get(kProtoTransitionBackPointerOffset);
3481 } else {
3482 return object;
3483 }
3484}
3485
3486
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003487Map* Map::elements_transition_map() {
3488 return instance_descriptors()->elements_transition_map();
3489}
3490
3491
3492void Map::set_elements_transition_map(Map* transitioned_map) {
3493 return instance_descriptors()->set_elements_transition_map(transitioned_map);
3494}
3495
3496
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003497void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
3498 Heap* heap = GetHeap();
3499 ASSERT(instance_type() >= FIRST_JS_RECEIVER_TYPE);
3500 ASSERT((value->IsUndefined() && GetBackPointer()->IsMap()) ||
3501 (value->IsMap() && GetBackPointer()->IsUndefined()));
3502 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3503 if (object->IsFixedArray()) {
3504 FixedArray::cast(object)->set(
3505 kProtoTransitionBackPointerOffset, value, mode);
3506 } else {
3507 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, value);
3508 CONDITIONAL_WRITE_BARRIER(
3509 heap, this, kPrototypeTransitionsOrBackPointerOffset, value, mode);
3510 }
3511}
3512
3513
3514FixedArray* Map::prototype_transitions() {
3515 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3516 if (object->IsFixedArray()) {
3517 return FixedArray::cast(object);
3518 } else {
3519 return GetHeap()->empty_fixed_array();
3520 }
3521}
3522
3523
3524void Map::set_prototype_transitions(FixedArray* value, WriteBarrierMode mode) {
3525 Heap* heap = GetHeap();
3526 ASSERT(value != heap->empty_fixed_array());
3527 value->set(kProtoTransitionBackPointerOffset, GetBackPointer());
yangguo@chromium.org5f0b8ea2012-05-16 12:37:04 +00003528#ifdef DEBUG
3529 if (value != prototype_transitions()) {
3530 ZapPrototypeTransitions();
3531 }
3532#endif
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003533 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, value);
3534 CONDITIONAL_WRITE_BARRIER(
3535 heap, this, kPrototypeTransitionsOrBackPointerOffset, value, mode);
3536}
3537
3538
3539void Map::init_prototype_transitions(Object* undefined) {
3540 ASSERT(undefined->IsUndefined());
3541 WRITE_FIELD(this, kPrototypeTransitionsOrBackPointerOffset, undefined);
3542}
3543
3544
3545HeapObject* Map::unchecked_prototype_transitions() {
3546 Object* object = READ_FIELD(this, kPrototypeTransitionsOrBackPointerOffset);
3547 return reinterpret_cast<HeapObject*>(object);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003548}
3549
3550
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00003551ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003552ACCESSORS(Map, constructor, Object, kConstructorOffset)
3553
3554ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003555ACCESSORS(JSFunction, literals_or_bindings, FixedArray, kLiteralsOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003556ACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003557
3558ACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset)
3559ACCESSORS(GlobalObject, global_context, Context, kGlobalContextOffset)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003560ACCESSORS(GlobalObject, global_receiver, JSObject, kGlobalReceiverOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003561
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003562ACCESSORS(JSGlobalProxy, context, Object, kContextOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003563
3564ACCESSORS(AccessorInfo, getter, Object, kGetterOffset)
3565ACCESSORS(AccessorInfo, setter, Object, kSetterOffset)
3566ACCESSORS(AccessorInfo, data, Object, kDataOffset)
3567ACCESSORS(AccessorInfo, name, Object, kNameOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003568ACCESSORS_TO_SMI(AccessorInfo, flag, kFlagOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003569ACCESSORS(AccessorInfo, expected_receiver_type, Object,
3570 kExpectedReceiverTypeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003571
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00003572ACCESSORS(AccessorPair, getter, Object, kGetterOffset)
3573ACCESSORS(AccessorPair, setter, Object, kSetterOffset)
3574
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003575ACCESSORS(AccessCheckInfo, named_callback, Object, kNamedCallbackOffset)
3576ACCESSORS(AccessCheckInfo, indexed_callback, Object, kIndexedCallbackOffset)
3577ACCESSORS(AccessCheckInfo, data, Object, kDataOffset)
3578
3579ACCESSORS(InterceptorInfo, getter, Object, kGetterOffset)
3580ACCESSORS(InterceptorInfo, setter, Object, kSetterOffset)
3581ACCESSORS(InterceptorInfo, query, Object, kQueryOffset)
3582ACCESSORS(InterceptorInfo, deleter, Object, kDeleterOffset)
3583ACCESSORS(InterceptorInfo, enumerator, Object, kEnumeratorOffset)
3584ACCESSORS(InterceptorInfo, data, Object, kDataOffset)
3585
3586ACCESSORS(CallHandlerInfo, callback, Object, kCallbackOffset)
3587ACCESSORS(CallHandlerInfo, data, Object, kDataOffset)
3588
3589ACCESSORS(TemplateInfo, tag, Object, kTagOffset)
3590ACCESSORS(TemplateInfo, property_list, Object, kPropertyListOffset)
3591
3592ACCESSORS(FunctionTemplateInfo, serial_number, Object, kSerialNumberOffset)
3593ACCESSORS(FunctionTemplateInfo, call_code, Object, kCallCodeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003594ACCESSORS(FunctionTemplateInfo, property_accessors, Object,
3595 kPropertyAccessorsOffset)
3596ACCESSORS(FunctionTemplateInfo, prototype_template, Object,
3597 kPrototypeTemplateOffset)
3598ACCESSORS(FunctionTemplateInfo, parent_template, Object, kParentTemplateOffset)
3599ACCESSORS(FunctionTemplateInfo, named_property_handler, Object,
3600 kNamedPropertyHandlerOffset)
3601ACCESSORS(FunctionTemplateInfo, indexed_property_handler, Object,
3602 kIndexedPropertyHandlerOffset)
3603ACCESSORS(FunctionTemplateInfo, instance_template, Object,
3604 kInstanceTemplateOffset)
3605ACCESSORS(FunctionTemplateInfo, class_name, Object, kClassNameOffset)
3606ACCESSORS(FunctionTemplateInfo, signature, Object, kSignatureOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003607ACCESSORS(FunctionTemplateInfo, instance_call_handler, Object,
3608 kInstanceCallHandlerOffset)
3609ACCESSORS(FunctionTemplateInfo, access_check_info, Object,
3610 kAccessCheckInfoOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003611ACCESSORS_TO_SMI(FunctionTemplateInfo, flag, kFlagOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003612
3613ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset)
kasper.lund212ac232008-07-16 07:07:30 +00003614ACCESSORS(ObjectTemplateInfo, internal_field_count, Object,
3615 kInternalFieldCountOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003616
3617ACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset)
3618ACCESSORS(SignatureInfo, args, Object, kArgsOffset)
3619
3620ACCESSORS(TypeSwitchInfo, types, Object, kTypesOffset)
3621
3622ACCESSORS(Script, source, Object, kSourceOffset)
3623ACCESSORS(Script, name, Object, kNameOffset)
kasperl@chromium.org7be3c992009-03-12 07:19:55 +00003624ACCESSORS(Script, id, Object, kIdOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003625ACCESSORS_TO_SMI(Script, line_offset, kLineOffsetOffset)
3626ACCESSORS_TO_SMI(Script, column_offset, kColumnOffsetOffset)
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003627ACCESSORS(Script, data, Object, kDataOffset)
ager@chromium.org9085a012009-05-11 19:22:57 +00003628ACCESSORS(Script, context_data, Object, kContextOffset)
ager@chromium.orgea91cc52011-05-23 06:06:11 +00003629ACCESSORS(Script, wrapper, Foreign, kWrapperOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003630ACCESSORS_TO_SMI(Script, type, kTypeOffset)
3631ACCESSORS_TO_SMI(Script, compilation_type, kCompilationTypeOffset)
3632ACCESSORS_TO_SMI(Script, compilation_state, kCompilationStateOffset)
sgjesse@chromium.org499aaa52009-11-30 08:07:20 +00003633ACCESSORS(Script, line_ends, Object, kLineEndsOffset)
sgjesse@chromium.org98180592009-12-02 08:17:28 +00003634ACCESSORS(Script, eval_from_shared, Object, kEvalFromSharedOffset)
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003635ACCESSORS_TO_SMI(Script, eval_from_instructions_offset,
3636 kEvalFrominstructionsOffsetOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003637
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003638#ifdef ENABLE_DEBUGGER_SUPPORT
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003639ACCESSORS(DebugInfo, shared, SharedFunctionInfo, kSharedFunctionInfoIndex)
3640ACCESSORS(DebugInfo, original_code, Code, kOriginalCodeIndex)
3641ACCESSORS(DebugInfo, code, Code, kPatchedCodeIndex)
3642ACCESSORS(DebugInfo, break_points, FixedArray, kBreakPointsStateIndex)
3643
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00003644ACCESSORS_TO_SMI(BreakPointInfo, code_position, kCodePositionIndex)
3645ACCESSORS_TO_SMI(BreakPointInfo, source_position, kSourcePositionIndex)
3646ACCESSORS_TO_SMI(BreakPointInfo, statement_position, kStatementPositionIndex)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003647ACCESSORS(BreakPointInfo, break_point_objects, Object, kBreakPointObjectsIndex)
ager@chromium.org65dad4b2009-04-23 08:48:43 +00003648#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003649
3650ACCESSORS(SharedFunctionInfo, name, Object, kNameOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003651ACCESSORS(SharedFunctionInfo, construct_stub, Code, kConstructStubOffset)
3652ACCESSORS(SharedFunctionInfo, initial_map, Object, kInitialMapOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003653ACCESSORS(SharedFunctionInfo, instance_class_name, Object,
3654 kInstanceClassNameOffset)
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003655ACCESSORS(SharedFunctionInfo, function_data, Object, kFunctionDataOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003656ACCESSORS(SharedFunctionInfo, script, Object, kScriptOffset)
3657ACCESSORS(SharedFunctionInfo, debug_info, Object, kDebugInfoOffset)
kasperl@chromium.orgd1e3e722009-04-14 13:38:25 +00003658ACCESSORS(SharedFunctionInfo, inferred_name, String, kInferredNameOffset)
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003659ACCESSORS(SharedFunctionInfo, this_property_assignments, Object,
3660 kThisPropertyAssignmentsOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003661SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003662
yangguo@chromium.org78d1ad42012-02-09 13:53:47 +00003663
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003664BOOL_ACCESSORS(FunctionTemplateInfo, flag, hidden_prototype,
3665 kHiddenPrototypeBit)
3666BOOL_ACCESSORS(FunctionTemplateInfo, flag, undetectable, kUndetectableBit)
3667BOOL_ACCESSORS(FunctionTemplateInfo, flag, needs_access_check,
3668 kNeedsAccessCheckBit)
ricow@chromium.org2c99e282011-07-28 09:15:17 +00003669BOOL_ACCESSORS(FunctionTemplateInfo, flag, read_only_prototype,
3670 kReadOnlyPrototypeBit)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003671BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_expression,
3672 kIsExpressionBit)
3673BOOL_ACCESSORS(SharedFunctionInfo, start_position_and_type, is_toplevel,
3674 kIsTopLevelBit)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003675BOOL_GETTER(SharedFunctionInfo,
3676 compiler_hints,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003677 has_only_simple_this_property_assignments,
3678 kHasOnlySimpleThisPropertyAssignments)
ager@chromium.orgc4c92722009-11-18 14:12:51 +00003679BOOL_ACCESSORS(SharedFunctionInfo,
3680 compiler_hints,
vegorov@chromium.org2356e6f2010-06-09 09:38:56 +00003681 allows_lazy_compilation,
3682 kAllowLazyCompilation)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003683BOOL_ACCESSORS(SharedFunctionInfo,
3684 compiler_hints,
3685 uses_arguments,
3686 kUsesArguments)
3687BOOL_ACCESSORS(SharedFunctionInfo,
3688 compiler_hints,
3689 has_duplicate_parameters,
3690 kHasDuplicateParameters)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003691
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003692
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003693#if V8_HOST_ARCH_32_BIT
3694SMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
3695SMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003696 kFormalParameterCountOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003697SMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003698 kExpectedNofPropertiesOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003699SMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
3700SMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003701 kStartPositionAndTypeOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003702SMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
3703SMI_ACCESSORS(SharedFunctionInfo, function_token_position,
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003704 kFunctionTokenPositionOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003705SMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003706 kCompilerHintsOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003707SMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00003708 kThisPropertyAssignmentsCountOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003709SMI_ACCESSORS(SharedFunctionInfo, opt_count, kOptCountOffset)
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003710SMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset)
3711SMI_ACCESSORS(SharedFunctionInfo,
3712 stress_deopt_counter,
3713 kStressDeoptCounterOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003714#else
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003715
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003716#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003717 STATIC_ASSERT(holder::offset % kPointerSize == 0); \
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003718 int holder::name() { \
3719 int value = READ_INT_FIELD(this, offset); \
3720 ASSERT(kHeapObjectTag == 1); \
3721 ASSERT((value & kHeapObjectTag) == 0); \
3722 return value >> 1; \
3723 } \
3724 void holder::set_##name(int value) { \
3725 ASSERT(kHeapObjectTag == 1); \
3726 ASSERT((value & 0xC0000000) == 0xC0000000 || \
3727 (value & 0xC0000000) == 0x000000000); \
3728 WRITE_INT_FIELD(this, \
3729 offset, \
3730 (value << 1) & ~kHeapObjectTag); \
3731 }
3732
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003733#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \
3734 STATIC_ASSERT(holder::offset % kPointerSize == kIntSize); \
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003735 INT_ACCESSORS(holder, name, offset)
3736
3737
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003738PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003739PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3740 formal_parameter_count,
3741 kFormalParameterCountOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003742
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003743PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3744 expected_nof_properties,
3745 kExpectedNofPropertiesOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003746PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
3747
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003748PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, end_position, kEndPositionOffset)
3749PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3750 start_position_and_type,
3751 kStartPositionAndTypeOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003752
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003753PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3754 function_token_position,
3755 kFunctionTokenPositionOffset)
3756PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3757 compiler_hints,
3758 kCompilerHintsOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003759
whesse@chromium.orgf0ac72d2010-11-08 12:47:26 +00003760PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo,
3761 this_property_assignments_count,
3762 kThisPropertyAssignmentsCountOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003763PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, opt_count, kOptCountOffset)
svenpanne@chromium.orgb1df11d2012-02-08 10:26:21 +00003764
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003765PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, counters, kCountersOffset)
3766PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo,
3767 stress_deopt_counter,
3768 kStressDeoptCounterOffset)
ricow@chromium.org30ce4112010-05-31 10:38:25 +00003769#endif
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003770
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003771
3772int SharedFunctionInfo::construction_count() {
3773 return READ_BYTE_FIELD(this, kConstructionCountOffset);
3774}
3775
3776
3777void SharedFunctionInfo::set_construction_count(int value) {
3778 ASSERT(0 <= value && value < 256);
3779 WRITE_BYTE_FIELD(this, kConstructionCountOffset, static_cast<byte>(value));
3780}
3781
3782
whesse@chromium.org7b260152011-06-20 15:33:18 +00003783BOOL_ACCESSORS(SharedFunctionInfo,
3784 compiler_hints,
3785 live_objects_may_exist,
3786 kLiveObjectsMayExist)
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003787
3788
3789bool SharedFunctionInfo::IsInobjectSlackTrackingInProgress() {
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00003790 return initial_map() != GetHeap()->undefined_value();
whesse@chromium.org4a1fe7d2010-09-27 12:32:04 +00003791}
3792
3793
whesse@chromium.org7b260152011-06-20 15:33:18 +00003794BOOL_GETTER(SharedFunctionInfo,
3795 compiler_hints,
3796 optimization_disabled,
3797 kOptimizationDisabled)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00003798
3799
3800void SharedFunctionInfo::set_optimization_disabled(bool disable) {
3801 set_compiler_hints(BooleanBit::set(compiler_hints(),
3802 kOptimizationDisabled,
3803 disable));
3804 // If disabling optimizations we reflect that in the code object so
3805 // it will not be counted as optimizable code.
3806 if ((code()->kind() == Code::FUNCTION) && disable) {
3807 code()->set_optimizable(false);
3808 }
3809}
3810
3811
jkummerow@chromium.org212d9642012-05-11 15:02:09 +00003812int SharedFunctionInfo::profiler_ticks() {
3813 if (code()->kind() != Code::FUNCTION) return 0;
3814 return code()->profiler_ticks();
3815}
3816
3817
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003818LanguageMode SharedFunctionInfo::language_mode() {
3819 int hints = compiler_hints();
3820 if (BooleanBit::get(hints, kExtendedModeFunction)) {
3821 ASSERT(BooleanBit::get(hints, kStrictModeFunction));
3822 return EXTENDED_MODE;
3823 }
3824 return BooleanBit::get(hints, kStrictModeFunction)
3825 ? STRICT_MODE : CLASSIC_MODE;
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003826}
3827
3828
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003829void SharedFunctionInfo::set_language_mode(LanguageMode language_mode) {
3830 // We only allow language mode transitions that go set the same language mode
3831 // again or go up in the chain:
3832 // CLASSIC_MODE -> STRICT_MODE -> EXTENDED_MODE.
3833 ASSERT(this->language_mode() == CLASSIC_MODE ||
3834 this->language_mode() == language_mode ||
3835 language_mode == EXTENDED_MODE);
3836 int hints = compiler_hints();
3837 hints = BooleanBit::set(
3838 hints, kStrictModeFunction, language_mode != CLASSIC_MODE);
3839 hints = BooleanBit::set(
3840 hints, kExtendedModeFunction, language_mode == EXTENDED_MODE);
3841 set_compiler_hints(hints);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00003842}
3843
3844
mstarzinger@chromium.org1b3afd12011-11-29 14:28:56 +00003845bool SharedFunctionInfo::is_classic_mode() {
3846 return !BooleanBit::get(compiler_hints(), kStrictModeFunction);
3847}
3848
3849BOOL_GETTER(SharedFunctionInfo, compiler_hints, is_extended_mode,
3850 kExtendedModeFunction)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00003851BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative)
3852BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints,
3853 name_should_print_as_anonymous,
3854 kNameShouldPrintAsAnonymous)
3855BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, bound, kBoundFunction)
3856BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_anonymous, kIsAnonymous)
yangguo@chromium.org56454712012-02-16 15:33:53 +00003857BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, is_function, kIsFunction)
3858BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_optimize,
3859 kDontOptimize)
svenpanne@chromium.orgb1df11d2012-02-08 10:26:21 +00003860BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, dont_inline, kDontInline)
whesse@chromium.org7b260152011-06-20 15:33:18 +00003861
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00003862ACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
3863ACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
3864
jkummerow@chromium.orge297f592011-06-08 10:05:15 +00003865ACCESSORS(PolymorphicCodeCache, cache, Object, kCacheOffset)
3866
sgjesse@chromium.org152a0b02009-10-07 13:50:16 +00003867bool Script::HasValidSource() {
3868 Object* src = this->source();
3869 if (!src->IsString()) return true;
3870 String* src_str = String::cast(src);
3871 if (!StringShape(src_str).IsExternal()) return true;
3872 if (src_str->IsAsciiRepresentation()) {
3873 return ExternalAsciiString::cast(src)->resource() != NULL;
3874 } else if (src_str->IsTwoByteRepresentation()) {
3875 return ExternalTwoByteString::cast(src)->resource() != NULL;
3876 }
3877 return true;
3878}
3879
3880
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00003881void SharedFunctionInfo::DontAdaptArguments() {
3882 ASSERT(code()->kind() == Code::BUILTIN);
3883 set_formal_parameter_count(kDontAdaptArgumentsSentinel);
3884}
3885
3886
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003887int SharedFunctionInfo::start_position() {
3888 return start_position_and_type() >> kStartPositionShift;
3889}
3890
3891
3892void SharedFunctionInfo::set_start_position(int start_position) {
3893 set_start_position_and_type((start_position << kStartPositionShift)
3894 | (start_position_and_type() & ~kStartPositionMask));
3895}
3896
3897
3898Code* SharedFunctionInfo::code() {
3899 return Code::cast(READ_FIELD(this, kCodeOffset));
3900}
3901
3902
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003903Code* SharedFunctionInfo::unchecked_code() {
3904 return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset));
3905}
3906
3907
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00003908void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003909 WRITE_FIELD(this, kCodeOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003910 CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003911}
3912
3913
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00003914ScopeInfo* SharedFunctionInfo::scope_info() {
3915 return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset));
ager@chromium.orgb5737492010-07-15 09:29:43 +00003916}
3917
3918
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00003919void SharedFunctionInfo::set_scope_info(ScopeInfo* value,
ager@chromium.orgb5737492010-07-15 09:29:43 +00003920 WriteBarrierMode mode) {
3921 WRITE_FIELD(this, kScopeInfoOffset, reinterpret_cast<Object*>(value));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00003922 CONDITIONAL_WRITE_BARRIER(GetHeap(),
3923 this,
3924 kScopeInfoOffset,
3925 reinterpret_cast<Object*>(value),
3926 mode);
ager@chromium.orgb5737492010-07-15 09:29:43 +00003927}
3928
3929
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003930bool SharedFunctionInfo::is_compiled() {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00003931 return code() !=
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00003932 Isolate::Current()->builtins()->builtin(Builtins::kLazyCompile);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00003933}
3934
3935
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003936bool SharedFunctionInfo::IsApiFunction() {
3937 return function_data()->IsFunctionTemplateInfo();
3938}
3939
3940
3941FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
3942 ASSERT(IsApiFunction());
3943 return FunctionTemplateInfo::cast(function_data());
3944}
3945
3946
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00003947bool SharedFunctionInfo::HasBuiltinFunctionId() {
sgjesse@chromium.org720dc0b2010-05-10 09:25:39 +00003948 return function_data()->IsSmi();
3949}
3950
3951
ager@chromium.org5f0c45f2010-12-17 08:51:21 +00003952BuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
3953 ASSERT(HasBuiltinFunctionId());
3954 return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value());
vegorov@chromium.orgf8372902010-03-15 10:26:20 +00003955}
3956
3957
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003958int SharedFunctionInfo::code_age() {
3959 return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask;
3960}
3961
3962
3963void SharedFunctionInfo::set_code_age(int code_age) {
mstarzinger@chromium.orgf8c6bd52011-11-23 12:13:52 +00003964 int hints = compiler_hints() & ~(kCodeAgeMask << kCodeAgeShift);
3965 set_compiler_hints(hints | ((code_age & kCodeAgeMask) << kCodeAgeShift));
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00003966}
3967
3968
mmassi@chromium.org7028c052012-06-13 11:51:58 +00003969int SharedFunctionInfo::ic_age() {
3970 return ICAgeBits::decode(counters());
3971}
3972
3973
3974void SharedFunctionInfo::set_ic_age(int ic_age) {
3975 set_counters(ICAgeBits::update(counters(), ic_age));
3976}
3977
3978
3979int SharedFunctionInfo::deopt_count() {
3980 return DeoptCountBits::decode(counters());
3981}
3982
3983
3984void SharedFunctionInfo::set_deopt_count(int deopt_count) {
3985 set_counters(DeoptCountBits::update(counters(), deopt_count));
3986}
3987
3988
3989void SharedFunctionInfo::increment_deopt_count() {
3990 int value = counters();
3991 int deopt_count = DeoptCountBits::decode(value);
3992 deopt_count = (deopt_count + 1) & DeoptCountBits::kMax;
3993 set_counters(DeoptCountBits::update(value, deopt_count));
3994}
3995
3996
3997int SharedFunctionInfo::opt_reenable_tries() {
3998 return OptReenableTriesBits::decode(counters());
3999}
4000
4001
4002void SharedFunctionInfo::set_opt_reenable_tries(int tries) {
4003 set_counters(OptReenableTriesBits::update(counters(), tries));
4004}
4005
4006
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004007bool SharedFunctionInfo::has_deoptimization_support() {
4008 Code* code = this->code();
4009 return code->kind() == Code::FUNCTION && code->has_deoptimization_support();
4010}
4011
4012
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004013void SharedFunctionInfo::TryReenableOptimization() {
4014 int tries = opt_reenable_tries();
4015 set_opt_reenable_tries((tries + 1) & OptReenableTriesBits::kMax);
4016 // We reenable optimization whenever the number of tries is a large
4017 // enough power of 2.
4018 if (tries >= 16 && (((tries - 1) & tries) == 0)) {
4019 set_optimization_disabled(false);
4020 set_opt_count(0);
4021 set_deopt_count(0);
4022 code()->set_optimizable(true);
4023 }
4024}
4025
4026
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004027bool JSFunction::IsBuiltin() {
4028 return context()->global()->IsJSBuiltinsObject();
4029}
4030
4031
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004032bool JSFunction::NeedsArgumentsAdaption() {
4033 return shared()->formal_parameter_count() !=
4034 SharedFunctionInfo::kDontAdaptArgumentsSentinel;
4035}
4036
4037
4038bool JSFunction::IsOptimized() {
4039 return code()->kind() == Code::OPTIMIZED_FUNCTION;
4040}
4041
4042
ager@chromium.orga9aa5fa2011-04-13 08:46:07 +00004043bool JSFunction::IsOptimizable() {
4044 return code()->kind() == Code::FUNCTION && code()->optimizable();
4045}
4046
4047
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004048bool JSFunction::IsMarkedForLazyRecompilation() {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00004049 return code() == GetIsolate()->builtins()->builtin(Builtins::kLazyRecompile);
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004050}
4051
4052
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004053Code* JSFunction::code() {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004054 return Code::cast(unchecked_code());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004055}
4056
4057
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004058Code* JSFunction::unchecked_code() {
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004059 return reinterpret_cast<Code*>(
4060 Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset)));
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004061}
4062
4063
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004064void JSFunction::set_code(Code* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004065 ASSERT(!HEAP->InNewSpace(value));
erik.corry@gmail.com145eff52010-08-23 11:36:18 +00004066 Address entry = value->entry();
4067 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004068 GetHeap()->incremental_marking()->RecordWriteOfCodeEntry(
4069 this,
4070 HeapObject::RawField(this, kCodeEntryOffset),
4071 value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004072}
4073
4074
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004075void JSFunction::ReplaceCode(Code* code) {
4076 bool was_optimized = IsOptimized();
4077 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
4078
4079 set_code(code);
4080
4081 // Add/remove the function from the list of optimized functions for this
4082 // context based on the state change.
4083 if (!was_optimized && is_optimized) {
4084 context()->global_context()->AddOptimizedFunction(this);
4085 }
4086 if (was_optimized && !is_optimized) {
4087 context()->global_context()->RemoveOptimizedFunction(this);
4088 }
4089}
4090
4091
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004092Context* JSFunction::context() {
4093 return Context::cast(READ_FIELD(this, kContextOffset));
4094}
4095
4096
4097Object* JSFunction::unchecked_context() {
4098 return READ_FIELD(this, kContextOffset);
4099}
4100
4101
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004102SharedFunctionInfo* JSFunction::unchecked_shared() {
4103 return reinterpret_cast<SharedFunctionInfo*>(
4104 READ_FIELD(this, kSharedFunctionInfoOffset));
4105}
4106
4107
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004108void JSFunction::set_context(Object* value) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004109 ASSERT(value->IsUndefined() || value->IsContext());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004110 WRITE_FIELD(this, kContextOffset, value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004111 WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004112}
4113
4114ACCESSORS(JSFunction, prototype_or_initial_map, Object,
4115 kPrototypeOrInitialMapOffset)
4116
4117
4118Map* JSFunction::initial_map() {
4119 return Map::cast(prototype_or_initial_map());
4120}
4121
4122
4123void JSFunction::set_initial_map(Map* value) {
4124 set_prototype_or_initial_map(value);
4125}
4126
4127
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004128MaybeObject* JSFunction::set_initial_map_and_cache_transitions(
4129 Map* initial_map) {
4130 Context* global_context = context()->global_context();
4131 Object* array_function =
4132 global_context->get(Context::ARRAY_FUNCTION_INDEX);
4133 if (array_function->IsJSFunction() &&
4134 this == JSFunction::cast(array_function)) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004135 // Replace all of the cached initial array maps in the global context with
4136 // the appropriate transitioned elements kind maps.
4137 Heap* heap = GetHeap();
4138 MaybeObject* maybe_maps =
4139 heap->AllocateFixedArrayWithHoles(kElementsKindCount);
4140 FixedArray* maps;
4141 if (!maybe_maps->To(&maps)) return maybe_maps;
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004142
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004143 Map* current_map = initial_map;
4144 ElementsKind kind = current_map->elements_kind();
4145 ASSERT(kind == GetInitialFastElementsKind());
4146 maps->set(kind, current_map);
4147 for (int i = GetSequenceIndexFromFastElementsKind(kind) + 1;
4148 i < kFastElementsKindCount; ++i) {
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004149 Map* new_map;
4150 ElementsKind next_kind = GetFastElementsKindFromSequenceIndex(i);
4151 MaybeObject* maybe_new_map =
4152 current_map->CreateNextElementsTransition(next_kind);
4153 if (!maybe_new_map->To(&new_map)) return maybe_new_map;
4154 maps->set(next_kind, new_map);
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004155 current_map = new_map;
4156 }
4157 global_context->set_js_array_maps(maps);
danno@chromium.orgfa458e42012-02-01 10:48:36 +00004158 }
4159 set_initial_map(initial_map);
4160 return this;
4161}
4162
4163
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004164bool JSFunction::has_initial_map() {
4165 return prototype_or_initial_map()->IsMap();
4166}
4167
4168
4169bool JSFunction::has_instance_prototype() {
4170 return has_initial_map() || !prototype_or_initial_map()->IsTheHole();
4171}
4172
4173
4174bool JSFunction::has_prototype() {
4175 return map()->has_non_instance_prototype() || has_instance_prototype();
4176}
4177
4178
4179Object* JSFunction::instance_prototype() {
4180 ASSERT(has_instance_prototype());
4181 if (has_initial_map()) return initial_map()->prototype();
4182 // When there is no initial map and the prototype is a JSObject, the
4183 // initial map field is used for the prototype field.
4184 return prototype_or_initial_map();
4185}
4186
4187
4188Object* JSFunction::prototype() {
4189 ASSERT(has_prototype());
4190 // If the function's prototype property has been set to a non-JSObject
4191 // value, that value is stored in the constructor field of the map.
4192 if (map()->has_non_instance_prototype()) return map()->constructor();
4193 return instance_prototype();
4194}
4195
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004196
kmillikin@chromium.org4111b802010-05-03 10:34:42 +00004197bool JSFunction::should_have_prototype() {
4198 return map()->function_with_prototype();
4199}
4200
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004201
4202bool JSFunction::is_compiled() {
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00004203 return code() != GetIsolate()->builtins()->builtin(Builtins::kLazyCompile);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004204}
4205
4206
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004207FixedArray* JSFunction::literals() {
4208 ASSERT(!shared()->bound());
4209 return literals_or_bindings();
4210}
4211
4212
4213void JSFunction::set_literals(FixedArray* literals) {
4214 ASSERT(!shared()->bound());
4215 set_literals_or_bindings(literals);
4216}
4217
4218
4219FixedArray* JSFunction::function_bindings() {
4220 ASSERT(shared()->bound());
4221 return literals_or_bindings();
4222}
4223
4224
4225void JSFunction::set_function_bindings(FixedArray* bindings) {
4226 ASSERT(shared()->bound());
4227 // Bound function literal may be initialized to the empty fixed array
4228 // before the bindings are set.
4229 ASSERT(bindings == GetHeap()->empty_fixed_array() ||
4230 bindings->map() == GetHeap()->fixed_cow_array_map());
4231 set_literals_or_bindings(bindings);
4232}
4233
4234
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004235int JSFunction::NumberOfLiterals() {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004236 ASSERT(!shared()->bound());
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004237 return literals()->length();
4238}
4239
4240
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004241Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004242 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004243 return READ_FIELD(this, OffsetOfFunctionWithId(id));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004244}
4245
4246
4247void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
4248 Object* value) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004249 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004250 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004251 WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value);
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004252}
4253
4254
4255Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004256 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004257 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
4258}
4259
4260
4261void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
4262 Code* value) {
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +00004263 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
ricow@chromium.orgc9c80822010-04-21 08:22:37 +00004264 WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004265 ASSERT(!HEAP->InNewSpace(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004266}
4267
4268
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00004269ACCESSORS(JSProxy, handler, Object, kHandlerOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004270ACCESSORS(JSProxy, hash, Object, kHashOffset)
lrn@chromium.org34e60782011-09-15 07:25:40 +00004271ACCESSORS(JSFunctionProxy, call_trap, Object, kCallTrapOffset)
4272ACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset)
4273
4274
4275void JSProxy::InitializeBody(int object_size, Object* value) {
4276 ASSERT(!value->IsHeapObject() || !GetHeap()->InNewSpace(value));
4277 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
4278 WRITE_FIELD(this, offset, value);
4279 }
4280}
vegorov@chromium.org7304bca2011-05-16 12:14:13 +00004281
4282
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004283ACCESSORS(JSSet, table, Object, kTableOffset)
4284ACCESSORS(JSMap, table, Object, kTableOffset)
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004285ACCESSORS(JSWeakMap, table, Object, kTableOffset)
4286ACCESSORS(JSWeakMap, next, Object, kNextOffset)
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00004287
4288
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00004289Address Foreign::foreign_address() {
4290 return AddressFrom<Address>(READ_INTPTR_FIELD(this, kForeignAddressOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004291}
4292
4293
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00004294void Foreign::set_foreign_address(Address value) {
4295 WRITE_INTPTR_FIELD(this, kForeignAddressOffset, OffsetFrom(value));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004296}
4297
4298
erik.corry@gmail.comed49e962012-04-17 11:57:53 +00004299ACCESSORS(JSModule, context, Object, kContextOffset)
4300
4301
4302JSModule* JSModule::cast(Object* obj) {
4303 ASSERT(obj->IsJSModule());
4304 ASSERT(HeapObject::cast(obj)->Size() == JSModule::kSize);
4305 return reinterpret_cast<JSModule*>(obj);
4306}
4307
4308
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004309ACCESSORS(JSValue, value, Object, kValueOffset)
4310
4311
4312JSValue* JSValue::cast(Object* obj) {
4313 ASSERT(obj->IsJSValue());
4314 ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize);
4315 return reinterpret_cast<JSValue*>(obj);
4316}
4317
4318
svenpanne@chromium.org4efbdb12012-03-12 08:18:42 +00004319ACCESSORS(JSDate, value, Object, kValueOffset)
4320ACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset)
4321ACCESSORS(JSDate, year, Object, kYearOffset)
4322ACCESSORS(JSDate, month, Object, kMonthOffset)
4323ACCESSORS(JSDate, day, Object, kDayOffset)
4324ACCESSORS(JSDate, weekday, Object, kWeekdayOffset)
4325ACCESSORS(JSDate, hour, Object, kHourOffset)
4326ACCESSORS(JSDate, min, Object, kMinOffset)
4327ACCESSORS(JSDate, sec, Object, kSecOffset)
4328
4329
4330JSDate* JSDate::cast(Object* obj) {
4331 ASSERT(obj->IsJSDate());
4332 ASSERT(HeapObject::cast(obj)->Size() == JSDate::kSize);
4333 return reinterpret_cast<JSDate*>(obj);
4334}
4335
4336
kmillikin@chromium.org31b12772011-02-02 16:08:26 +00004337ACCESSORS(JSMessageObject, type, String, kTypeOffset)
4338ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
4339ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
4340ACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset)
4341ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
4342SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
4343SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
4344
4345
4346JSMessageObject* JSMessageObject::cast(Object* obj) {
4347 ASSERT(obj->IsJSMessageObject());
4348 ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize);
4349 return reinterpret_cast<JSMessageObject*>(obj);
4350}
4351
4352
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004353INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004354ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
jkummerow@chromium.org04e4f1e2011-11-14 13:36:17 +00004355ACCESSORS(Code, handler_table, FixedArray, kHandlerTableOffset)
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004356ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00004357ACCESSORS(Code, type_feedback_info, Object, kTypeFeedbackInfoOffset)
yangguo@chromium.org659ceec2012-01-26 07:37:54 +00004358ACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset)
danno@chromium.org88aa0582012-03-23 15:11:57 +00004359INT_ACCESSORS(Code, ic_age, kICAgeOffset)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004360
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004361byte* Code::instruction_start() {
4362 return FIELD_ADDR(this, kHeaderSize);
4363}
4364
4365
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004366byte* Code::instruction_end() {
4367 return instruction_start() + instruction_size();
4368}
4369
4370
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004371int Code::body_size() {
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004372 return RoundUp(instruction_size(), kObjectAlignment);
4373}
4374
4375
kasperl@chromium.orga5551262010-12-07 12:49:48 +00004376FixedArray* Code::unchecked_deoptimization_data() {
4377 return reinterpret_cast<FixedArray*>(
4378 READ_FIELD(this, kDeoptimizationDataOffset));
4379}
4380
4381
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004382ByteArray* Code::unchecked_relocation_info() {
4383 return reinterpret_cast<ByteArray*>(READ_FIELD(this, kRelocationInfoOffset));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004384}
4385
4386
4387byte* Code::relocation_start() {
erik.corry@gmail.com4a2e25e2010-07-07 12:22:46 +00004388 return unchecked_relocation_info()->GetDataStartAddress();
4389}
4390
4391
4392int Code::relocation_size() {
4393 return unchecked_relocation_info()->length();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004394}
4395
4396
4397byte* Code::entry() {
4398 return instruction_start();
4399}
4400
4401
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004402bool Code::contains(byte* inner_pointer) {
4403 return (address() <= inner_pointer) && (inner_pointer <= address() + Size());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004404}
4405
4406
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004407ACCESSORS(JSArray, length, Object, kLengthOffset)
4408
4409
ager@chromium.org236ad962008-09-25 09:45:57 +00004410ACCESSORS(JSRegExp, data, Object, kDataOffset)
ager@chromium.org236ad962008-09-25 09:45:57 +00004411
4412
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004413JSRegExp::Type JSRegExp::TypeTag() {
4414 Object* data = this->data();
4415 if (data->IsUndefined()) return JSRegExp::NOT_COMPILED;
4416 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kTagIndex));
4417 return static_cast<JSRegExp::Type>(smi->value());
ager@chromium.org236ad962008-09-25 09:45:57 +00004418}
4419
4420
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004421JSRegExp::Type JSRegExp::TypeTagUnchecked() {
4422 Smi* smi = Smi::cast(DataAtUnchecked(kTagIndex));
4423 return static_cast<JSRegExp::Type>(smi->value());
4424}
4425
4426
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00004427int JSRegExp::CaptureCount() {
4428 switch (TypeTag()) {
4429 case ATOM:
4430 return 0;
4431 case IRREGEXP:
4432 return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value();
4433 default:
4434 UNREACHABLE();
4435 return -1;
4436 }
4437}
4438
4439
ager@chromium.orga74f0da2008-12-03 16:05:52 +00004440JSRegExp::Flags JSRegExp::GetFlags() {
4441 ASSERT(this->data()->IsFixedArray());
4442 Object* data = this->data();
4443 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex));
4444 return Flags(smi->value());
4445}
4446
4447
4448String* JSRegExp::Pattern() {
4449 ASSERT(this->data()->IsFixedArray());
4450 Object* data = this->data();
4451 String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex));
4452 return pattern;
4453}
4454
4455
kasperl@chromium.org9fe21c62008-10-28 08:53:51 +00004456Object* JSRegExp::DataAt(int index) {
4457 ASSERT(TypeTag() != NOT_COMPILED);
4458 return FixedArray::cast(data())->get(index);
ager@chromium.org236ad962008-09-25 09:45:57 +00004459}
4460
4461
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004462Object* JSRegExp::DataAtUnchecked(int index) {
4463 FixedArray* fa = reinterpret_cast<FixedArray*>(data());
4464 int offset = FixedArray::kHeaderSize + index * kPointerSize;
4465 return READ_FIELD(fa, offset);
4466}
4467
4468
kasperl@chromium.org7be3c992009-03-12 07:19:55 +00004469void JSRegExp::SetDataAt(int index, Object* value) {
4470 ASSERT(TypeTag() != NOT_COMPILED);
4471 ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
4472 FixedArray::cast(data())->set(index, value);
4473}
4474
4475
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004476void JSRegExp::SetDataAtUnchecked(int index, Object* value, Heap* heap) {
4477 ASSERT(index >= kDataIndex); // Only implementation data can be set this way.
4478 FixedArray* fa = reinterpret_cast<FixedArray*>(data());
4479 if (value->IsSmi()) {
4480 fa->set_unchecked(index, Smi::cast(value));
4481 } else {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004482 // We only do this during GC, so we don't need to notify the write barrier.
jkummerow@chromium.orgddda9e82011-07-06 11:27:02 +00004483 fa->set_unchecked(heap, index, value, SKIP_WRITE_BARRIER);
4484 }
4485}
4486
4487
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00004488ElementsKind JSObject::GetElementsKind() {
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00004489 ElementsKind kind = map()->elements_kind();
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004490#if DEBUG
4491 FixedArrayBase* fixed_array =
4492 reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset));
4493 Map* map = fixed_array->map();
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004494 ASSERT((IsFastSmiOrObjectElementsKind(kind) &&
4495 (map == GetHeap()->fixed_array_map() ||
4496 map == GetHeap()->fixed_cow_array_map())) ||
4497 (IsFastDoubleElementsKind(kind) &&
4498 (fixed_array->IsFixedDoubleArray() ||
4499 fixed_array == GetHeap()->empty_fixed_array())) ||
4500 (kind == DICTIONARY_ELEMENTS &&
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004501 fixed_array->IsFixedArray() &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004502 fixed_array->IsDictionary()) ||
4503 (kind > DICTIONARY_ELEMENTS));
4504 ASSERT((kind != NON_STRICT_ARGUMENTS_ELEMENTS) ||
4505 (elements()->IsFixedArray() && elements()->length() >= 2));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004506#endif
erik.corry@gmail.comd6076d92011-06-06 09:39:18 +00004507 return kind;
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004508}
4509
4510
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00004511ElementsAccessor* JSObject::GetElementsAccessor() {
4512 return ElementsAccessor::ForKind(GetElementsKind());
4513}
4514
4515
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004516bool JSObject::HasFastObjectElements() {
4517 return IsFastObjectElementsKind(GetElementsKind());
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004518}
4519
4520
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004521bool JSObject::HasFastSmiElements() {
4522 return IsFastSmiElementsKind(GetElementsKind());
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004523}
4524
4525
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004526bool JSObject::HasFastSmiOrObjectElements() {
4527 return IsFastSmiOrObjectElementsKind(GetElementsKind());
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004528}
4529
4530
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00004531bool JSObject::HasFastDoubleElements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004532 return IsFastDoubleElementsKind(GetElementsKind());
4533}
4534
4535
4536bool JSObject::HasFastHoleyElements() {
4537 return IsFastHoleyElementsKind(GetElementsKind());
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +00004538}
4539
4540
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004541bool JSObject::HasDictionaryElements() {
4542 return GetElementsKind() == DICTIONARY_ELEMENTS;
4543}
4544
4545
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004546bool JSObject::HasNonStrictArgumentsElements() {
4547 return GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS;
4548}
4549
4550
ager@chromium.org3811b432009-10-28 14:53:37 +00004551bool JSObject::HasExternalArrayElements() {
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004552 HeapObject* array = elements();
4553 ASSERT(array != NULL);
4554 return array->IsExternalArray();
ager@chromium.org3811b432009-10-28 14:53:37 +00004555}
4556
4557
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004558#define EXTERNAL_ELEMENTS_CHECK(name, type) \
4559bool JSObject::HasExternal##name##Elements() { \
4560 HeapObject* array = elements(); \
4561 ASSERT(array != NULL); \
4562 if (!array->IsHeapObject()) \
4563 return false; \
4564 return array->map()->instance_type() == type; \
ager@chromium.org3811b432009-10-28 14:53:37 +00004565}
4566
4567
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004568EXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE)
4569EXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
4570EXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE)
4571EXTERNAL_ELEMENTS_CHECK(UnsignedShort,
4572 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
4573EXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE)
4574EXTERNAL_ELEMENTS_CHECK(UnsignedInt,
4575 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
4576EXTERNAL_ELEMENTS_CHECK(Float,
4577 EXTERNAL_FLOAT_ARRAY_TYPE)
erik.corry@gmail.com3847bd52011-04-27 10:38:56 +00004578EXTERNAL_ELEMENTS_CHECK(Double,
4579 EXTERNAL_DOUBLE_ARRAY_TYPE)
danno@chromium.org4d3fe4e2011-03-10 10:14:28 +00004580EXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE)
ager@chromium.org3811b432009-10-28 14:53:37 +00004581
4582
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004583bool JSObject::HasNamedInterceptor() {
4584 return map()->has_named_interceptor();
4585}
4586
4587
4588bool JSObject::HasIndexedInterceptor() {
4589 return map()->has_indexed_interceptor();
4590}
4591
4592
lrn@chromium.org303ada72010-10-27 09:33:13 +00004593MaybeObject* JSObject::EnsureWritableFastElements() {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004594 ASSERT(HasFastSmiOrObjectElements());
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004595 FixedArray* elems = FixedArray::cast(elements());
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004596 Isolate* isolate = GetIsolate();
4597 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems;
lrn@chromium.org303ada72010-10-27 09:33:13 +00004598 Object* writable_elems;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004599 { MaybeObject* maybe_writable_elems = isolate->heap()->CopyFixedArrayWithMap(
4600 elems, isolate->heap()->fixed_array_map());
lrn@chromium.org303ada72010-10-27 09:33:13 +00004601 if (!maybe_writable_elems->ToObject(&writable_elems)) {
4602 return maybe_writable_elems;
4603 }
4604 }
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004605 set_elements(FixedArray::cast(writable_elems));
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004606 isolate->counters()->cow_arrays_converted()->Increment();
ricow@chromium.org0b9f8502010-08-18 07:45:01 +00004607 return writable_elems;
4608}
4609
4610
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004611StringDictionary* JSObject::property_dictionary() {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004612 ASSERT(!HasFastProperties());
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004613 return StringDictionary::cast(properties());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004614}
4615
4616
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004617SeededNumberDictionary* JSObject::element_dictionary() {
sgjesse@chromium.org0b6db592009-07-30 14:48:31 +00004618 ASSERT(HasDictionaryElements());
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004619 return SeededNumberDictionary::cast(elements());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004620}
4621
4622
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004623bool String::IsHashFieldComputed(uint32_t field) {
4624 return (field & kHashNotComputedMask) == 0;
4625}
4626
4627
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004628bool String::HasHashCode() {
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004629 return IsHashFieldComputed(hash_field());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004630}
4631
4632
4633uint32_t String::Hash() {
4634 // Fast case: has hash code already been computed?
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004635 uint32_t field = hash_field();
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004636 if (IsHashFieldComputed(field)) return field >> kHashShift;
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004637 // Slow case: compute hash code and set it.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004638 return ComputeAndSetHash();
4639}
4640
4641
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004642StringHasher::StringHasher(int length, uint32_t seed)
ager@chromium.org7c537e22008-10-16 08:43:32 +00004643 : length_(length),
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004644 raw_running_hash_(seed),
ager@chromium.org7c537e22008-10-16 08:43:32 +00004645 array_index_(0),
4646 is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize),
4647 is_first_char_(true),
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004648 is_valid_(true) {
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004649 ASSERT(FLAG_randomize_hashes || raw_running_hash_ == 0);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004650}
ager@chromium.org7c537e22008-10-16 08:43:32 +00004651
4652
4653bool StringHasher::has_trivial_hash() {
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004654 return length_ > String::kMaxHashCalcLength;
ager@chromium.org7c537e22008-10-16 08:43:32 +00004655}
4656
4657
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004658void StringHasher::AddCharacter(uint32_t c) {
4659 if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
4660 AddSurrogatePair(c); // Not inlined.
4661 return;
4662 }
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004663 // Use the Jenkins one-at-a-time hash function to update the hash
4664 // for the given character.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004665 raw_running_hash_ += c;
4666 raw_running_hash_ += (raw_running_hash_ << 10);
4667 raw_running_hash_ ^= (raw_running_hash_ >> 6);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00004668 // Incremental array index computation.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004669 if (is_array_index_) {
4670 if (c < '0' || c > '9') {
4671 is_array_index_ = false;
4672 } else {
4673 int d = c - '0';
4674 if (is_first_char_) {
4675 is_first_char_ = false;
4676 if (c == '0' && length_ > 1) {
4677 is_array_index_ = false;
4678 return;
4679 }
4680 }
4681 if (array_index_ > 429496729U - ((d + 2) >> 3)) {
4682 is_array_index_ = false;
4683 } else {
4684 array_index_ = array_index_ * 10 + d;
4685 }
4686 }
4687 }
4688}
4689
4690
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004691void StringHasher::AddCharacterNoIndex(uint32_t c) {
ager@chromium.org7c537e22008-10-16 08:43:32 +00004692 ASSERT(!is_array_index());
yangguo@chromium.org154ff992012-03-13 08:09:54 +00004693 if (c > unibrow::Utf16::kMaxNonSurrogateCharCode) {
4694 AddSurrogatePairNoIndex(c); // Not inlined.
4695 return;
4696 }
ager@chromium.org7c537e22008-10-16 08:43:32 +00004697 raw_running_hash_ += c;
4698 raw_running_hash_ += (raw_running_hash_ << 10);
4699 raw_running_hash_ ^= (raw_running_hash_ >> 6);
4700}
4701
4702
4703uint32_t StringHasher::GetHash() {
ager@chromium.org3b45ab52009-03-19 22:21:34 +00004704 // Get the calculated raw hash value and do some more bit ops to distribute
4705 // the hash further. Ensure that we never return zero as the hash value.
ager@chromium.org7c537e22008-10-16 08:43:32 +00004706 uint32_t result = raw_running_hash_;
4707 result += (result << 3);
4708 result ^= (result >> 11);
4709 result += (result << 15);
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004710 if ((result & String::kHashBitMask) == 0) {
ager@chromium.org3b45ab52009-03-19 22:21:34 +00004711 result = 27;
4712 }
ager@chromium.org7c537e22008-10-16 08:43:32 +00004713 return result;
4714}
4715
4716
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00004717template <typename schar>
rossberg@chromium.orgfab14982012-01-05 15:02:15 +00004718uint32_t HashSequentialString(const schar* chars, int length, uint32_t seed) {
4719 StringHasher hasher(length, seed);
whesse@chromium.orgb08986c2011-03-14 16:13:42 +00004720 if (!hasher.has_trivial_hash()) {
4721 int i;
4722 for (i = 0; hasher.is_array_index() && (i < length); i++) {
4723 hasher.AddCharacter(chars[i]);
4724 }
4725 for (; i < length; i++) {
4726 hasher.AddCharacterNoIndex(chars[i]);
4727 }
4728 }
4729 return hasher.GetHashField();
4730}
4731
4732
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004733bool String::AsArrayIndex(uint32_t* index) {
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +00004734 uint32_t field = hash_field();
lrn@chromium.org1af7e1b2010-06-07 11:12:01 +00004735 if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) {
4736 return false;
4737 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004738 return SlowAsArrayIndex(index);
4739}
4740
4741
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00004742Object* JSReceiver::GetPrototype() {
4743 return HeapObject::cast(this)->map()->prototype();
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004744}
4745
4746
rossberg@chromium.org717967f2011-07-20 13:44:42 +00004747bool JSReceiver::HasProperty(String* name) {
4748 if (IsJSProxy()) {
4749 return JSProxy::cast(this)->HasPropertyWithHandler(name);
4750 }
4751 return GetPropertyAttribute(name) != ABSENT;
4752}
4753
4754
4755bool JSReceiver::HasLocalProperty(String* name) {
4756 if (IsJSProxy()) {
4757 return JSProxy::cast(this)->HasPropertyWithHandler(name);
4758 }
4759 return GetLocalPropertyAttribute(name) != ABSENT;
4760}
4761
4762
ricow@chromium.orgd2be9012011-06-01 06:00:58 +00004763PropertyAttributes JSReceiver::GetPropertyAttribute(String* key) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004764 return GetPropertyAttributeWithReceiver(this, key);
4765}
4766
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004767// TODO(504): this may be useful in other places too where JSGlobalProxy
4768// is used.
4769Object* JSObject::BypassGlobalProxy() {
4770 if (IsJSGlobalProxy()) {
4771 Object* proto = GetPrototype();
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004772 if (proto->IsNull()) return GetHeap()->undefined_value();
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004773 ASSERT(proto->IsJSGlobalObject());
4774 return proto;
4775 }
4776 return this;
4777}
4778
4779
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004780MaybeObject* JSReceiver::GetIdentityHash(CreationFlag flag) {
4781 return IsJSProxy()
4782 ? JSProxy::cast(this)->GetIdentityHash(flag)
4783 : JSObject::cast(this)->GetIdentityHash(flag);
ager@chromium.orgc4c92722009-11-18 14:12:51 +00004784}
4785
4786
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004787bool JSReceiver::HasElement(uint32_t index) {
4788 if (IsJSProxy()) {
4789 return JSProxy::cast(this)->HasElementWithHandler(index);
4790 }
4791 return JSObject::cast(this)->HasElementWithReceiver(this, index);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004792}
4793
4794
4795bool AccessorInfo::all_can_read() {
4796 return BooleanBit::get(flag(), kAllCanReadBit);
4797}
4798
4799
4800void AccessorInfo::set_all_can_read(bool value) {
4801 set_flag(BooleanBit::set(flag(), kAllCanReadBit, value));
4802}
4803
4804
4805bool AccessorInfo::all_can_write() {
4806 return BooleanBit::get(flag(), kAllCanWriteBit);
4807}
4808
4809
4810void AccessorInfo::set_all_can_write(bool value) {
4811 set_flag(BooleanBit::set(flag(), kAllCanWriteBit, value));
4812}
4813
4814
ager@chromium.org870a0b62008-11-04 11:43:05 +00004815bool AccessorInfo::prohibits_overwriting() {
4816 return BooleanBit::get(flag(), kProhibitsOverwritingBit);
4817}
4818
4819
4820void AccessorInfo::set_prohibits_overwriting(bool value) {
4821 set_flag(BooleanBit::set(flag(), kProhibitsOverwritingBit, value));
4822}
4823
4824
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004825PropertyAttributes AccessorInfo::property_attributes() {
4826 return AttributesField::decode(static_cast<uint32_t>(flag()->value()));
4827}
4828
4829
4830void AccessorInfo::set_property_attributes(PropertyAttributes attributes) {
kmillikin@chromium.org83e16822011-09-13 08:21:47 +00004831 set_flag(Smi::FromInt(AttributesField::update(flag()->value(), attributes)));
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004832}
4833
karlklose@chromium.org44bc7082011-04-11 12:33:05 +00004834
mmassi@chromium.org7028c052012-06-13 11:51:58 +00004835bool AccessorInfo::IsCompatibleReceiver(Object* receiver) {
4836 Object* function_template = expected_receiver_type();
4837 if (!function_template->IsFunctionTemplateInfo()) return true;
4838 return receiver->IsInstanceOf(FunctionTemplateInfo::cast(function_template));
4839}
4840
4841
karlklose@chromium.org44bc7082011-04-11 12:33:05 +00004842template<typename Shape, typename Key>
4843void Dictionary<Shape, Key>::SetEntry(int entry,
4844 Object* key,
4845 Object* value) {
4846 SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
4847}
4848
4849
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004850template<typename Shape, typename Key>
4851void Dictionary<Shape, Key>::SetEntry(int entry,
4852 Object* key,
4853 Object* value,
4854 PropertyDetails details) {
kasperl@chromium.orgdefbd102009-07-13 14:04:26 +00004855 ASSERT(!key->IsString() || details.IsDeleted() || details.index() > 0);
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004856 int index = HashTable<Shape, Key>::EntryToIndex(entry);
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004857 AssertNoAllocation no_gc;
4858 WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
kasperl@chromium.org86f77b72009-07-06 08:21:57 +00004859 FixedArray::set(index, key, mode);
4860 FixedArray::set(index+1, value, mode);
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004861 FixedArray::set(index+2, details.AsSmi());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004862}
4863
4864
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004865bool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
4866 ASSERT(other->IsNumber());
4867 return key == static_cast<uint32_t>(other->Number());
4868}
4869
4870
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004871uint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) {
4872 return ComputeIntegerHash(key, 0);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004873}
4874
4875
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004876uint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key,
4877 Object* other) {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004878 ASSERT(other->IsNumber());
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004879 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0);
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004880}
4881
erik.corry@gmail.comf2038fb2012-01-16 11:42:08 +00004882uint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) {
4883 return ComputeIntegerHash(key, seed);
4884}
4885
4886uint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key,
4887 uint32_t seed,
4888 Object* other) {
4889 ASSERT(other->IsNumber());
4890 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed);
4891}
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004892
4893MaybeObject* NumberDictionaryShape::AsObject(uint32_t key) {
4894 return Isolate::Current()->heap()->NumberFromUint32(key);
4895}
4896
4897
4898bool StringDictionaryShape::IsMatch(String* key, Object* other) {
4899 // We know that all entries in a hash table had their hash keys created.
4900 // Use that knowledge to have fast failure.
4901 if (key->Hash() != String::cast(other)->Hash()) return false;
4902 return key->Equals(String::cast(other));
4903}
4904
4905
4906uint32_t StringDictionaryShape::Hash(String* key) {
4907 return key->Hash();
4908}
4909
4910
4911uint32_t StringDictionaryShape::HashForObject(String* key, Object* other) {
4912 return String::cast(other)->Hash();
4913}
4914
4915
4916MaybeObject* StringDictionaryShape::AsObject(String* key) {
4917 return key;
4918}
4919
4920
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004921template <int entrysize>
4922bool ObjectHashTableShape<entrysize>::IsMatch(Object* key, Object* other) {
4923 return key->SameValue(other);
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004924}
4925
4926
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004927template <int entrysize>
4928uint32_t ObjectHashTableShape<entrysize>::Hash(Object* key) {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004929 MaybeObject* maybe_hash = key->GetHash(OMIT_CREATION);
4930 return Smi::cast(maybe_hash->ToObjectChecked())->value();
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004931}
4932
4933
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004934template <int entrysize>
4935uint32_t ObjectHashTableShape<entrysize>::HashForObject(Object* key,
4936 Object* other) {
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004937 MaybeObject* maybe_hash = other->GetHash(OMIT_CREATION);
4938 return Smi::cast(maybe_hash->ToObjectChecked())->value();
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004939}
4940
4941
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00004942template <int entrysize>
4943MaybeObject* ObjectHashTableShape<entrysize>::AsObject(Object* key) {
vegorov@chromium.org7943d462011-08-01 11:41:52 +00004944 return key;
4945}
4946
4947
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004948void Map::ClearCodeCache(Heap* heap) {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004949 // No write barrier is needed since empty_fixed_array is not in new space.
4950 // Please note this function is used during marking:
4951 // - MarkCompactCollector::MarkUnmarkedObject
danno@chromium.org88aa0582012-03-23 15:11:57 +00004952 // - IncrementalMarking::Step
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004953 ASSERT(!heap->InNewSpace(heap->raw_unchecked_empty_fixed_array()));
4954 WRITE_FIELD(this, kCodeCacheOffset, heap->raw_unchecked_empty_fixed_array());
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00004955}
4956
4957
ager@chromium.org5aa501c2009-06-23 07:57:28 +00004958void JSArray::EnsureSize(int required_size) {
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004959 ASSERT(HasFastSmiOrObjectElements());
ricow@chromium.org30ce4112010-05-31 10:38:25 +00004960 FixedArray* elts = FixedArray::cast(elements());
ager@chromium.org6141cbe2009-11-20 12:14:52 +00004961 const int kArraySizeThatFitsComfortablyInNewSpace = 128;
4962 if (elts->length() < required_size) {
4963 // Doubling in size would be overkill, but leave some slack to avoid
4964 // constantly growing.
4965 Expand(required_size + (required_size >> 3));
4966 // It's a performance benefit to keep a frequently used array in new-space.
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00004967 } else if (!GetHeap()->new_space()->Contains(elts) &&
ager@chromium.org6141cbe2009-11-20 12:14:52 +00004968 required_size < kArraySizeThatFitsComfortablyInNewSpace) {
4969 // Expand will allocate a new backing store in new space even if the size
4970 // we asked for isn't larger than what we had before.
4971 Expand(required_size);
4972 }
ager@chromium.org5aa501c2009-06-23 07:57:28 +00004973}
4974
4975
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004976void JSArray::set_length(Smi* length) {
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00004977 // Don't need a write barrier for a Smi.
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00004978 set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
4979}
4980
4981
ricow@chromium.org7ad65222011-12-19 12:13:11 +00004982bool JSArray::AllowsSetElementsLength() {
4983 bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray();
4984 ASSERT(result == !HasExternalArrayElements());
4985 return result;
4986}
4987
4988
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00004989MaybeObject* JSArray::SetContent(FixedArrayBase* storage) {
4990 MaybeObject* maybe_result = EnsureCanContainElements(
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004991 storage, storage->length(), ALLOW_COPIED_DOUBLE_ELEMENTS);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00004992 if (maybe_result->IsFailure()) return maybe_result;
4993 ASSERT((storage->map() == GetHeap()->fixed_double_array_map() &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004994 IsFastDoubleElementsKind(GetElementsKind())) ||
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00004995 ((storage->map() != GetHeap()->fixed_double_array_map()) &&
svenpanne@chromium.org830d30c2012-05-29 13:20:14 +00004996 (IsFastObjectElementsKind(GetElementsKind()) ||
4997 (IsFastSmiElementsKind(GetElementsKind()) &&
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00004998 FixedArray::cast(storage)->ContainsOnlySmisOrHoles()))));
ager@chromium.org7c537e22008-10-16 08:43:32 +00004999 set_elements(storage);
ricow@chromium.org64e3a4b2011-12-13 08:07:27 +00005000 set_length(Smi::FromInt(storage->length()));
erik.corry@gmail.comc3b670f2011-10-05 21:44:48 +00005001 return this;
ager@chromium.org7c537e22008-10-16 08:43:32 +00005002}
5003
5004
lrn@chromium.org303ada72010-10-27 09:33:13 +00005005MaybeObject* FixedArray::Copy() {
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005006 if (length() == 0) return this;
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00005007 return GetHeap()->CopyFixedArray(this);
5008}
5009
5010
erik.corry@gmail.com394dbcf2011-10-27 07:38:48 +00005011MaybeObject* FixedDoubleArray::Copy() {
5012 if (length() == 0) return this;
5013 return GetHeap()->CopyFixedDoubleArray(this);
5014}
5015
5016
danno@chromium.orgfa458e42012-02-01 10:48:36 +00005017void TypeFeedbackCells::SetAstId(int index, Smi* id) {
5018 set(1 + index * 2, id);
5019}
5020
5021
5022Smi* TypeFeedbackCells::AstId(int index) {
5023 return Smi::cast(get(1 + index * 2));
5024}
5025
5026
5027void TypeFeedbackCells::SetCell(int index, JSGlobalPropertyCell* cell) {
5028 set(index * 2, cell);
5029}
5030
5031
5032JSGlobalPropertyCell* TypeFeedbackCells::Cell(int index) {
5033 return JSGlobalPropertyCell::cast(get(index * 2));
5034}
5035
5036
5037Handle<Object> TypeFeedbackCells::UninitializedSentinel(Isolate* isolate) {
5038 return isolate->factory()->the_hole_value();
5039}
5040
5041
5042Handle<Object> TypeFeedbackCells::MegamorphicSentinel(Isolate* isolate) {
5043 return isolate->factory()->undefined_value();
5044}
5045
5046
5047Object* TypeFeedbackCells::RawUninitializedSentinel(Heap* heap) {
5048 return heap->raw_unchecked_the_hole_value();
5049}
5050
5051
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00005052SMI_ACCESSORS(TypeFeedbackInfo, ic_total_count, kIcTotalCountOffset)
jkummerow@chromium.org1456e702012-03-30 08:38:13 +00005053SMI_ACCESSORS(TypeFeedbackInfo, ic_with_type_info_count,
jkummerow@chromium.orgf7a58842012-02-21 10:08:21 +00005054 kIcWithTypeinfoCountOffset)
5055ACCESSORS(TypeFeedbackInfo, type_feedback_cells, TypeFeedbackCells,
5056 kTypeFeedbackCellsOffset)
5057
5058
yangguo@chromium.orgab30bb82012-02-24 14:41:46 +00005059SMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot)
5060
5061
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +00005062Relocatable::Relocatable(Isolate* isolate) {
5063 ASSERT(isolate == Isolate::Current());
5064 isolate_ = isolate;
5065 prev_ = isolate->relocatable_top();
5066 isolate->set_relocatable_top(this);
5067}
5068
5069
5070Relocatable::~Relocatable() {
5071 ASSERT(isolate_ == Isolate::Current());
5072 ASSERT_EQ(isolate_->relocatable_top(), this);
5073 isolate_->set_relocatable_top(prev_);
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005074}
5075
5076
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005077int JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) {
5078 return map->instance_size();
5079}
5080
5081
ager@chromium.orgea91cc52011-05-23 06:06:11 +00005082void Foreign::ForeignIterateBody(ObjectVisitor* v) {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005083 v->VisitExternalReference(
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00005084 reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005085}
5086
5087
5088template<typename StaticVisitor>
ager@chromium.orgea91cc52011-05-23 06:06:11 +00005089void Foreign::ForeignIterateBody() {
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005090 StaticVisitor::VisitExternalReference(
jkummerow@chromium.orgc3b37122011-11-07 10:14:12 +00005091 reinterpret_cast<Address*>(FIELD_ADDR(this, kForeignAddressOffset)));
ager@chromium.orgea4f62e2010-08-16 16:28:43 +00005092}
5093
5094
5095void ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) {
5096 typedef v8::String::ExternalAsciiStringResource Resource;
5097 v->VisitExternalAsciiString(
5098 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5099}
5100
5101
5102template<typename StaticVisitor>
5103void ExternalAsciiString::ExternalAsciiStringIterateBody() {
5104 typedef v8::String::ExternalAsciiStringResource Resource;
5105 StaticVisitor::VisitExternalAsciiString(
5106 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5107}
5108
5109
5110void ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) {
5111 typedef v8::String::ExternalStringResource Resource;
5112 v->VisitExternalTwoByteString(
5113 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5114}
5115
5116
5117template<typename StaticVisitor>
5118void ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
5119 typedef v8::String::ExternalStringResource Resource;
5120 StaticVisitor::VisitExternalTwoByteString(
5121 reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
5122}
5123
5124#define SLOT_ADDR(obj, offset) \
5125 reinterpret_cast<Object**>((obj)->address() + offset)
5126
5127template<int start_offset, int end_offset, int size>
5128void FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody(
5129 HeapObject* obj,
5130 ObjectVisitor* v) {
5131 v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, end_offset));
5132}
5133
5134
5135template<int start_offset>
5136void FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj,
5137 int object_size,
5138 ObjectVisitor* v) {
5139 v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, object_size));
5140}
5141
5142#undef SLOT_ADDR
5143
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005144#undef TYPE_CHECKER
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005145#undef CAST_ACCESSOR
5146#undef INT_ACCESSORS
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005147#undef ACCESSORS
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005148#undef ACCESSORS_TO_SMI
5149#undef SMI_ACCESSORS
5150#undef BOOL_GETTER
5151#undef BOOL_ACCESSORS
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005152#undef FIELD_ADDR
5153#undef READ_FIELD
5154#undef WRITE_FIELD
5155#undef WRITE_BARRIER
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00005156#undef CONDITIONAL_WRITE_BARRIER
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005157#undef READ_DOUBLE_FIELD
5158#undef WRITE_DOUBLE_FIELD
5159#undef READ_INT_FIELD
5160#undef WRITE_INT_FIELD
rossberg@chromium.org2c067b12012-03-19 11:01:52 +00005161#undef READ_INTPTR_FIELD
5162#undef WRITE_INTPTR_FIELD
5163#undef READ_UINT32_FIELD
5164#undef WRITE_UINT32_FIELD
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00005165#undef READ_SHORT_FIELD
5166#undef WRITE_SHORT_FIELD
5167#undef READ_BYTE_FIELD
5168#undef WRITE_BYTE_FIELD
5169
5170
5171} } // namespace v8::internal
5172
5173#endif // V8_OBJECTS_INL_H_