238
238
bool String::IsAsciiRepresentation() {
239
239
uint32_t type = map()->instance_type();
240
if ((type & kStringRepresentationMask) == kConsStringTag &&
241
ConsString::cast(this)->second()->length() == 0) {
242
return ConsString::cast(this)->first()->IsAsciiRepresentation();
244
240
return (type & kStringEncodingMask) == kAsciiStringTag;
248
244
bool String::IsTwoByteRepresentation() {
249
245
uint32_t type = map()->instance_type();
250
if ((type & kStringRepresentationMask) == kConsStringTag &&
251
ConsString::cast(this)->second()->length() == 0) {
252
return ConsString::cast(this)->first()->IsTwoByteRepresentation();
254
246
return (type & kStringEncodingMask) == kTwoByteStringTag;
258
bool String::IsExternalTwoByteStringWithAsciiChars() {
259
if (!IsExternalTwoByteString()) return false;
260
const uc16* data = ExternalTwoByteString::cast(this)->resource()->data();
261
for (int i = 0, len = length(); i < len; i++) {
262
if (data[i] > kMaxAsciiCharCode) return false;
250
bool String::HasOnlyAsciiChars() {
251
uint32_t type = map()->instance_type();
252
return (type & kStringEncodingMask) == kAsciiStringTag ||
253
(type & kAsciiDataHintMask) == kAsciiDataHintTag;
1162
1156
ACCESSORS(JSObject, properties, FixedArray, kPropertiesOffset)
1165
Array* JSObject::elements() {
1159
HeapObject* JSObject::elements() {
1166
1160
Object* array = READ_FIELD(this, kElementsOffset);
1167
1161
// In the assert below Dictionary is covered under FixedArray.
1168
1162
ASSERT(array->IsFixedArray() || array->IsPixelArray() ||
1169
1163
array->IsExternalArray());
1170
return reinterpret_cast<Array*>(array);
1164
return reinterpret_cast<HeapObject*>(array);
1174
void JSObject::set_elements(Array* value, WriteBarrierMode mode) {
1168
void JSObject::set_elements(HeapObject* value, WriteBarrierMode mode) {
1169
ASSERT(map()->has_fast_elements() ==
1170
(value->map() == Heap::fixed_array_map()));
1175
1171
// In the assert below Dictionary is covered under FixedArray.
1176
1172
ASSERT(value->IsFixedArray() || value->IsPixelArray() ||
1177
1173
value->IsExternalArray());
1332
void Struct::InitializeBody(int object_size) {
1333
Object* value = Heap::undefined_value();
1334
for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
1335
WRITE_FIELD(this, offset, value);
1340
1338
bool JSObject::HasFastProperties() {
1341
1339
return !properties()->IsDictionary();
1345
bool Array::IndexFromObject(Object* object, uint32_t* index) {
1346
if (object->IsSmi()) {
1347
int value = Smi::cast(object)->value();
1343
int JSObject::MaxFastProperties() {
1344
// Allow extra fast properties if the object has more than
1345
// kMaxFastProperties in-object properties. When this is the case,
1346
// it is very unlikely that the object is being used as a dictionary
1347
// and there is a good chance that allowing more map transitions
1348
// will be worth it.
1349
return Max(map()->inobject_properties(), kMaxFastProperties);
1353
void Struct::InitializeBody(int object_size) {
1354
Object* value = Heap::undefined_value();
1355
for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
1356
WRITE_FIELD(this, offset, value);
1361
bool Object::ToArrayIndex(uint32_t* index) {
1363
int value = Smi::cast(this)->value();
1348
1364
if (value < 0) return false;
1349
1365
*index = value;
1352
if (object->IsHeapNumber()) {
1353
double value = HeapNumber::cast(object)->value();
1368
if (IsHeapNumber()) {
1369
double value = HeapNumber::cast(this)->value();
1354
1370
uint32_t uint_value = static_cast<uint32_t>(value);
1355
1371
if (value == static_cast<double>(uint_value)) {
1356
1372
*index = uint_value;
2395
Object* Map::GetFastElementsMap() {
2396
if (has_fast_elements()) return this;
2397
Object* obj = CopyDropTransitions();
2398
if (obj->IsFailure()) return obj;
2399
Map* new_map = Map::cast(obj);
2400
new_map->set_has_fast_elements(true);
2405
Object* Map::GetSlowElementsMap() {
2406
if (!has_fast_elements()) return this;
2407
Object* obj = CopyDropTransitions();
2408
if (obj->IsFailure()) return obj;
2409
Map* new_map = Map::cast(obj);
2410
new_map->set_has_fast_elements(false);
2336
2415
ACCESSORS(Map, instance_descriptors, DescriptorArray,
2337
2416
kInstanceDescriptorsOffset)
2338
2417
ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
2455
2534
compiler_hints,
2456
2535
try_full_codegen,
2457
2536
kTryFullCodegen)
2459
INT_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
2460
INT_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
2461
kFormalParameterCountOffset)
2462
INT_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
2463
kExpectedNofPropertiesOffset)
2464
INT_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
2465
INT_ACCESSORS(SharedFunctionInfo, start_position_and_type,
2466
kStartPositionAndTypeOffset)
2467
INT_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
2468
INT_ACCESSORS(SharedFunctionInfo, function_token_position,
2469
kFunctionTokenPositionOffset)
2470
INT_ACCESSORS(SharedFunctionInfo, compiler_hints,
2471
kCompilerHintsOffset)
2472
INT_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
2473
kThisPropertyAssignmentsCountOffset)
2537
BOOL_ACCESSORS(SharedFunctionInfo,
2539
allows_lazy_compilation,
2540
kAllowLazyCompilation)
2542
#if V8_HOST_ARCH_32_BIT
2543
SMI_ACCESSORS(SharedFunctionInfo, length, kLengthOffset)
2544
SMI_ACCESSORS(SharedFunctionInfo, formal_parameter_count,
2545
kFormalParameterCountOffset)
2546
SMI_ACCESSORS(SharedFunctionInfo, expected_nof_properties,
2547
kExpectedNofPropertiesOffset)
2548
SMI_ACCESSORS(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
2549
SMI_ACCESSORS(SharedFunctionInfo, start_position_and_type,
2550
kStartPositionAndTypeOffset)
2551
SMI_ACCESSORS(SharedFunctionInfo, end_position, kEndPositionOffset)
2552
SMI_ACCESSORS(SharedFunctionInfo, function_token_position,
2553
kFunctionTokenPositionOffset)
2554
SMI_ACCESSORS(SharedFunctionInfo, compiler_hints,
2555
kCompilerHintsOffset)
2556
SMI_ACCESSORS(SharedFunctionInfo, this_property_assignments_count,
2557
kThisPropertyAssignmentsCountOffset)
2560
#define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \
2561
int holder::name() { \
2562
int value = READ_INT_FIELD(this, offset); \
2563
ASSERT(kHeapObjectTag == 1); \
2564
ASSERT((value & kHeapObjectTag) == 0); \
2565
return value >> 1; \
2567
void holder::set_##name(int value) { \
2568
ASSERT(kHeapObjectTag == 1); \
2569
ASSERT((value & 0xC0000000) == 0xC0000000 || \
2570
(value & 0xC0000000) == 0x000000000); \
2571
WRITE_INT_FIELD(this, \
2573
(value << 1) & ~kHeapObjectTag); \
2576
#define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \
2577
INT_ACCESSORS(holder, name, offset)
2581
PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, length, kLengthOffset)
2582
PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, formal_parameter_count,
2583
kFormalParameterCountOffset)
2585
PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, expected_nof_properties,
2586
kExpectedNofPropertiesOffset)
2587
PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, num_literals, kNumLiteralsOffset)
2589
PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, start_position_and_type,
2590
kStartPositionAndTypeOffset)
2591
PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, end_position, kEndPositionOffset)
2593
PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, function_token_position,
2594
kFunctionTokenPositionOffset)
2595
PSEUDO_SMI_ACCESSORS_HI(SharedFunctionInfo, compiler_hints,
2596
kCompilerHintsOffset)
2598
PSEUDO_SMI_ACCESSORS_LO(SharedFunctionInfo, this_property_assignments_count,
2599
kThisPropertyAssignmentsCountOffset)
2476
2602
ACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
2477
2603
ACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
3302
int JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) {
3303
return map->instance_size();
3307
void Proxy::ProxyIterateBody(ObjectVisitor* v) {
3308
v->VisitExternalReference(
3309
reinterpret_cast<Address *>(FIELD_ADDR(this, kProxyOffset)));
3313
template<typename StaticVisitor>
3314
void Proxy::ProxyIterateBody() {
3315
StaticVisitor::VisitExternalReference(
3316
reinterpret_cast<Address *>(FIELD_ADDR(this, kProxyOffset)));
3320
void ExternalAsciiString::ExternalAsciiStringIterateBody(ObjectVisitor* v) {
3321
typedef v8::String::ExternalAsciiStringResource Resource;
3322
v->VisitExternalAsciiString(
3323
reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
3327
template<typename StaticVisitor>
3328
void ExternalAsciiString::ExternalAsciiStringIterateBody() {
3329
typedef v8::String::ExternalAsciiStringResource Resource;
3330
StaticVisitor::VisitExternalAsciiString(
3331
reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
3335
void ExternalTwoByteString::ExternalTwoByteStringIterateBody(ObjectVisitor* v) {
3336
typedef v8::String::ExternalStringResource Resource;
3337
v->VisitExternalTwoByteString(
3338
reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
3342
template<typename StaticVisitor>
3343
void ExternalTwoByteString::ExternalTwoByteStringIterateBody() {
3344
typedef v8::String::ExternalStringResource Resource;
3345
StaticVisitor::VisitExternalTwoByteString(
3346
reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)));
3349
#define SLOT_ADDR(obj, offset) \
3350
reinterpret_cast<Object**>((obj)->address() + offset)
3352
template<int start_offset, int end_offset, int size>
3353
void FixedBodyDescriptor<start_offset, end_offset, size>::IterateBody(
3356
v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, end_offset));
3360
template<int start_offset>
3361
void FlexibleBodyDescriptor<start_offset>::IterateBody(HeapObject* obj,
3364
v->VisitPointers(SLOT_ADDR(obj, start_offset), SLOT_ADDR(obj, object_size));
3149
3370
#undef CAST_ACCESSOR
3150
3371
#undef INT_ACCESSORS
3151
3372
#undef SMI_ACCESSORS