Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(342)

Side by Side Diff: src/objects-inl.h

Issue 430503007: Rename ASSERT* to DCHECK*. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE and fixes Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-visiting.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // Review notes: 5 // Review notes:
6 // 6 //
7 // - The use of macros in these inline functions may seem superfluous 7 // - The use of macros in these inline functions may seem superfluous
8 // but it is absolutely needed to make sure gcc generates optimal 8 // but it is absolutely needed to make sure gcc generates optimal
9 // code. gcc is not happy when attempting to inline too deep. 9 // code. gcc is not happy when attempting to inline too deep.
10 // 10 //
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 56
57 #define TYPE_CHECKER(type, instancetype) \ 57 #define TYPE_CHECKER(type, instancetype) \
58 bool Object::Is##type() const { \ 58 bool Object::Is##type() const { \
59 return Object::IsHeapObject() && \ 59 return Object::IsHeapObject() && \
60 HeapObject::cast(this)->map()->instance_type() == instancetype; \ 60 HeapObject::cast(this)->map()->instance_type() == instancetype; \
61 } 61 }
62 62
63 63
64 #define CAST_ACCESSOR(type) \ 64 #define CAST_ACCESSOR(type) \
65 type* type::cast(Object* object) { \ 65 type* type::cast(Object* object) { \
66 SLOW_ASSERT(object->Is##type()); \ 66 SLOW_DCHECK(object->Is##type()); \
67 return reinterpret_cast<type*>(object); \ 67 return reinterpret_cast<type*>(object); \
68 } \ 68 } \
69 const type* type::cast(const Object* object) { \ 69 const type* type::cast(const Object* object) { \
70 SLOW_ASSERT(object->Is##type()); \ 70 SLOW_DCHECK(object->Is##type()); \
71 return reinterpret_cast<const type*>(object); \ 71 return reinterpret_cast<const type*>(object); \
72 } 72 }
73 73
74 74
75 #define INT_ACCESSORS(holder, name, offset) \ 75 #define INT_ACCESSORS(holder, name, offset) \
76 int holder::name() const { return READ_INT_FIELD(this, offset); } \ 76 int holder::name() const { return READ_INT_FIELD(this, offset); } \
77 void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); } 77 void holder::set_##name(int value) { WRITE_INT_FIELD(this, offset, value); }
78 78
79 79
80 #define ACCESSORS(holder, name, type, offset) \ 80 #define ACCESSORS(holder, name, type, offset) \
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 } else { 287 } else {
288 value = object->Number(); 288 value = object->Number();
289 } 289 }
290 return isolate->factory()->NewHeapNumber(value, MUTABLE); 290 return isolate->factory()->NewHeapNumber(value, MUTABLE);
291 } 291 }
292 292
293 293
294 Handle<Object> Object::WrapForRead(Isolate* isolate, 294 Handle<Object> Object::WrapForRead(Isolate* isolate,
295 Handle<Object> object, 295 Handle<Object> object,
296 Representation representation) { 296 Representation representation) {
297 ASSERT(!object->IsUninitialized()); 297 DCHECK(!object->IsUninitialized());
298 if (!representation.IsDouble()) { 298 if (!representation.IsDouble()) {
299 ASSERT(object->FitsRepresentation(representation)); 299 DCHECK(object->FitsRepresentation(representation));
300 return object; 300 return object;
301 } 301 }
302 return isolate->factory()->NewHeapNumber(HeapNumber::cast(*object)->value()); 302 return isolate->factory()->NewHeapNumber(HeapNumber::cast(*object)->value());
303 } 303 }
304 304
305 305
306 StringShape::StringShape(const String* str) 306 StringShape::StringShape(const String* str)
307 : type_(str->map()->instance_type()) { 307 : type_(str->map()->instance_type()) {
308 set_valid(); 308 set_valid();
309 ASSERT((type_ & kIsNotStringMask) == kStringTag); 309 DCHECK((type_ & kIsNotStringMask) == kStringTag);
310 } 310 }
311 311
312 312
313 StringShape::StringShape(Map* map) 313 StringShape::StringShape(Map* map)
314 : type_(map->instance_type()) { 314 : type_(map->instance_type()) {
315 set_valid(); 315 set_valid();
316 ASSERT((type_ & kIsNotStringMask) == kStringTag); 316 DCHECK((type_ & kIsNotStringMask) == kStringTag);
317 } 317 }
318 318
319 319
320 StringShape::StringShape(InstanceType t) 320 StringShape::StringShape(InstanceType t)
321 : type_(static_cast<uint32_t>(t)) { 321 : type_(static_cast<uint32_t>(t)) {
322 set_valid(); 322 set_valid();
323 ASSERT((type_ & kIsNotStringMask) == kStringTag); 323 DCHECK((type_ & kIsNotStringMask) == kStringTag);
324 } 324 }
325 325
326 326
327 bool StringShape::IsInternalized() { 327 bool StringShape::IsInternalized() {
328 ASSERT(valid()); 328 DCHECK(valid());
329 STATIC_ASSERT(kNotInternalizedTag != 0); 329 STATIC_ASSERT(kNotInternalizedTag != 0);
330 return (type_ & (kIsNotStringMask | kIsNotInternalizedMask)) == 330 return (type_ & (kIsNotStringMask | kIsNotInternalizedMask)) ==
331 (kStringTag | kInternalizedTag); 331 (kStringTag | kInternalizedTag);
332 } 332 }
333 333
334 334
335 bool String::IsOneByteRepresentation() const { 335 bool String::IsOneByteRepresentation() const {
336 uint32_t type = map()->instance_type(); 336 uint32_t type = map()->instance_type();
337 return (type & kStringEncodingMask) == kOneByteStringTag; 337 return (type & kStringEncodingMask) == kOneByteStringTag;
338 } 338 }
339 339
340 340
341 bool String::IsTwoByteRepresentation() const { 341 bool String::IsTwoByteRepresentation() const {
342 uint32_t type = map()->instance_type(); 342 uint32_t type = map()->instance_type();
343 return (type & kStringEncodingMask) == kTwoByteStringTag; 343 return (type & kStringEncodingMask) == kTwoByteStringTag;
344 } 344 }
345 345
346 346
347 bool String::IsOneByteRepresentationUnderneath() { 347 bool String::IsOneByteRepresentationUnderneath() {
348 uint32_t type = map()->instance_type(); 348 uint32_t type = map()->instance_type();
349 STATIC_ASSERT(kIsIndirectStringTag != 0); 349 STATIC_ASSERT(kIsIndirectStringTag != 0);
350 STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0); 350 STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
351 ASSERT(IsFlat()); 351 DCHECK(IsFlat());
352 switch (type & (kIsIndirectStringMask | kStringEncodingMask)) { 352 switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
353 case kOneByteStringTag: 353 case kOneByteStringTag:
354 return true; 354 return true;
355 case kTwoByteStringTag: 355 case kTwoByteStringTag:
356 return false; 356 return false;
357 default: // Cons or sliced string. Need to go deeper. 357 default: // Cons or sliced string. Need to go deeper.
358 return GetUnderlying()->IsOneByteRepresentation(); 358 return GetUnderlying()->IsOneByteRepresentation();
359 } 359 }
360 } 360 }
361 361
362 362
363 bool String::IsTwoByteRepresentationUnderneath() { 363 bool String::IsTwoByteRepresentationUnderneath() {
364 uint32_t type = map()->instance_type(); 364 uint32_t type = map()->instance_type();
365 STATIC_ASSERT(kIsIndirectStringTag != 0); 365 STATIC_ASSERT(kIsIndirectStringTag != 0);
366 STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0); 366 STATIC_ASSERT((kIsIndirectStringMask & kStringEncodingMask) == 0);
367 ASSERT(IsFlat()); 367 DCHECK(IsFlat());
368 switch (type & (kIsIndirectStringMask | kStringEncodingMask)) { 368 switch (type & (kIsIndirectStringMask | kStringEncodingMask)) {
369 case kOneByteStringTag: 369 case kOneByteStringTag:
370 return false; 370 return false;
371 case kTwoByteStringTag: 371 case kTwoByteStringTag:
372 return true; 372 return true;
373 default: // Cons or sliced string. Need to go deeper. 373 default: // Cons or sliced string. Need to go deeper.
374 return GetUnderlying()->IsTwoByteRepresentation(); 374 return GetUnderlying()->IsTwoByteRepresentation();
375 } 375 }
376 } 376 }
377 377
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag); 456 return full_representation_tag() == (kExternalStringTag | kTwoByteStringTag);
457 } 457 }
458 458
459 459
460 STATIC_ASSERT((kExternalStringTag | kTwoByteStringTag) == 460 STATIC_ASSERT((kExternalStringTag | kTwoByteStringTag) ==
461 Internals::kExternalTwoByteRepresentationTag); 461 Internals::kExternalTwoByteRepresentationTag);
462 462
463 STATIC_ASSERT(v8::String::TWO_BYTE_ENCODING == kTwoByteStringTag); 463 STATIC_ASSERT(v8::String::TWO_BYTE_ENCODING == kTwoByteStringTag);
464 464
465 uc32 FlatStringReader::Get(int index) { 465 uc32 FlatStringReader::Get(int index) {
466 ASSERT(0 <= index && index <= length_); 466 DCHECK(0 <= index && index <= length_);
467 if (is_ascii_) { 467 if (is_ascii_) {
468 return static_cast<const byte*>(start_)[index]; 468 return static_cast<const byte*>(start_)[index];
469 } else { 469 } else {
470 return static_cast<const uc16*>(start_)[index]; 470 return static_cast<const uc16*>(start_)[index];
471 } 471 }
472 } 472 }
473 473
474 474
475 Handle<Object> StringTableShape::AsHandle(Isolate* isolate, HashTableKey* key) { 475 Handle<Object> StringTableShape::AsHandle(Isolate* isolate, HashTableKey* key) {
476 return key->AsHandle(isolate); 476 return key->AsHandle(isolate);
(...skipping 21 matching lines...) Expand all
498 public: 498 public:
499 explicit SequentialStringKey(Vector<const Char> string, uint32_t seed) 499 explicit SequentialStringKey(Vector<const Char> string, uint32_t seed)
500 : string_(string), hash_field_(0), seed_(seed) { } 500 : string_(string), hash_field_(0), seed_(seed) { }
501 501
502 virtual uint32_t Hash() V8_OVERRIDE { 502 virtual uint32_t Hash() V8_OVERRIDE {
503 hash_field_ = StringHasher::HashSequentialString<Char>(string_.start(), 503 hash_field_ = StringHasher::HashSequentialString<Char>(string_.start(),
504 string_.length(), 504 string_.length(),
505 seed_); 505 seed_);
506 506
507 uint32_t result = hash_field_ >> String::kHashShift; 507 uint32_t result = hash_field_ >> String::kHashShift;
508 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. 508 DCHECK(result != 0); // Ensure that the hash value of 0 is never computed.
509 return result; 509 return result;
510 } 510 }
511 511
512 512
513 virtual uint32_t HashForObject(Object* other) V8_OVERRIDE { 513 virtual uint32_t HashForObject(Object* other) V8_OVERRIDE {
514 return String::cast(other)->Hash(); 514 return String::cast(other)->Hash();
515 } 515 }
516 516
517 Vector<const Char> string_; 517 Vector<const Char> string_;
518 uint32_t hash_field_; 518 uint32_t hash_field_;
(...skipping 15 matching lines...) Expand all
534 534
535 535
536 template<class Char> 536 template<class Char>
537 class SubStringKey : public HashTableKey { 537 class SubStringKey : public HashTableKey {
538 public: 538 public:
539 SubStringKey(Handle<String> string, int from, int length) 539 SubStringKey(Handle<String> string, int from, int length)
540 : string_(string), from_(from), length_(length) { 540 : string_(string), from_(from), length_(length) {
541 if (string_->IsSlicedString()) { 541 if (string_->IsSlicedString()) {
542 string_ = Handle<String>(Unslice(*string_, &from_)); 542 string_ = Handle<String>(Unslice(*string_, &from_));
543 } 543 }
544 ASSERT(string_->IsSeqString() || string->IsExternalString()); 544 DCHECK(string_->IsSeqString() || string->IsExternalString());
545 } 545 }
546 546
547 virtual uint32_t Hash() V8_OVERRIDE { 547 virtual uint32_t Hash() V8_OVERRIDE {
548 ASSERT(length_ >= 0); 548 DCHECK(length_ >= 0);
549 ASSERT(from_ + length_ <= string_->length()); 549 DCHECK(from_ + length_ <= string_->length());
550 const Char* chars = GetChars() + from_; 550 const Char* chars = GetChars() + from_;
551 hash_field_ = StringHasher::HashSequentialString( 551 hash_field_ = StringHasher::HashSequentialString(
552 chars, length_, string_->GetHeap()->HashSeed()); 552 chars, length_, string_->GetHeap()->HashSeed());
553 uint32_t result = hash_field_ >> String::kHashShift; 553 uint32_t result = hash_field_ >> String::kHashShift;
554 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. 554 DCHECK(result != 0); // Ensure that the hash value of 0 is never computed.
555 return result; 555 return result;
556 } 556 }
557 557
558 virtual uint32_t HashForObject(Object* other) V8_OVERRIDE { 558 virtual uint32_t HashForObject(Object* other) V8_OVERRIDE {
559 return String::cast(other)->Hash(); 559 return String::cast(other)->Hash();
560 } 560 }
561 561
562 virtual bool IsMatch(Object* string) V8_OVERRIDE; 562 virtual bool IsMatch(Object* string) V8_OVERRIDE;
563 virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE; 563 virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE;
564 564
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 : string_(string), hash_field_(0), seed_(seed) { } 600 : string_(string), hash_field_(0), seed_(seed) { }
601 601
602 virtual bool IsMatch(Object* string) V8_OVERRIDE { 602 virtual bool IsMatch(Object* string) V8_OVERRIDE {
603 return String::cast(string)->IsUtf8EqualTo(string_); 603 return String::cast(string)->IsUtf8EqualTo(string_);
604 } 604 }
605 605
606 virtual uint32_t Hash() V8_OVERRIDE { 606 virtual uint32_t Hash() V8_OVERRIDE {
607 if (hash_field_ != 0) return hash_field_ >> String::kHashShift; 607 if (hash_field_ != 0) return hash_field_ >> String::kHashShift;
608 hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_); 608 hash_field_ = StringHasher::ComputeUtf8Hash(string_, seed_, &chars_);
609 uint32_t result = hash_field_ >> String::kHashShift; 609 uint32_t result = hash_field_ >> String::kHashShift;
610 ASSERT(result != 0); // Ensure that the hash value of 0 is never computed. 610 DCHECK(result != 0); // Ensure that the hash value of 0 is never computed.
611 return result; 611 return result;
612 } 612 }
613 613
614 virtual uint32_t HashForObject(Object* other) V8_OVERRIDE { 614 virtual uint32_t HashForObject(Object* other) V8_OVERRIDE {
615 return String::cast(other)->Hash(); 615 return String::cast(other)->Hash();
616 } 616 }
617 617
618 virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE { 618 virtual Handle<Object> AsHandle(Isolate* isolate) V8_OVERRIDE {
619 if (hash_field_ == 0) Hash(); 619 if (hash_field_ == 0) Hash();
620 return isolate->factory()->NewInternalizedStringFromUtf8( 620 return isolate->factory()->NewInternalizedStringFromUtf8(
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 975
976 bool Object::IsPrimitive() const { 976 bool Object::IsPrimitive() const {
977 return IsOddball() || IsNumber() || IsString(); 977 return IsOddball() || IsNumber() || IsString();
978 } 978 }
979 979
980 980
981 bool Object::IsJSGlobalProxy() const { 981 bool Object::IsJSGlobalProxy() const {
982 bool result = IsHeapObject() && 982 bool result = IsHeapObject() &&
983 (HeapObject::cast(this)->map()->instance_type() == 983 (HeapObject::cast(this)->map()->instance_type() ==
984 JS_GLOBAL_PROXY_TYPE); 984 JS_GLOBAL_PROXY_TYPE);
985 ASSERT(!result || 985 DCHECK(!result ||
986 HeapObject::cast(this)->map()->is_access_check_needed()); 986 HeapObject::cast(this)->map()->is_access_check_needed());
987 return result; 987 return result;
988 } 988 }
989 989
990 990
991 bool Object::IsGlobalObject() const { 991 bool Object::IsGlobalObject() const {
992 if (!IsHeapObject()) return false; 992 if (!IsHeapObject()) return false;
993 993
994 InstanceType type = HeapObject::cast(this)->map()->instance_type(); 994 InstanceType type = HeapObject::cast(this)->map()->instance_type();
995 return type == JS_GLOBAL_OBJECT_TYPE || 995 return type == JS_GLOBAL_OBJECT_TYPE ||
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
1072 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse; 1072 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kFalse;
1073 } 1073 }
1074 1074
1075 1075
1076 bool Object::IsArgumentsMarker() const { 1076 bool Object::IsArgumentsMarker() const {
1077 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker; 1077 return IsOddball() && Oddball::cast(this)->kind() == Oddball::kArgumentMarker;
1078 } 1078 }
1079 1079
1080 1080
1081 double Object::Number() { 1081 double Object::Number() {
1082 ASSERT(IsNumber()); 1082 DCHECK(IsNumber());
1083 return IsSmi() 1083 return IsSmi()
1084 ? static_cast<double>(reinterpret_cast<Smi*>(this)->value()) 1084 ? static_cast<double>(reinterpret_cast<Smi*>(this)->value())
1085 : reinterpret_cast<HeapNumber*>(this)->value(); 1085 : reinterpret_cast<HeapNumber*>(this)->value();
1086 } 1086 }
1087 1087
1088 1088
1089 bool Object::IsNaN() const { 1089 bool Object::IsNaN() const {
1090 return this->IsHeapNumber() && std::isnan(HeapNumber::cast(this)->value()); 1090 return this->IsHeapNumber() && std::isnan(HeapNumber::cast(this)->value());
1091 } 1091 }
1092 1092
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1126 Handle<Name> name) { 1126 Handle<Name> name) {
1127 LookupIterator it(object, name); 1127 LookupIterator it(object, name);
1128 return GetProperty(&it); 1128 return GetProperty(&it);
1129 } 1129 }
1130 1130
1131 1131
1132 MaybeHandle<Object> Object::GetElement(Isolate* isolate, 1132 MaybeHandle<Object> Object::GetElement(Isolate* isolate,
1133 Handle<Object> object, 1133 Handle<Object> object,
1134 uint32_t index) { 1134 uint32_t index) {
1135 // GetElement can trigger a getter which can cause allocation. 1135 // GetElement can trigger a getter which can cause allocation.
1136 // This was not always the case. This ASSERT is here to catch 1136 // This was not always the case. This DCHECK is here to catch
1137 // leftover incorrect uses. 1137 // leftover incorrect uses.
1138 ASSERT(AllowHeapAllocation::IsAllowed()); 1138 DCHECK(AllowHeapAllocation::IsAllowed());
1139 return Object::GetElementWithReceiver(isolate, object, object, index); 1139 return Object::GetElementWithReceiver(isolate, object, object, index);
1140 } 1140 }
1141 1141
1142 1142
1143 MaybeHandle<Object> Object::GetPropertyOrElement(Handle<Object> object, 1143 MaybeHandle<Object> Object::GetPropertyOrElement(Handle<Object> object,
1144 Handle<Name> name) { 1144 Handle<Name> name) {
1145 uint32_t index; 1145 uint32_t index;
1146 Isolate* isolate = name->GetIsolate(); 1146 Isolate* isolate = name->GetIsolate();
1147 if (name->AsArrayIndex(&index)) return GetElement(isolate, object, index); 1147 if (name->AsArrayIndex(&index)) return GetElement(isolate, object, index);
1148 return GetProperty(object, name); 1148 return GetProperty(object, name);
1149 } 1149 }
1150 1150
1151 1151
1152 MaybeHandle<Object> Object::GetProperty(Isolate* isolate, 1152 MaybeHandle<Object> Object::GetProperty(Isolate* isolate,
1153 Handle<Object> object, 1153 Handle<Object> object,
1154 const char* name) { 1154 const char* name) {
1155 Handle<String> str = isolate->factory()->InternalizeUtf8String(name); 1155 Handle<String> str = isolate->factory()->InternalizeUtf8String(name);
1156 ASSERT(!str.is_null()); 1156 DCHECK(!str.is_null());
1157 #ifdef DEBUG 1157 #ifdef DEBUG
1158 uint32_t index; // Assert that the name is not an array index. 1158 uint32_t index; // Assert that the name is not an array index.
1159 ASSERT(!str->AsArrayIndex(&index)); 1159 DCHECK(!str->AsArrayIndex(&index));
1160 #endif // DEBUG 1160 #endif // DEBUG
1161 return GetProperty(object, str); 1161 return GetProperty(object, str);
1162 } 1162 }
1163 1163
1164 1164
1165 MaybeHandle<Object> JSProxy::GetElementWithHandler(Handle<JSProxy> proxy, 1165 MaybeHandle<Object> JSProxy::GetElementWithHandler(Handle<JSProxy> proxy,
1166 Handle<Object> receiver, 1166 Handle<Object> receiver,
1167 uint32_t index) { 1167 uint32_t index) {
1168 return GetPropertyWithHandler( 1168 return GetPropertyWithHandler(
1169 proxy, receiver, proxy->GetIsolate()->factory()->Uint32ToString(index)); 1169 proxy, receiver, proxy->GetIsolate()->factory()->Uint32ToString(index));
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 return reinterpret_cast<Object**>(FIELD_ADDR(obj, byte_offset)); 1331 return reinterpret_cast<Object**>(FIELD_ADDR(obj, byte_offset));
1332 } 1332 }
1333 1333
1334 1334
1335 int Smi::value() const { 1335 int Smi::value() const {
1336 return Internals::SmiValue(this); 1336 return Internals::SmiValue(this);
1337 } 1337 }
1338 1338
1339 1339
1340 Smi* Smi::FromInt(int value) { 1340 Smi* Smi::FromInt(int value) {
1341 ASSERT(Smi::IsValid(value)); 1341 DCHECK(Smi::IsValid(value));
1342 return reinterpret_cast<Smi*>(Internals::IntToSmi(value)); 1342 return reinterpret_cast<Smi*>(Internals::IntToSmi(value));
1343 } 1343 }
1344 1344
1345 1345
1346 Smi* Smi::FromIntptr(intptr_t value) { 1346 Smi* Smi::FromIntptr(intptr_t value) {
1347 ASSERT(Smi::IsValid(value)); 1347 DCHECK(Smi::IsValid(value));
1348 int smi_shift_bits = kSmiTagSize + kSmiShiftSize; 1348 int smi_shift_bits = kSmiTagSize + kSmiShiftSize;
1349 return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag); 1349 return reinterpret_cast<Smi*>((value << smi_shift_bits) | kSmiTag);
1350 } 1350 }
1351 1351
1352 1352
1353 bool Smi::IsValid(intptr_t value) { 1353 bool Smi::IsValid(intptr_t value) {
1354 bool result = Internals::IsValidSmi(value); 1354 bool result = Internals::IsValidSmi(value);
1355 ASSERT_EQ(result, value >= kMinValue && value <= kMaxValue); 1355 DCHECK_EQ(result, value >= kMinValue && value <= kMaxValue);
1356 return result; 1356 return result;
1357 } 1357 }
1358 1358
1359 1359
1360 MapWord MapWord::FromMap(const Map* map) { 1360 MapWord MapWord::FromMap(const Map* map) {
1361 return MapWord(reinterpret_cast<uintptr_t>(map)); 1361 return MapWord(reinterpret_cast<uintptr_t>(map));
1362 } 1362 }
1363 1363
1364 1364
1365 Map* MapWord::ToMap() { 1365 Map* MapWord::ToMap() {
1366 return reinterpret_cast<Map*>(value_); 1366 return reinterpret_cast<Map*>(value_);
1367 } 1367 }
1368 1368
1369 1369
1370 bool MapWord::IsForwardingAddress() { 1370 bool MapWord::IsForwardingAddress() {
1371 return HAS_SMI_TAG(reinterpret_cast<Object*>(value_)); 1371 return HAS_SMI_TAG(reinterpret_cast<Object*>(value_));
1372 } 1372 }
1373 1373
1374 1374
1375 MapWord MapWord::FromForwardingAddress(HeapObject* object) { 1375 MapWord MapWord::FromForwardingAddress(HeapObject* object) {
1376 Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag; 1376 Address raw = reinterpret_cast<Address>(object) - kHeapObjectTag;
1377 return MapWord(reinterpret_cast<uintptr_t>(raw)); 1377 return MapWord(reinterpret_cast<uintptr_t>(raw));
1378 } 1378 }
1379 1379
1380 1380
1381 HeapObject* MapWord::ToForwardingAddress() { 1381 HeapObject* MapWord::ToForwardingAddress() {
1382 ASSERT(IsForwardingAddress()); 1382 DCHECK(IsForwardingAddress());
1383 return HeapObject::FromAddress(reinterpret_cast<Address>(value_)); 1383 return HeapObject::FromAddress(reinterpret_cast<Address>(value_));
1384 } 1384 }
1385 1385
1386 1386
1387 #ifdef VERIFY_HEAP 1387 #ifdef VERIFY_HEAP
1388 void HeapObject::VerifyObjectField(int offset) { 1388 void HeapObject::VerifyObjectField(int offset) {
1389 VerifyPointer(READ_FIELD(this, offset)); 1389 VerifyPointer(READ_FIELD(this, offset));
1390 } 1390 }
1391 1391
1392 void HeapObject::VerifySmiField(int offset) { 1392 void HeapObject::VerifySmiField(int offset) {
1393 CHECK(READ_FIELD(this, offset)->IsSmi()); 1393 CHECK(READ_FIELD(this, offset)->IsSmi());
1394 } 1394 }
1395 #endif 1395 #endif
1396 1396
1397 1397
1398 Heap* HeapObject::GetHeap() const { 1398 Heap* HeapObject::GetHeap() const {
1399 Heap* heap = 1399 Heap* heap =
1400 MemoryChunk::FromAddress(reinterpret_cast<const byte*>(this))->heap(); 1400 MemoryChunk::FromAddress(reinterpret_cast<const byte*>(this))->heap();
1401 SLOW_ASSERT(heap != NULL); 1401 SLOW_DCHECK(heap != NULL);
1402 return heap; 1402 return heap;
1403 } 1403 }
1404 1404
1405 1405
1406 Isolate* HeapObject::GetIsolate() const { 1406 Isolate* HeapObject::GetIsolate() const {
1407 return GetHeap()->isolate(); 1407 return GetHeap()->isolate();
1408 } 1408 }
1409 1409
1410 1410
1411 Map* HeapObject::map() const { 1411 Map* HeapObject::map() const {
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1474 } 1474 }
1475 1475
1476 1476
1477 void HeapObject::synchronized_set_map_word(MapWord map_word) { 1477 void HeapObject::synchronized_set_map_word(MapWord map_word) {
1478 RELEASE_WRITE_FIELD( 1478 RELEASE_WRITE_FIELD(
1479 this, kMapOffset, reinterpret_cast<Object*>(map_word.value_)); 1479 this, kMapOffset, reinterpret_cast<Object*>(map_word.value_));
1480 } 1480 }
1481 1481
1482 1482
1483 HeapObject* HeapObject::FromAddress(Address address) { 1483 HeapObject* HeapObject::FromAddress(Address address) {
1484 ASSERT_TAG_ALIGNED(address); 1484 DCHECK_TAG_ALIGNED(address);
1485 return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); 1485 return reinterpret_cast<HeapObject*>(address + kHeapObjectTag);
1486 } 1486 }
1487 1487
1488 1488
1489 Address HeapObject::address() { 1489 Address HeapObject::address() {
1490 return reinterpret_cast<Address>(this) - kHeapObjectTag; 1490 return reinterpret_cast<Address>(this) - kHeapObjectTag;
1491 } 1491 }
1492 1492
1493 1493
1494 int HeapObject::Size() { 1494 int HeapObject::Size() {
1495 return SizeFromMap(map()); 1495 return SizeFromMap(map());
1496 } 1496 }
1497 1497
1498 1498
1499 bool HeapObject::MayContainNewSpacePointers() { 1499 bool HeapObject::MayContainNewSpacePointers() {
1500 InstanceType type = map()->instance_type(); 1500 InstanceType type = map()->instance_type();
1501 if (type <= LAST_NAME_TYPE) { 1501 if (type <= LAST_NAME_TYPE) {
1502 if (type == SYMBOL_TYPE) { 1502 if (type == SYMBOL_TYPE) {
1503 return true; 1503 return true;
1504 } 1504 }
1505 ASSERT(type < FIRST_NONSTRING_TYPE); 1505 DCHECK(type < FIRST_NONSTRING_TYPE);
1506 // There are four string representations: sequential strings, external 1506 // There are four string representations: sequential strings, external
1507 // strings, cons strings, and sliced strings. 1507 // strings, cons strings, and sliced strings.
1508 // Only the latter two contain non-map-word pointers to heap objects. 1508 // Only the latter two contain non-map-word pointers to heap objects.
1509 return ((type & kIsIndirectStringMask) == kIsIndirectStringTag); 1509 return ((type & kIsIndirectStringMask) == kIsIndirectStringTag);
1510 } 1510 }
1511 // The ConstantPoolArray contains heap pointers, but not new space pointers. 1511 // The ConstantPoolArray contains heap pointers, but not new space pointers.
1512 if (type == CONSTANT_POOL_ARRAY_TYPE) return false; 1512 if (type == CONSTANT_POOL_ARRAY_TYPE) return false;
1513 return (type > LAST_DATA_TYPE); 1513 return (type > LAST_DATA_TYPE);
1514 } 1514 }
1515 1515
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1570 } 1570 }
1571 1571
1572 1572
1573 FixedArrayBase* JSObject::elements() const { 1573 FixedArrayBase* JSObject::elements() const {
1574 Object* array = READ_FIELD(this, kElementsOffset); 1574 Object* array = READ_FIELD(this, kElementsOffset);
1575 return static_cast<FixedArrayBase*>(array); 1575 return static_cast<FixedArrayBase*>(array);
1576 } 1576 }
1577 1577
1578 1578
1579 void JSObject::ValidateElements(Handle<JSObject> object) { 1579 void JSObject::ValidateElements(Handle<JSObject> object) {
1580 #ifdef ENABLE_SLOW_ASSERTS 1580 #ifdef ENABLE_SLOW_DCHECKS
1581 if (FLAG_enable_slow_asserts) { 1581 if (FLAG_enable_slow_asserts) {
1582 ElementsAccessor* accessor = object->GetElementsAccessor(); 1582 ElementsAccessor* accessor = object->GetElementsAccessor();
1583 accessor->Validate(object); 1583 accessor->Validate(object);
1584 } 1584 }
1585 #endif 1585 #endif
1586 } 1586 }
1587 1587
1588 1588
1589 void AllocationSite::Initialize() { 1589 void AllocationSite::Initialize() {
1590 set_transition_info(Smi::FromInt(0)); 1590 set_transition_info(Smi::FromInt(0));
1591 SetElementsKind(GetInitialFastElementsKind()); 1591 SetElementsKind(GetInitialFastElementsKind());
1592 set_nested_site(Smi::FromInt(0)); 1592 set_nested_site(Smi::FromInt(0));
1593 set_pretenure_data(Smi::FromInt(0)); 1593 set_pretenure_data(Smi::FromInt(0));
1594 set_pretenure_create_count(Smi::FromInt(0)); 1594 set_pretenure_create_count(Smi::FromInt(0));
1595 set_dependent_code(DependentCode::cast(GetHeap()->empty_fixed_array()), 1595 set_dependent_code(DependentCode::cast(GetHeap()->empty_fixed_array()),
1596 SKIP_WRITE_BARRIER); 1596 SKIP_WRITE_BARRIER);
1597 } 1597 }
1598 1598
1599 1599
1600 void AllocationSite::MarkZombie() { 1600 void AllocationSite::MarkZombie() {
1601 ASSERT(!IsZombie()); 1601 DCHECK(!IsZombie());
1602 Initialize(); 1602 Initialize();
1603 set_pretenure_decision(kZombie); 1603 set_pretenure_decision(kZombie);
1604 } 1604 }
1605 1605
1606 1606
1607 // Heuristic: We only need to create allocation site info if the boilerplate 1607 // Heuristic: We only need to create allocation site info if the boilerplate
1608 // elements kind is the initial elements kind. 1608 // elements kind is the initial elements kind.
1609 AllocationSiteMode AllocationSite::GetMode( 1609 AllocationSiteMode AllocationSite::GetMode(
1610 ElementsKind boilerplate_elements_kind) { 1610 ElementsKind boilerplate_elements_kind) {
1611 if (FLAG_pretenuring_call_new || 1611 if (FLAG_pretenuring_call_new ||
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1651 } 1651 }
1652 UNREACHABLE(); 1652 UNREACHABLE();
1653 return DependentCode::kAllocationSiteTransitionChangedGroup; 1653 return DependentCode::kAllocationSiteTransitionChangedGroup;
1654 } 1654 }
1655 1655
1656 1656
1657 inline void AllocationSite::set_memento_found_count(int count) { 1657 inline void AllocationSite::set_memento_found_count(int count) {
1658 int value = pretenure_data()->value(); 1658 int value = pretenure_data()->value();
1659 // Verify that we can count more mementos than we can possibly find in one 1659 // Verify that we can count more mementos than we can possibly find in one
1660 // new space collection. 1660 // new space collection.
1661 ASSERT((GetHeap()->MaxSemiSpaceSize() / 1661 DCHECK((GetHeap()->MaxSemiSpaceSize() /
1662 (StaticVisitorBase::kMinObjectSizeInWords * kPointerSize + 1662 (StaticVisitorBase::kMinObjectSizeInWords * kPointerSize +
1663 AllocationMemento::kSize)) < MementoFoundCountBits::kMax); 1663 AllocationMemento::kSize)) < MementoFoundCountBits::kMax);
1664 ASSERT(count < MementoFoundCountBits::kMax); 1664 DCHECK(count < MementoFoundCountBits::kMax);
1665 set_pretenure_data( 1665 set_pretenure_data(
1666 Smi::FromInt(MementoFoundCountBits::update(value, count)), 1666 Smi::FromInt(MementoFoundCountBits::update(value, count)),
1667 SKIP_WRITE_BARRIER); 1667 SKIP_WRITE_BARRIER);
1668 } 1668 }
1669 1669
1670 inline bool AllocationSite::IncrementMementoFoundCount() { 1670 inline bool AllocationSite::IncrementMementoFoundCount() {
1671 if (IsZombie()) return false; 1671 if (IsZombie()) return false;
1672 1672
1673 int value = memento_found_count(); 1673 int value = memento_found_count();
1674 set_memento_found_count(value + 1); 1674 set_memento_found_count(value + 1);
1675 return memento_found_count() == kPretenureMinimumCreated; 1675 return memento_found_count() == kPretenureMinimumCreated;
1676 } 1676 }
1677 1677
1678 1678
1679 inline void AllocationSite::IncrementMementoCreateCount() { 1679 inline void AllocationSite::IncrementMementoCreateCount() {
1680 ASSERT(FLAG_allocation_site_pretenuring); 1680 DCHECK(FLAG_allocation_site_pretenuring);
1681 int value = memento_create_count(); 1681 int value = memento_create_count();
1682 set_memento_create_count(value + 1); 1682 set_memento_create_count(value + 1);
1683 } 1683 }
1684 1684
1685 1685
1686 inline bool AllocationSite::MakePretenureDecision( 1686 inline bool AllocationSite::MakePretenureDecision(
1687 PretenureDecision current_decision, 1687 PretenureDecision current_decision,
1688 double ratio, 1688 double ratio,
1689 bool maximum_size_scavenge) { 1689 bool maximum_size_scavenge) {
1690 // Here we just allow state transitions from undecided or maybe tenure 1690 // Here we just allow state transitions from undecided or maybe tenure
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1754 1754
1755 1755
1756 void JSObject::EnsureCanContainElements(Handle<JSObject> object, 1756 void JSObject::EnsureCanContainElements(Handle<JSObject> object,
1757 Object** objects, 1757 Object** objects,
1758 uint32_t count, 1758 uint32_t count,
1759 EnsureElementsMode mode) { 1759 EnsureElementsMode mode) {
1760 ElementsKind current_kind = object->map()->elements_kind(); 1760 ElementsKind current_kind = object->map()->elements_kind();
1761 ElementsKind target_kind = current_kind; 1761 ElementsKind target_kind = current_kind;
1762 { 1762 {
1763 DisallowHeapAllocation no_allocation; 1763 DisallowHeapAllocation no_allocation;
1764 ASSERT(mode != ALLOW_COPIED_DOUBLE_ELEMENTS); 1764 DCHECK(mode != ALLOW_COPIED_DOUBLE_ELEMENTS);
1765 bool is_holey = IsFastHoleyElementsKind(current_kind); 1765 bool is_holey = IsFastHoleyElementsKind(current_kind);
1766 if (current_kind == FAST_HOLEY_ELEMENTS) return; 1766 if (current_kind == FAST_HOLEY_ELEMENTS) return;
1767 Heap* heap = object->GetHeap(); 1767 Heap* heap = object->GetHeap();
1768 Object* the_hole = heap->the_hole_value(); 1768 Object* the_hole = heap->the_hole_value();
1769 for (uint32_t i = 0; i < count; ++i) { 1769 for (uint32_t i = 0; i < count; ++i) {
1770 Object* current = *objects++; 1770 Object* current = *objects++;
1771 if (current == the_hole) { 1771 if (current == the_hole) {
1772 is_holey = true; 1772 is_holey = true;
1773 target_kind = GetHoleyElementsKind(target_kind); 1773 target_kind = GetHoleyElementsKind(target_kind);
1774 } else if (!current->IsSmi()) { 1774 } else if (!current->IsSmi()) {
(...skipping 19 matching lines...) Expand all
1794 } 1794 }
1795 } 1795 }
1796 1796
1797 1797
1798 void JSObject::EnsureCanContainElements(Handle<JSObject> object, 1798 void JSObject::EnsureCanContainElements(Handle<JSObject> object,
1799 Handle<FixedArrayBase> elements, 1799 Handle<FixedArrayBase> elements,
1800 uint32_t length, 1800 uint32_t length,
1801 EnsureElementsMode mode) { 1801 EnsureElementsMode mode) {
1802 Heap* heap = object->GetHeap(); 1802 Heap* heap = object->GetHeap();
1803 if (elements->map() != heap->fixed_double_array_map()) { 1803 if (elements->map() != heap->fixed_double_array_map()) {
1804 ASSERT(elements->map() == heap->fixed_array_map() || 1804 DCHECK(elements->map() == heap->fixed_array_map() ||
1805 elements->map() == heap->fixed_cow_array_map()); 1805 elements->map() == heap->fixed_cow_array_map());
1806 if (mode == ALLOW_COPIED_DOUBLE_ELEMENTS) { 1806 if (mode == ALLOW_COPIED_DOUBLE_ELEMENTS) {
1807 mode = DONT_ALLOW_DOUBLE_ELEMENTS; 1807 mode = DONT_ALLOW_DOUBLE_ELEMENTS;
1808 } 1808 }
1809 Object** objects = 1809 Object** objects =
1810 Handle<FixedArray>::cast(elements)->GetFirstElementAddress(); 1810 Handle<FixedArray>::cast(elements)->GetFirstElementAddress();
1811 EnsureCanContainElements(object, objects, length, mode); 1811 EnsureCanContainElements(object, objects, length, mode);
1812 return; 1812 return;
1813 } 1813 }
1814 1814
1815 ASSERT(mode == ALLOW_COPIED_DOUBLE_ELEMENTS); 1815 DCHECK(mode == ALLOW_COPIED_DOUBLE_ELEMENTS);
1816 if (object->GetElementsKind() == FAST_HOLEY_SMI_ELEMENTS) { 1816 if (object->GetElementsKind() == FAST_HOLEY_SMI_ELEMENTS) {
1817 TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS); 1817 TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS);
1818 } else if (object->GetElementsKind() == FAST_SMI_ELEMENTS) { 1818 } else if (object->GetElementsKind() == FAST_SMI_ELEMENTS) {
1819 Handle<FixedDoubleArray> double_array = 1819 Handle<FixedDoubleArray> double_array =
1820 Handle<FixedDoubleArray>::cast(elements); 1820 Handle<FixedDoubleArray>::cast(elements);
1821 for (uint32_t i = 0; i < length; ++i) { 1821 for (uint32_t i = 0; i < length; ++i) {
1822 if (double_array->is_the_hole(i)) { 1822 if (double_array->is_the_hole(i)) {
1823 TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS); 1823 TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS);
1824 return; 1824 return;
1825 } 1825 }
1826 } 1826 }
1827 TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS); 1827 TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS);
1828 } 1828 }
1829 } 1829 }
1830 1830
1831 1831
1832 void JSObject::SetMapAndElements(Handle<JSObject> object, 1832 void JSObject::SetMapAndElements(Handle<JSObject> object,
1833 Handle<Map> new_map, 1833 Handle<Map> new_map,
1834 Handle<FixedArrayBase> value) { 1834 Handle<FixedArrayBase> value) {
1835 JSObject::MigrateToMap(object, new_map); 1835 JSObject::MigrateToMap(object, new_map);
1836 ASSERT((object->map()->has_fast_smi_or_object_elements() || 1836 DCHECK((object->map()->has_fast_smi_or_object_elements() ||
1837 (*value == object->GetHeap()->empty_fixed_array())) == 1837 (*value == object->GetHeap()->empty_fixed_array())) ==
1838 (value->map() == object->GetHeap()->fixed_array_map() || 1838 (value->map() == object->GetHeap()->fixed_array_map() ||
1839 value->map() == object->GetHeap()->fixed_cow_array_map())); 1839 value->map() == object->GetHeap()->fixed_cow_array_map()));
1840 ASSERT((*value == object->GetHeap()->empty_fixed_array()) || 1840 DCHECK((*value == object->GetHeap()->empty_fixed_array()) ||
1841 (object->map()->has_fast_double_elements() == 1841 (object->map()->has_fast_double_elements() ==
1842 value->IsFixedDoubleArray())); 1842 value->IsFixedDoubleArray()));
1843 object->set_elements(*value); 1843 object->set_elements(*value);
1844 } 1844 }
1845 1845
1846 1846
1847 void JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) { 1847 void JSObject::set_elements(FixedArrayBase* value, WriteBarrierMode mode) {
1848 WRITE_FIELD(this, kElementsOffset, value); 1848 WRITE_FIELD(this, kElementsOffset, value);
1849 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode); 1849 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kElementsOffset, value, mode);
1850 } 1850 }
1851 1851
1852 1852
1853 void JSObject::initialize_properties() { 1853 void JSObject::initialize_properties() {
1854 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array())); 1854 DCHECK(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
1855 WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array()); 1855 WRITE_FIELD(this, kPropertiesOffset, GetHeap()->empty_fixed_array());
1856 } 1856 }
1857 1857
1858 1858
1859 void JSObject::initialize_elements() { 1859 void JSObject::initialize_elements() {
1860 FixedArrayBase* elements = map()->GetInitialElements(); 1860 FixedArrayBase* elements = map()->GetInitialElements();
1861 WRITE_FIELD(this, kElementsOffset, elements); 1861 WRITE_FIELD(this, kElementsOffset, elements);
1862 } 1862 }
1863 1863
1864 1864
1865 Handle<String> Map::ExpectedTransitionKey(Handle<Map> map) { 1865 Handle<String> Map::ExpectedTransitionKey(Handle<Map> map) {
1866 DisallowHeapAllocation no_gc; 1866 DisallowHeapAllocation no_gc;
1867 if (!map->HasTransitionArray()) return Handle<String>::null(); 1867 if (!map->HasTransitionArray()) return Handle<String>::null();
1868 TransitionArray* transitions = map->transitions(); 1868 TransitionArray* transitions = map->transitions();
1869 if (!transitions->IsSimpleTransition()) return Handle<String>::null(); 1869 if (!transitions->IsSimpleTransition()) return Handle<String>::null();
1870 int transition = TransitionArray::kSimpleTransitionIndex; 1870 int transition = TransitionArray::kSimpleTransitionIndex;
1871 PropertyDetails details = transitions->GetTargetDetails(transition); 1871 PropertyDetails details = transitions->GetTargetDetails(transition);
1872 Name* name = transitions->GetKey(transition); 1872 Name* name = transitions->GetKey(transition);
1873 if (details.type() != FIELD) return Handle<String>::null(); 1873 if (details.type() != FIELD) return Handle<String>::null();
1874 if (details.attributes() != NONE) return Handle<String>::null(); 1874 if (details.attributes() != NONE) return Handle<String>::null();
1875 if (!name->IsString()) return Handle<String>::null(); 1875 if (!name->IsString()) return Handle<String>::null();
1876 return Handle<String>(String::cast(name)); 1876 return Handle<String>(String::cast(name));
1877 } 1877 }
1878 1878
1879 1879
1880 Handle<Map> Map::ExpectedTransitionTarget(Handle<Map> map) { 1880 Handle<Map> Map::ExpectedTransitionTarget(Handle<Map> map) {
1881 ASSERT(!ExpectedTransitionKey(map).is_null()); 1881 DCHECK(!ExpectedTransitionKey(map).is_null());
1882 return Handle<Map>(map->transitions()->GetTarget( 1882 return Handle<Map>(map->transitions()->GetTarget(
1883 TransitionArray::kSimpleTransitionIndex)); 1883 TransitionArray::kSimpleTransitionIndex));
1884 } 1884 }
1885 1885
1886 1886
1887 Handle<Map> Map::FindTransitionToField(Handle<Map> map, Handle<Name> key) { 1887 Handle<Map> Map::FindTransitionToField(Handle<Map> map, Handle<Name> key) {
1888 DisallowHeapAllocation no_allocation; 1888 DisallowHeapAllocation no_allocation;
1889 if (!map->HasTransitionArray()) return Handle<Map>::null(); 1889 if (!map->HasTransitionArray()) return Handle<Map>::null();
1890 TransitionArray* transitions = map->transitions(); 1890 TransitionArray* transitions = map->transitions();
1891 int transition = transitions->Search(*key); 1891 int transition = transitions->Search(*key);
(...skipping 19 matching lines...) Expand all
1911 } 1911 }
1912 1912
1913 1913
1914 Object* Cell::value() const { 1914 Object* Cell::value() const {
1915 return READ_FIELD(this, kValueOffset); 1915 return READ_FIELD(this, kValueOffset);
1916 } 1916 }
1917 1917
1918 1918
1919 void Cell::set_value(Object* val, WriteBarrierMode ignored) { 1919 void Cell::set_value(Object* val, WriteBarrierMode ignored) {
1920 // The write barrier is not used for global property cells. 1920 // The write barrier is not used for global property cells.
1921 ASSERT(!val->IsPropertyCell() && !val->IsCell()); 1921 DCHECK(!val->IsPropertyCell() && !val->IsCell());
1922 WRITE_FIELD(this, kValueOffset, val); 1922 WRITE_FIELD(this, kValueOffset, val);
1923 } 1923 }
1924 1924
1925 ACCESSORS(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset) 1925 ACCESSORS(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset)
1926 1926
1927 Object* PropertyCell::type_raw() const { 1927 Object* PropertyCell::type_raw() const {
1928 return READ_FIELD(this, kTypeOffset); 1928 return READ_FIELD(this, kTypeOffset);
1929 } 1929 }
1930 1930
1931 1931
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1986 default: 1986 default:
1987 // TODO(jkummerow): Re-enable this. Blink currently hits this 1987 // TODO(jkummerow): Re-enable this. Blink currently hits this
1988 // from its CustomElementConstructorBuilder. 1988 // from its CustomElementConstructorBuilder.
1989 // UNREACHABLE(); 1989 // UNREACHABLE();
1990 return 0; 1990 return 0;
1991 } 1991 }
1992 } 1992 }
1993 1993
1994 1994
1995 int JSObject::GetInternalFieldCount() { 1995 int JSObject::GetInternalFieldCount() {
1996 ASSERT(1 << kPointerSizeLog2 == kPointerSize); 1996 DCHECK(1 << kPointerSizeLog2 == kPointerSize);
1997 // Make sure to adjust for the number of in-object properties. These 1997 // Make sure to adjust for the number of in-object properties. These
1998 // properties do contribute to the size, but are not internal fields. 1998 // properties do contribute to the size, but are not internal fields.
1999 return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) - 1999 return ((Size() - GetHeaderSize()) >> kPointerSizeLog2) -
2000 map()->inobject_properties(); 2000 map()->inobject_properties();
2001 } 2001 }
2002 2002
2003 2003
2004 int JSObject::GetInternalFieldOffset(int index) { 2004 int JSObject::GetInternalFieldOffset(int index) {
2005 ASSERT(index < GetInternalFieldCount() && index >= 0); 2005 DCHECK(index < GetInternalFieldCount() && index >= 0);
2006 return GetHeaderSize() + (kPointerSize * index); 2006 return GetHeaderSize() + (kPointerSize * index);
2007 } 2007 }
2008 2008
2009 2009
2010 Object* JSObject::GetInternalField(int index) { 2010 Object* JSObject::GetInternalField(int index) {
2011 ASSERT(index < GetInternalFieldCount() && index >= 0); 2011 DCHECK(index < GetInternalFieldCount() && index >= 0);
2012 // Internal objects do follow immediately after the header, whereas in-object 2012 // Internal objects do follow immediately after the header, whereas in-object
2013 // properties are at the end of the object. Therefore there is no need 2013 // properties are at the end of the object. Therefore there is no need
2014 // to adjust the index here. 2014 // to adjust the index here.
2015 return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index)); 2015 return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index));
2016 } 2016 }
2017 2017
2018 2018
2019 void JSObject::SetInternalField(int index, Object* value) { 2019 void JSObject::SetInternalField(int index, Object* value) {
2020 ASSERT(index < GetInternalFieldCount() && index >= 0); 2020 DCHECK(index < GetInternalFieldCount() && index >= 0);
2021 // Internal objects do follow immediately after the header, whereas in-object 2021 // Internal objects do follow immediately after the header, whereas in-object
2022 // properties are at the end of the object. Therefore there is no need 2022 // properties are at the end of the object. Therefore there is no need
2023 // to adjust the index here. 2023 // to adjust the index here.
2024 int offset = GetHeaderSize() + (kPointerSize * index); 2024 int offset = GetHeaderSize() + (kPointerSize * index);
2025 WRITE_FIELD(this, offset, value); 2025 WRITE_FIELD(this, offset, value);
2026 WRITE_BARRIER(GetHeap(), this, offset, value); 2026 WRITE_BARRIER(GetHeap(), this, offset, value);
2027 } 2027 }
2028 2028
2029 2029
2030 void JSObject::SetInternalField(int index, Smi* value) { 2030 void JSObject::SetInternalField(int index, Smi* value) {
2031 ASSERT(index < GetInternalFieldCount() && index >= 0); 2031 DCHECK(index < GetInternalFieldCount() && index >= 0);
2032 // Internal objects do follow immediately after the header, whereas in-object 2032 // Internal objects do follow immediately after the header, whereas in-object
2033 // properties are at the end of the object. Therefore there is no need 2033 // properties are at the end of the object. Therefore there is no need
2034 // to adjust the index here. 2034 // to adjust the index here.
2035 int offset = GetHeaderSize() + (kPointerSize * index); 2035 int offset = GetHeaderSize() + (kPointerSize * index);
2036 WRITE_FIELD(this, offset, value); 2036 WRITE_FIELD(this, offset, value);
2037 } 2037 }
2038 2038
2039 2039
2040 // Access fast-case object properties at index. The use of these routines 2040 // Access fast-case object properties at index. The use of these routines
2041 // is needed to correctly distinguish between properties stored in-object and 2041 // is needed to correctly distinguish between properties stored in-object and
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2079 WRITE_FIELD(this, offset, value); 2079 WRITE_FIELD(this, offset, value);
2080 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); 2080 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
2081 return value; 2081 return value;
2082 } 2082 }
2083 2083
2084 2084
2085 2085
2086 void JSObject::InitializeBody(Map* map, 2086 void JSObject::InitializeBody(Map* map,
2087 Object* pre_allocated_value, 2087 Object* pre_allocated_value,
2088 Object* filler_value) { 2088 Object* filler_value) {
2089 ASSERT(!filler_value->IsHeapObject() || 2089 DCHECK(!filler_value->IsHeapObject() ||
2090 !GetHeap()->InNewSpace(filler_value)); 2090 !GetHeap()->InNewSpace(filler_value));
2091 ASSERT(!pre_allocated_value->IsHeapObject() || 2091 DCHECK(!pre_allocated_value->IsHeapObject() ||
2092 !GetHeap()->InNewSpace(pre_allocated_value)); 2092 !GetHeap()->InNewSpace(pre_allocated_value));
2093 int size = map->instance_size(); 2093 int size = map->instance_size();
2094 int offset = kHeaderSize; 2094 int offset = kHeaderSize;
2095 if (filler_value != pre_allocated_value) { 2095 if (filler_value != pre_allocated_value) {
2096 int pre_allocated = map->pre_allocated_property_fields(); 2096 int pre_allocated = map->pre_allocated_property_fields();
2097 ASSERT(pre_allocated * kPointerSize + kHeaderSize <= size); 2097 DCHECK(pre_allocated * kPointerSize + kHeaderSize <= size);
2098 for (int i = 0; i < pre_allocated; i++) { 2098 for (int i = 0; i < pre_allocated; i++) {
2099 WRITE_FIELD(this, offset, pre_allocated_value); 2099 WRITE_FIELD(this, offset, pre_allocated_value);
2100 offset += kPointerSize; 2100 offset += kPointerSize;
2101 } 2101 }
2102 } 2102 }
2103 while (offset < size) { 2103 while (offset < size) {
2104 WRITE_FIELD(this, offset, filler_value); 2104 WRITE_FIELD(this, offset, filler_value);
2105 offset += kPointerSize; 2105 offset += kPointerSize;
2106 } 2106 }
2107 } 2107 }
2108 2108
2109 2109
2110 bool JSObject::HasFastProperties() { 2110 bool JSObject::HasFastProperties() {
2111 ASSERT(properties()->IsDictionary() == map()->is_dictionary_map()); 2111 DCHECK(properties()->IsDictionary() == map()->is_dictionary_map());
2112 return !properties()->IsDictionary(); 2112 return !properties()->IsDictionary();
2113 } 2113 }
2114 2114
2115 2115
2116 bool Map::TooManyFastProperties(StoreFromKeyed store_mode) { 2116 bool Map::TooManyFastProperties(StoreFromKeyed store_mode) {
2117 if (unused_property_fields() != 0) return false; 2117 if (unused_property_fields() != 0) return false;
2118 int minimum = store_mode == CERTAINLY_NOT_STORE_FROM_KEYED ? 128 : 12; 2118 int minimum = store_mode == CERTAINLY_NOT_STORE_FROM_KEYED ? 128 : 12;
2119 int limit = Max(minimum, inobject_properties()); 2119 int limit = Max(minimum, inobject_properties());
2120 int external = NumberOfFields() - inobject_properties(); 2120 int external = NumberOfFields() - inobject_properties();
2121 return external > limit; 2121 return external > limit;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2173 IsTrue() || 2173 IsTrue() ||
2174 IsFalse() || 2174 IsFalse() ||
2175 IsNull())) { 2175 IsNull())) {
2176 FATAL("API call returned invalid object"); 2176 FATAL("API call returned invalid object");
2177 } 2177 }
2178 #endif // ENABLE_EXTRA_CHECKS 2178 #endif // ENABLE_EXTRA_CHECKS
2179 } 2179 }
2180 2180
2181 2181
2182 Object* FixedArray::get(int index) { 2182 Object* FixedArray::get(int index) {
2183 SLOW_ASSERT(index >= 0 && index < this->length()); 2183 SLOW_DCHECK(index >= 0 && index < this->length());
2184 return READ_FIELD(this, kHeaderSize + index * kPointerSize); 2184 return READ_FIELD(this, kHeaderSize + index * kPointerSize);
2185 } 2185 }
2186 2186
2187 2187
2188 Handle<Object> FixedArray::get(Handle<FixedArray> array, int index) { 2188 Handle<Object> FixedArray::get(Handle<FixedArray> array, int index) {
2189 return handle(array->get(index), array->GetIsolate()); 2189 return handle(array->get(index), array->GetIsolate());
2190 } 2190 }
2191 2191
2192 2192
2193 bool FixedArray::is_the_hole(int index) { 2193 bool FixedArray::is_the_hole(int index) {
2194 return get(index) == GetHeap()->the_hole_value(); 2194 return get(index) == GetHeap()->the_hole_value();
2195 } 2195 }
2196 2196
2197 2197
2198 void FixedArray::set(int index, Smi* value) { 2198 void FixedArray::set(int index, Smi* value) {
2199 ASSERT(map() != GetHeap()->fixed_cow_array_map()); 2199 DCHECK(map() != GetHeap()->fixed_cow_array_map());
2200 ASSERT(index >= 0 && index < this->length()); 2200 DCHECK(index >= 0 && index < this->length());
2201 ASSERT(reinterpret_cast<Object*>(value)->IsSmi()); 2201 DCHECK(reinterpret_cast<Object*>(value)->IsSmi());
2202 int offset = kHeaderSize + index * kPointerSize; 2202 int offset = kHeaderSize + index * kPointerSize;
2203 WRITE_FIELD(this, offset, value); 2203 WRITE_FIELD(this, offset, value);
2204 } 2204 }
2205 2205
2206 2206
2207 void FixedArray::set(int index, Object* value) { 2207 void FixedArray::set(int index, Object* value) {
2208 ASSERT(map() != GetHeap()->fixed_cow_array_map()); 2208 DCHECK(map() != GetHeap()->fixed_cow_array_map());
2209 ASSERT(index >= 0 && index < this->length()); 2209 DCHECK(index >= 0 && index < this->length());
2210 int offset = kHeaderSize + index * kPointerSize; 2210 int offset = kHeaderSize + index * kPointerSize;
2211 WRITE_FIELD(this, offset, value); 2211 WRITE_FIELD(this, offset, value);
2212 WRITE_BARRIER(GetHeap(), this, offset, value); 2212 WRITE_BARRIER(GetHeap(), this, offset, value);
2213 } 2213 }
2214 2214
2215 2215
2216 inline bool FixedDoubleArray::is_the_hole_nan(double value) { 2216 inline bool FixedDoubleArray::is_the_hole_nan(double value) {
2217 return BitCast<uint64_t, double>(value) == kHoleNanInt64; 2217 return BitCast<uint64_t, double>(value) == kHoleNanInt64;
2218 } 2218 }
2219 2219
2220 2220
2221 inline double FixedDoubleArray::hole_nan_as_double() { 2221 inline double FixedDoubleArray::hole_nan_as_double() {
2222 return BitCast<double, uint64_t>(kHoleNanInt64); 2222 return BitCast<double, uint64_t>(kHoleNanInt64);
2223 } 2223 }
2224 2224
2225 2225
2226 inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() { 2226 inline double FixedDoubleArray::canonical_not_the_hole_nan_as_double() {
2227 ASSERT(BitCast<uint64_t>(base::OS::nan_value()) != kHoleNanInt64); 2227 DCHECK(BitCast<uint64_t>(base::OS::nan_value()) != kHoleNanInt64);
2228 ASSERT((BitCast<uint64_t>(base::OS::nan_value()) >> 32) != kHoleNanUpper32); 2228 DCHECK((BitCast<uint64_t>(base::OS::nan_value()) >> 32) != kHoleNanUpper32);
2229 return base::OS::nan_value(); 2229 return base::OS::nan_value();
2230 } 2230 }
2231 2231
2232 2232
2233 double FixedDoubleArray::get_scalar(int index) { 2233 double FixedDoubleArray::get_scalar(int index) {
2234 ASSERT(map() != GetHeap()->fixed_cow_array_map() && 2234 DCHECK(map() != GetHeap()->fixed_cow_array_map() &&
2235 map() != GetHeap()->fixed_array_map()); 2235 map() != GetHeap()->fixed_array_map());
2236 ASSERT(index >= 0 && index < this->length()); 2236 DCHECK(index >= 0 && index < this->length());
2237 double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize); 2237 double result = READ_DOUBLE_FIELD(this, kHeaderSize + index * kDoubleSize);
2238 ASSERT(!is_the_hole_nan(result)); 2238 DCHECK(!is_the_hole_nan(result));
2239 return result; 2239 return result;
2240 } 2240 }
2241 2241
2242 int64_t FixedDoubleArray::get_representation(int index) { 2242 int64_t FixedDoubleArray::get_representation(int index) {
2243 ASSERT(map() != GetHeap()->fixed_cow_array_map() && 2243 DCHECK(map() != GetHeap()->fixed_cow_array_map() &&
2244 map() != GetHeap()->fixed_array_map()); 2244 map() != GetHeap()->fixed_array_map());
2245 ASSERT(index >= 0 && index < this->length()); 2245 DCHECK(index >= 0 && index < this->length());
2246 return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize); 2246 return READ_INT64_FIELD(this, kHeaderSize + index * kDoubleSize);
2247 } 2247 }
2248 2248
2249 2249
2250 Handle<Object> FixedDoubleArray::get(Handle<FixedDoubleArray> array, 2250 Handle<Object> FixedDoubleArray::get(Handle<FixedDoubleArray> array,
2251 int index) { 2251 int index) {
2252 if (array->is_the_hole(index)) { 2252 if (array->is_the_hole(index)) {
2253 return array->GetIsolate()->factory()->the_hole_value(); 2253 return array->GetIsolate()->factory()->the_hole_value();
2254 } else { 2254 } else {
2255 return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index)); 2255 return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index));
2256 } 2256 }
2257 } 2257 }
2258 2258
2259 2259
2260 void FixedDoubleArray::set(int index, double value) { 2260 void FixedDoubleArray::set(int index, double value) {
2261 ASSERT(map() != GetHeap()->fixed_cow_array_map() && 2261 DCHECK(map() != GetHeap()->fixed_cow_array_map() &&
2262 map() != GetHeap()->fixed_array_map()); 2262 map() != GetHeap()->fixed_array_map());
2263 int offset = kHeaderSize + index * kDoubleSize; 2263 int offset = kHeaderSize + index * kDoubleSize;
2264 if (std::isnan(value)) value = canonical_not_the_hole_nan_as_double(); 2264 if (std::isnan(value)) value = canonical_not_the_hole_nan_as_double();
2265 WRITE_DOUBLE_FIELD(this, offset, value); 2265 WRITE_DOUBLE_FIELD(this, offset, value);
2266 } 2266 }
2267 2267
2268 2268
2269 void FixedDoubleArray::set_the_hole(int index) { 2269 void FixedDoubleArray::set_the_hole(int index) {
2270 ASSERT(map() != GetHeap()->fixed_cow_array_map() && 2270 DCHECK(map() != GetHeap()->fixed_cow_array_map() &&
2271 map() != GetHeap()->fixed_array_map()); 2271 map() != GetHeap()->fixed_array_map());
2272 int offset = kHeaderSize + index * kDoubleSize; 2272 int offset = kHeaderSize + index * kDoubleSize;
2273 WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double()); 2273 WRITE_DOUBLE_FIELD(this, offset, hole_nan_as_double());
2274 } 2274 }
2275 2275
2276 2276
2277 bool FixedDoubleArray::is_the_hole(int index) { 2277 bool FixedDoubleArray::is_the_hole(int index) {
2278 int offset = kHeaderSize + index * kDoubleSize; 2278 int offset = kHeaderSize + index * kDoubleSize;
2279 return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset)); 2279 return is_the_hole_nan(READ_DOUBLE_FIELD(this, offset));
2280 } 2280 }
2281 2281
2282 2282
2283 double* FixedDoubleArray::data_start() { 2283 double* FixedDoubleArray::data_start() {
2284 return reinterpret_cast<double*>(FIELD_ADDR(this, kHeaderSize)); 2284 return reinterpret_cast<double*>(FIELD_ADDR(this, kHeaderSize));
2285 } 2285 }
2286 2286
2287 2287
2288 void FixedDoubleArray::FillWithHoles(int from, int to) { 2288 void FixedDoubleArray::FillWithHoles(int from, int to) {
2289 for (int i = from; i < to; i++) { 2289 for (int i = from; i < to; i++) {
2290 set_the_hole(i); 2290 set_the_hole(i);
2291 } 2291 }
2292 } 2292 }
2293 2293
2294 2294
2295 void ConstantPoolArray::NumberOfEntries::increment(Type type) { 2295 void ConstantPoolArray::NumberOfEntries::increment(Type type) {
2296 ASSERT(type < NUMBER_OF_TYPES); 2296 DCHECK(type < NUMBER_OF_TYPES);
2297 element_counts_[type]++; 2297 element_counts_[type]++;
2298 } 2298 }
2299 2299
2300 2300
2301 int ConstantPoolArray::NumberOfEntries::equals( 2301 int ConstantPoolArray::NumberOfEntries::equals(
2302 const ConstantPoolArray::NumberOfEntries& other) const { 2302 const ConstantPoolArray::NumberOfEntries& other) const {
2303 for (int i = 0; i < NUMBER_OF_TYPES; i++) { 2303 for (int i = 0; i < NUMBER_OF_TYPES; i++) {
2304 if (element_counts_[i] != other.element_counts_[i]) return false; 2304 if (element_counts_[i] != other.element_counts_[i]) return false;
2305 } 2305 }
2306 return true; 2306 return true;
2307 } 2307 }
2308 2308
2309 2309
2310 bool ConstantPoolArray::NumberOfEntries::is_empty() const { 2310 bool ConstantPoolArray::NumberOfEntries::is_empty() const {
2311 return total_count() == 0; 2311 return total_count() == 0;
2312 } 2312 }
2313 2313
2314 2314
2315 int ConstantPoolArray::NumberOfEntries::count_of(Type type) const { 2315 int ConstantPoolArray::NumberOfEntries::count_of(Type type) const {
2316 ASSERT(type < NUMBER_OF_TYPES); 2316 DCHECK(type < NUMBER_OF_TYPES);
2317 return element_counts_[type]; 2317 return element_counts_[type];
2318 } 2318 }
2319 2319
2320 2320
2321 int ConstantPoolArray::NumberOfEntries::base_of(Type type) const { 2321 int ConstantPoolArray::NumberOfEntries::base_of(Type type) const {
2322 int base = 0; 2322 int base = 0;
2323 ASSERT(type < NUMBER_OF_TYPES); 2323 DCHECK(type < NUMBER_OF_TYPES);
2324 for (int i = 0; i < type; i++) { 2324 for (int i = 0; i < type; i++) {
2325 base += element_counts_[i]; 2325 base += element_counts_[i];
2326 } 2326 }
2327 return base; 2327 return base;
2328 } 2328 }
2329 2329
2330 2330
2331 int ConstantPoolArray::NumberOfEntries::total_count() const { 2331 int ConstantPoolArray::NumberOfEntries::total_count() const {
2332 int count = 0; 2332 int count = 0;
2333 for (int i = 0; i < NUMBER_OF_TYPES; i++) { 2333 for (int i = 0; i < NUMBER_OF_TYPES; i++) {
2334 count += element_counts_[i]; 2334 count += element_counts_[i];
2335 } 2335 }
2336 return count; 2336 return count;
2337 } 2337 }
2338 2338
2339 2339
2340 int ConstantPoolArray::NumberOfEntries::are_in_range(int min, int max) const { 2340 int ConstantPoolArray::NumberOfEntries::are_in_range(int min, int max) const {
2341 for (int i = FIRST_TYPE; i < NUMBER_OF_TYPES; i++) { 2341 for (int i = FIRST_TYPE; i < NUMBER_OF_TYPES; i++) {
2342 if (element_counts_[i] < min || element_counts_[i] > max) { 2342 if (element_counts_[i] < min || element_counts_[i] > max) {
2343 return false; 2343 return false;
2344 } 2344 }
2345 } 2345 }
2346 return true; 2346 return true;
2347 } 2347 }
2348 2348
2349 2349
2350 int ConstantPoolArray::Iterator::next_index() { 2350 int ConstantPoolArray::Iterator::next_index() {
2351 ASSERT(!is_finished()); 2351 DCHECK(!is_finished());
2352 int ret = next_index_++; 2352 int ret = next_index_++;
2353 update_section(); 2353 update_section();
2354 return ret; 2354 return ret;
2355 } 2355 }
2356 2356
2357 2357
2358 bool ConstantPoolArray::Iterator::is_finished() { 2358 bool ConstantPoolArray::Iterator::is_finished() {
2359 return next_index_ > array_->last_index(type_, final_section_); 2359 return next_index_ > array_->last_index(type_, final_section_);
2360 } 2360 }
2361 2361
2362 2362
2363 void ConstantPoolArray::Iterator::update_section() { 2363 void ConstantPoolArray::Iterator::update_section() {
2364 if (next_index_ > array_->last_index(type_, current_section_) && 2364 if (next_index_ > array_->last_index(type_, current_section_) &&
2365 current_section_ != final_section_) { 2365 current_section_ != final_section_) {
2366 ASSERT(final_section_ == EXTENDED_SECTION); 2366 DCHECK(final_section_ == EXTENDED_SECTION);
2367 current_section_ = EXTENDED_SECTION; 2367 current_section_ = EXTENDED_SECTION;
2368 next_index_ = array_->first_index(type_, EXTENDED_SECTION); 2368 next_index_ = array_->first_index(type_, EXTENDED_SECTION);
2369 } 2369 }
2370 } 2370 }
2371 2371
2372 2372
2373 bool ConstantPoolArray::is_extended_layout() { 2373 bool ConstantPoolArray::is_extended_layout() {
2374 uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset); 2374 uint32_t small_layout_1 = READ_UINT32_FIELD(this, kSmallLayout1Offset);
2375 return IsExtendedField::decode(small_layout_1); 2375 return IsExtendedField::decode(small_layout_1);
2376 } 2376 }
2377 2377
2378 2378
2379 ConstantPoolArray::LayoutSection ConstantPoolArray::final_section() { 2379 ConstantPoolArray::LayoutSection ConstantPoolArray::final_section() {
2380 return is_extended_layout() ? EXTENDED_SECTION : SMALL_SECTION; 2380 return is_extended_layout() ? EXTENDED_SECTION : SMALL_SECTION;
2381 } 2381 }
2382 2382
2383 2383
2384 int ConstantPoolArray::first_extended_section_index() { 2384 int ConstantPoolArray::first_extended_section_index() {
2385 ASSERT(is_extended_layout()); 2385 DCHECK(is_extended_layout());
2386 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset); 2386 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2387 return TotalCountField::decode(small_layout_2); 2387 return TotalCountField::decode(small_layout_2);
2388 } 2388 }
2389 2389
2390 2390
2391 int ConstantPoolArray::get_extended_section_header_offset() { 2391 int ConstantPoolArray::get_extended_section_header_offset() {
2392 return RoundUp(SizeFor(NumberOfEntries(this, SMALL_SECTION)), kInt64Size); 2392 return RoundUp(SizeFor(NumberOfEntries(this, SMALL_SECTION)), kInt64Size);
2393 } 2393 }
2394 2394
2395 2395
2396 ConstantPoolArray::WeakObjectState ConstantPoolArray::get_weak_object_state() { 2396 ConstantPoolArray::WeakObjectState ConstantPoolArray::get_weak_object_state() {
2397 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset); 2397 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2398 return WeakObjectStateField::decode(small_layout_2); 2398 return WeakObjectStateField::decode(small_layout_2);
2399 } 2399 }
2400 2400
2401 2401
2402 void ConstantPoolArray::set_weak_object_state( 2402 void ConstantPoolArray::set_weak_object_state(
2403 ConstantPoolArray::WeakObjectState state) { 2403 ConstantPoolArray::WeakObjectState state) {
2404 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset); 2404 uint32_t small_layout_2 = READ_UINT32_FIELD(this, kSmallLayout2Offset);
2405 small_layout_2 = WeakObjectStateField::update(small_layout_2, state); 2405 small_layout_2 = WeakObjectStateField::update(small_layout_2, state);
2406 WRITE_INT32_FIELD(this, kSmallLayout2Offset, small_layout_2); 2406 WRITE_INT32_FIELD(this, kSmallLayout2Offset, small_layout_2);
2407 } 2407 }
2408 2408
2409 2409
2410 int ConstantPoolArray::first_index(Type type, LayoutSection section) { 2410 int ConstantPoolArray::first_index(Type type, LayoutSection section) {
2411 int index = 0; 2411 int index = 0;
2412 if (section == EXTENDED_SECTION) { 2412 if (section == EXTENDED_SECTION) {
2413 ASSERT(is_extended_layout()); 2413 DCHECK(is_extended_layout());
2414 index += first_extended_section_index(); 2414 index += first_extended_section_index();
2415 } 2415 }
2416 2416
2417 for (Type type_iter = FIRST_TYPE; type_iter < type; 2417 for (Type type_iter = FIRST_TYPE; type_iter < type;
2418 type_iter = next_type(type_iter)) { 2418 type_iter = next_type(type_iter)) {
2419 index += number_of_entries(type_iter, section); 2419 index += number_of_entries(type_iter, section);
2420 } 2420 }
2421 2421
2422 return index; 2422 return index;
2423 } 2423 }
(...skipping 15 matching lines...) Expand all
2439 return CodePtrCountField::decode(small_layout_1); 2439 return CodePtrCountField::decode(small_layout_1);
2440 case HEAP_PTR: 2440 case HEAP_PTR:
2441 return HeapPtrCountField::decode(small_layout_1); 2441 return HeapPtrCountField::decode(small_layout_1);
2442 case INT32: 2442 case INT32:
2443 return Int32CountField::decode(small_layout_2); 2443 return Int32CountField::decode(small_layout_2);
2444 default: 2444 default:
2445 UNREACHABLE(); 2445 UNREACHABLE();
2446 return 0; 2446 return 0;
2447 } 2447 }
2448 } else { 2448 } else {
2449 ASSERT(section == EXTENDED_SECTION && is_extended_layout()); 2449 DCHECK(section == EXTENDED_SECTION && is_extended_layout());
2450 int offset = get_extended_section_header_offset(); 2450 int offset = get_extended_section_header_offset();
2451 switch (type) { 2451 switch (type) {
2452 case INT64: 2452 case INT64:
2453 offset += kExtendedInt64CountOffset; 2453 offset += kExtendedInt64CountOffset;
2454 break; 2454 break;
2455 case CODE_PTR: 2455 case CODE_PTR:
2456 offset += kExtendedCodePtrCountOffset; 2456 offset += kExtendedCodePtrCountOffset;
2457 break; 2457 break;
2458 case HEAP_PTR: 2458 case HEAP_PTR:
2459 offset += kExtendedHeapPtrCountOffset; 2459 offset += kExtendedHeapPtrCountOffset;
(...skipping 23 matching lines...) Expand all
2483 if (is_extended_layout() && index >= first_extended_section_index()) { 2483 if (is_extended_layout() && index >= first_extended_section_index()) {
2484 section = EXTENDED_SECTION; 2484 section = EXTENDED_SECTION;
2485 } else { 2485 } else {
2486 section = SMALL_SECTION; 2486 section = SMALL_SECTION;
2487 } 2487 }
2488 2488
2489 Type type = FIRST_TYPE; 2489 Type type = FIRST_TYPE;
2490 while (index > last_index(type, section)) { 2490 while (index > last_index(type, section)) {
2491 type = next_type(type); 2491 type = next_type(type);
2492 } 2492 }
2493 ASSERT(type <= LAST_TYPE); 2493 DCHECK(type <= LAST_TYPE);
2494 return type; 2494 return type;
2495 } 2495 }
2496 2496
2497 2497
2498 int64_t ConstantPoolArray::get_int64_entry(int index) { 2498 int64_t ConstantPoolArray::get_int64_entry(int index) {
2499 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2499 DCHECK(map() == GetHeap()->constant_pool_array_map());
2500 ASSERT(get_type(index) == INT64); 2500 DCHECK(get_type(index) == INT64);
2501 return READ_INT64_FIELD(this, OffsetOfElementAt(index)); 2501 return READ_INT64_FIELD(this, OffsetOfElementAt(index));
2502 } 2502 }
2503 2503
2504 2504
2505 double ConstantPoolArray::get_int64_entry_as_double(int index) { 2505 double ConstantPoolArray::get_int64_entry_as_double(int index) {
2506 STATIC_ASSERT(kDoubleSize == kInt64Size); 2506 STATIC_ASSERT(kDoubleSize == kInt64Size);
2507 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2507 DCHECK(map() == GetHeap()->constant_pool_array_map());
2508 ASSERT(get_type(index) == INT64); 2508 DCHECK(get_type(index) == INT64);
2509 return READ_DOUBLE_FIELD(this, OffsetOfElementAt(index)); 2509 return READ_DOUBLE_FIELD(this, OffsetOfElementAt(index));
2510 } 2510 }
2511 2511
2512 2512
2513 Address ConstantPoolArray::get_code_ptr_entry(int index) { 2513 Address ConstantPoolArray::get_code_ptr_entry(int index) {
2514 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2514 DCHECK(map() == GetHeap()->constant_pool_array_map());
2515 ASSERT(get_type(index) == CODE_PTR); 2515 DCHECK(get_type(index) == CODE_PTR);
2516 return reinterpret_cast<Address>(READ_FIELD(this, OffsetOfElementAt(index))); 2516 return reinterpret_cast<Address>(READ_FIELD(this, OffsetOfElementAt(index)));
2517 } 2517 }
2518 2518
2519 2519
2520 Object* ConstantPoolArray::get_heap_ptr_entry(int index) { 2520 Object* ConstantPoolArray::get_heap_ptr_entry(int index) {
2521 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2521 DCHECK(map() == GetHeap()->constant_pool_array_map());
2522 ASSERT(get_type(index) == HEAP_PTR); 2522 DCHECK(get_type(index) == HEAP_PTR);
2523 return READ_FIELD(this, OffsetOfElementAt(index)); 2523 return READ_FIELD(this, OffsetOfElementAt(index));
2524 } 2524 }
2525 2525
2526 2526
2527 int32_t ConstantPoolArray::get_int32_entry(int index) { 2527 int32_t ConstantPoolArray::get_int32_entry(int index) {
2528 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2528 DCHECK(map() == GetHeap()->constant_pool_array_map());
2529 ASSERT(get_type(index) == INT32); 2529 DCHECK(get_type(index) == INT32);
2530 return READ_INT32_FIELD(this, OffsetOfElementAt(index)); 2530 return READ_INT32_FIELD(this, OffsetOfElementAt(index));
2531 } 2531 }
2532 2532
2533 2533
2534 void ConstantPoolArray::set(int index, int64_t value) { 2534 void ConstantPoolArray::set(int index, int64_t value) {
2535 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2535 DCHECK(map() == GetHeap()->constant_pool_array_map());
2536 ASSERT(get_type(index) == INT64); 2536 DCHECK(get_type(index) == INT64);
2537 WRITE_INT64_FIELD(this, OffsetOfElementAt(index), value); 2537 WRITE_INT64_FIELD(this, OffsetOfElementAt(index), value);
2538 } 2538 }
2539 2539
2540 2540
2541 void ConstantPoolArray::set(int index, double value) { 2541 void ConstantPoolArray::set(int index, double value) {
2542 STATIC_ASSERT(kDoubleSize == kInt64Size); 2542 STATIC_ASSERT(kDoubleSize == kInt64Size);
2543 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2543 DCHECK(map() == GetHeap()->constant_pool_array_map());
2544 ASSERT(get_type(index) == INT64); 2544 DCHECK(get_type(index) == INT64);
2545 WRITE_DOUBLE_FIELD(this, OffsetOfElementAt(index), value); 2545 WRITE_DOUBLE_FIELD(this, OffsetOfElementAt(index), value);
2546 } 2546 }
2547 2547
2548 2548
2549 void ConstantPoolArray::set(int index, Address value) { 2549 void ConstantPoolArray::set(int index, Address value) {
2550 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2550 DCHECK(map() == GetHeap()->constant_pool_array_map());
2551 ASSERT(get_type(index) == CODE_PTR); 2551 DCHECK(get_type(index) == CODE_PTR);
2552 WRITE_FIELD(this, OffsetOfElementAt(index), reinterpret_cast<Object*>(value)); 2552 WRITE_FIELD(this, OffsetOfElementAt(index), reinterpret_cast<Object*>(value));
2553 } 2553 }
2554 2554
2555 2555
2556 void ConstantPoolArray::set(int index, Object* value) { 2556 void ConstantPoolArray::set(int index, Object* value) {
2557 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2557 DCHECK(map() == GetHeap()->constant_pool_array_map());
2558 ASSERT(!GetHeap()->InNewSpace(value)); 2558 DCHECK(!GetHeap()->InNewSpace(value));
2559 ASSERT(get_type(index) == HEAP_PTR); 2559 DCHECK(get_type(index) == HEAP_PTR);
2560 WRITE_FIELD(this, OffsetOfElementAt(index), value); 2560 WRITE_FIELD(this, OffsetOfElementAt(index), value);
2561 WRITE_BARRIER(GetHeap(), this, OffsetOfElementAt(index), value); 2561 WRITE_BARRIER(GetHeap(), this, OffsetOfElementAt(index), value);
2562 } 2562 }
2563 2563
2564 2564
2565 void ConstantPoolArray::set(int index, int32_t value) { 2565 void ConstantPoolArray::set(int index, int32_t value) {
2566 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2566 DCHECK(map() == GetHeap()->constant_pool_array_map());
2567 ASSERT(get_type(index) == INT32); 2567 DCHECK(get_type(index) == INT32);
2568 WRITE_INT32_FIELD(this, OffsetOfElementAt(index), value); 2568 WRITE_INT32_FIELD(this, OffsetOfElementAt(index), value);
2569 } 2569 }
2570 2570
2571 2571
2572 void ConstantPoolArray::set_at_offset(int offset, int32_t value) { 2572 void ConstantPoolArray::set_at_offset(int offset, int32_t value) {
2573 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2573 DCHECK(map() == GetHeap()->constant_pool_array_map());
2574 ASSERT(offset_is_type(offset, INT32)); 2574 DCHECK(offset_is_type(offset, INT32));
2575 WRITE_INT32_FIELD(this, offset, value); 2575 WRITE_INT32_FIELD(this, offset, value);
2576 } 2576 }
2577 2577
2578 2578
2579 void ConstantPoolArray::set_at_offset(int offset, int64_t value) { 2579 void ConstantPoolArray::set_at_offset(int offset, int64_t value) {
2580 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2580 DCHECK(map() == GetHeap()->constant_pool_array_map());
2581 ASSERT(offset_is_type(offset, INT64)); 2581 DCHECK(offset_is_type(offset, INT64));
2582 WRITE_INT64_FIELD(this, offset, value); 2582 WRITE_INT64_FIELD(this, offset, value);
2583 } 2583 }
2584 2584
2585 2585
2586 void ConstantPoolArray::set_at_offset(int offset, double value) { 2586 void ConstantPoolArray::set_at_offset(int offset, double value) {
2587 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2587 DCHECK(map() == GetHeap()->constant_pool_array_map());
2588 ASSERT(offset_is_type(offset, INT64)); 2588 DCHECK(offset_is_type(offset, INT64));
2589 WRITE_DOUBLE_FIELD(this, offset, value); 2589 WRITE_DOUBLE_FIELD(this, offset, value);
2590 } 2590 }
2591 2591
2592 2592
2593 void ConstantPoolArray::set_at_offset(int offset, Address value) { 2593 void ConstantPoolArray::set_at_offset(int offset, Address value) {
2594 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2594 DCHECK(map() == GetHeap()->constant_pool_array_map());
2595 ASSERT(offset_is_type(offset, CODE_PTR)); 2595 DCHECK(offset_is_type(offset, CODE_PTR));
2596 WRITE_FIELD(this, offset, reinterpret_cast<Object*>(value)); 2596 WRITE_FIELD(this, offset, reinterpret_cast<Object*>(value));
2597 WRITE_BARRIER(GetHeap(), this, offset, reinterpret_cast<Object*>(value)); 2597 WRITE_BARRIER(GetHeap(), this, offset, reinterpret_cast<Object*>(value));
2598 } 2598 }
2599 2599
2600 2600
2601 void ConstantPoolArray::set_at_offset(int offset, Object* value) { 2601 void ConstantPoolArray::set_at_offset(int offset, Object* value) {
2602 ASSERT(map() == GetHeap()->constant_pool_array_map()); 2602 DCHECK(map() == GetHeap()->constant_pool_array_map());
2603 ASSERT(!GetHeap()->InNewSpace(value)); 2603 DCHECK(!GetHeap()->InNewSpace(value));
2604 ASSERT(offset_is_type(offset, HEAP_PTR)); 2604 DCHECK(offset_is_type(offset, HEAP_PTR));
2605 WRITE_FIELD(this, offset, value); 2605 WRITE_FIELD(this, offset, value);
2606 WRITE_BARRIER(GetHeap(), this, offset, value); 2606 WRITE_BARRIER(GetHeap(), this, offset, value);
2607 } 2607 }
2608 2608
2609 2609
2610 void ConstantPoolArray::Init(const NumberOfEntries& small) { 2610 void ConstantPoolArray::Init(const NumberOfEntries& small) {
2611 uint32_t small_layout_1 = 2611 uint32_t small_layout_1 =
2612 Int64CountField::encode(small.count_of(INT64)) | 2612 Int64CountField::encode(small.count_of(INT64)) |
2613 CodePtrCountField::encode(small.count_of(CODE_PTR)) | 2613 CodePtrCountField::encode(small.count_of(CODE_PTR)) |
2614 HeapPtrCountField::encode(small.count_of(HEAP_PTR)) | 2614 HeapPtrCountField::encode(small.count_of(HEAP_PTR)) |
2615 IsExtendedField::encode(false); 2615 IsExtendedField::encode(false);
2616 uint32_t small_layout_2 = 2616 uint32_t small_layout_2 =
2617 Int32CountField::encode(small.count_of(INT32)) | 2617 Int32CountField::encode(small.count_of(INT32)) |
2618 TotalCountField::encode(small.total_count()) | 2618 TotalCountField::encode(small.total_count()) |
2619 WeakObjectStateField::encode(NO_WEAK_OBJECTS); 2619 WeakObjectStateField::encode(NO_WEAK_OBJECTS);
2620 WRITE_UINT32_FIELD(this, kSmallLayout1Offset, small_layout_1); 2620 WRITE_UINT32_FIELD(this, kSmallLayout1Offset, small_layout_1);
2621 WRITE_UINT32_FIELD(this, kSmallLayout2Offset, small_layout_2); 2621 WRITE_UINT32_FIELD(this, kSmallLayout2Offset, small_layout_2);
2622 if (kHeaderSize != kFirstEntryOffset) { 2622 if (kHeaderSize != kFirstEntryOffset) {
2623 ASSERT(kFirstEntryOffset - kHeaderSize == kInt32Size); 2623 DCHECK(kFirstEntryOffset - kHeaderSize == kInt32Size);
2624 WRITE_UINT32_FIELD(this, kHeaderSize, 0); // Zero out header padding. 2624 WRITE_UINT32_FIELD(this, kHeaderSize, 0); // Zero out header padding.
2625 } 2625 }
2626 } 2626 }
2627 2627
2628 2628
2629 void ConstantPoolArray::InitExtended(const NumberOfEntries& small, 2629 void ConstantPoolArray::InitExtended(const NumberOfEntries& small,
2630 const NumberOfEntries& extended) { 2630 const NumberOfEntries& extended) {
2631 // Initialize small layout fields first. 2631 // Initialize small layout fields first.
2632 Init(small); 2632 Init(small);
2633 2633
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2678 Heap* heap = GetHeap(); 2678 Heap* heap = GetHeap();
2679 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER; 2679 if (heap->incremental_marking()->IsMarking()) return UPDATE_WRITE_BARRIER;
2680 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER; 2680 if (heap->InNewSpace(this)) return SKIP_WRITE_BARRIER;
2681 return UPDATE_WRITE_BARRIER; 2681 return UPDATE_WRITE_BARRIER;
2682 } 2682 }
2683 2683
2684 2684
2685 void FixedArray::set(int index, 2685 void FixedArray::set(int index,
2686 Object* value, 2686 Object* value,
2687 WriteBarrierMode mode) { 2687 WriteBarrierMode mode) {
2688 ASSERT(map() != GetHeap()->fixed_cow_array_map()); 2688 DCHECK(map() != GetHeap()->fixed_cow_array_map());
2689 ASSERT(index >= 0 && index < this->length()); 2689 DCHECK(index >= 0 && index < this->length());
2690 int offset = kHeaderSize + index * kPointerSize; 2690 int offset = kHeaderSize + index * kPointerSize;
2691 WRITE_FIELD(this, offset, value); 2691 WRITE_FIELD(this, offset, value);
2692 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); 2692 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
2693 } 2693 }
2694 2694
2695 2695
2696 void FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array, 2696 void FixedArray::NoIncrementalWriteBarrierSet(FixedArray* array,
2697 int index, 2697 int index,
2698 Object* value) { 2698 Object* value) {
2699 ASSERT(array->map() != array->GetHeap()->fixed_cow_array_map()); 2699 DCHECK(array->map() != array->GetHeap()->fixed_cow_array_map());
2700 ASSERT(index >= 0 && index < array->length()); 2700 DCHECK(index >= 0 && index < array->length());
2701 int offset = kHeaderSize + index * kPointerSize; 2701 int offset = kHeaderSize + index * kPointerSize;
2702 WRITE_FIELD(array, offset, value); 2702 WRITE_FIELD(array, offset, value);
2703 Heap* heap = array->GetHeap(); 2703 Heap* heap = array->GetHeap();
2704 if (heap->InNewSpace(value)) { 2704 if (heap->InNewSpace(value)) {
2705 heap->RecordWrite(array->address(), offset); 2705 heap->RecordWrite(array->address(), offset);
2706 } 2706 }
2707 } 2707 }
2708 2708
2709 2709
2710 void FixedArray::NoWriteBarrierSet(FixedArray* array, 2710 void FixedArray::NoWriteBarrierSet(FixedArray* array,
2711 int index, 2711 int index,
2712 Object* value) { 2712 Object* value) {
2713 ASSERT(array->map() != array->GetHeap()->fixed_cow_array_map()); 2713 DCHECK(array->map() != array->GetHeap()->fixed_cow_array_map());
2714 ASSERT(index >= 0 && index < array->length()); 2714 DCHECK(index >= 0 && index < array->length());
2715 ASSERT(!array->GetHeap()->InNewSpace(value)); 2715 DCHECK(!array->GetHeap()->InNewSpace(value));
2716 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value); 2716 WRITE_FIELD(array, kHeaderSize + index * kPointerSize, value);
2717 } 2717 }
2718 2718
2719 2719
2720 void FixedArray::set_undefined(int index) { 2720 void FixedArray::set_undefined(int index) {
2721 ASSERT(map() != GetHeap()->fixed_cow_array_map()); 2721 DCHECK(map() != GetHeap()->fixed_cow_array_map());
2722 ASSERT(index >= 0 && index < this->length()); 2722 DCHECK(index >= 0 && index < this->length());
2723 ASSERT(!GetHeap()->InNewSpace(GetHeap()->undefined_value())); 2723 DCHECK(!GetHeap()->InNewSpace(GetHeap()->undefined_value()));
2724 WRITE_FIELD(this, 2724 WRITE_FIELD(this,
2725 kHeaderSize + index * kPointerSize, 2725 kHeaderSize + index * kPointerSize,
2726 GetHeap()->undefined_value()); 2726 GetHeap()->undefined_value());
2727 } 2727 }
2728 2728
2729 2729
2730 void FixedArray::set_null(int index) { 2730 void FixedArray::set_null(int index) {
2731 ASSERT(index >= 0 && index < this->length()); 2731 DCHECK(index >= 0 && index < this->length());
2732 ASSERT(!GetHeap()->InNewSpace(GetHeap()->null_value())); 2732 DCHECK(!GetHeap()->InNewSpace(GetHeap()->null_value()));
2733 WRITE_FIELD(this, 2733 WRITE_FIELD(this,
2734 kHeaderSize + index * kPointerSize, 2734 kHeaderSize + index * kPointerSize,
2735 GetHeap()->null_value()); 2735 GetHeap()->null_value());
2736 } 2736 }
2737 2737
2738 2738
2739 void FixedArray::set_the_hole(int index) { 2739 void FixedArray::set_the_hole(int index) {
2740 ASSERT(map() != GetHeap()->fixed_cow_array_map()); 2740 DCHECK(map() != GetHeap()->fixed_cow_array_map());
2741 ASSERT(index >= 0 && index < this->length()); 2741 DCHECK(index >= 0 && index < this->length());
2742 ASSERT(!GetHeap()->InNewSpace(GetHeap()->the_hole_value())); 2742 DCHECK(!GetHeap()->InNewSpace(GetHeap()->the_hole_value()));
2743 WRITE_FIELD(this, 2743 WRITE_FIELD(this,
2744 kHeaderSize + index * kPointerSize, 2744 kHeaderSize + index * kPointerSize,
2745 GetHeap()->the_hole_value()); 2745 GetHeap()->the_hole_value());
2746 } 2746 }
2747 2747
2748 2748
2749 void FixedArray::FillWithHoles(int from, int to) { 2749 void FixedArray::FillWithHoles(int from, int to) {
2750 for (int i = from; i < to; i++) { 2750 for (int i = from; i < to; i++) {
2751 set_the_hole(i); 2751 set_the_hole(i);
2752 } 2752 }
2753 } 2753 }
2754 2754
2755 2755
2756 Object** FixedArray::data_start() { 2756 Object** FixedArray::data_start() {
2757 return HeapObject::RawField(this, kHeaderSize); 2757 return HeapObject::RawField(this, kHeaderSize);
2758 } 2758 }
2759 2759
2760 2760
2761 bool DescriptorArray::IsEmpty() { 2761 bool DescriptorArray::IsEmpty() {
2762 ASSERT(length() >= kFirstIndex || 2762 DCHECK(length() >= kFirstIndex ||
2763 this == GetHeap()->empty_descriptor_array()); 2763 this == GetHeap()->empty_descriptor_array());
2764 return length() < kFirstIndex; 2764 return length() < kFirstIndex;
2765 } 2765 }
2766 2766
2767 2767
2768 void DescriptorArray::SetNumberOfDescriptors(int number_of_descriptors) { 2768 void DescriptorArray::SetNumberOfDescriptors(int number_of_descriptors) {
2769 WRITE_FIELD( 2769 WRITE_FIELD(
2770 this, kDescriptorLengthOffset, Smi::FromInt(number_of_descriptors)); 2770 this, kDescriptorLengthOffset, Smi::FromInt(number_of_descriptors));
2771 } 2771 }
2772 2772
2773 2773
2774 // Perform a binary search in a fixed array. Low and high are entry indices. If 2774 // Perform a binary search in a fixed array. Low and high are entry indices. If
2775 // there are three entries in this array it should be called with low=0 and 2775 // there are three entries in this array it should be called with low=0 and
2776 // high=2. 2776 // high=2.
2777 template<SearchMode search_mode, typename T> 2777 template<SearchMode search_mode, typename T>
2778 int BinarySearch(T* array, Name* name, int low, int high, int valid_entries) { 2778 int BinarySearch(T* array, Name* name, int low, int high, int valid_entries) {
2779 uint32_t hash = name->Hash(); 2779 uint32_t hash = name->Hash();
2780 int limit = high; 2780 int limit = high;
2781 2781
2782 ASSERT(low <= high); 2782 DCHECK(low <= high);
2783 2783
2784 while (low != high) { 2784 while (low != high) {
2785 int mid = (low + high) / 2; 2785 int mid = (low + high) / 2;
2786 Name* mid_name = array->GetSortedKey(mid); 2786 Name* mid_name = array->GetSortedKey(mid);
2787 uint32_t mid_hash = mid_name->Hash(); 2787 uint32_t mid_hash = mid_name->Hash();
2788 2788
2789 if (mid_hash >= hash) { 2789 if (mid_hash >= hash) {
2790 high = mid; 2790 high = mid;
2791 } else { 2791 } else {
2792 low = mid + 1; 2792 low = mid + 1;
(...skipping 23 matching lines...) Expand all
2816 uint32_t hash = name->Hash(); 2816 uint32_t hash = name->Hash();
2817 if (search_mode == ALL_ENTRIES) { 2817 if (search_mode == ALL_ENTRIES) {
2818 for (int number = 0; number < len; number++) { 2818 for (int number = 0; number < len; number++) {
2819 int sorted_index = array->GetSortedKeyIndex(number); 2819 int sorted_index = array->GetSortedKeyIndex(number);
2820 Name* entry = array->GetKey(sorted_index); 2820 Name* entry = array->GetKey(sorted_index);
2821 uint32_t current_hash = entry->Hash(); 2821 uint32_t current_hash = entry->Hash();
2822 if (current_hash > hash) break; 2822 if (current_hash > hash) break;
2823 if (current_hash == hash && entry->Equals(name)) return sorted_index; 2823 if (current_hash == hash && entry->Equals(name)) return sorted_index;
2824 } 2824 }
2825 } else { 2825 } else {
2826 ASSERT(len >= valid_entries); 2826 DCHECK(len >= valid_entries);
2827 for (int number = 0; number < valid_entries; number++) { 2827 for (int number = 0; number < valid_entries; number++) {
2828 Name* entry = array->GetKey(number); 2828 Name* entry = array->GetKey(number);
2829 uint32_t current_hash = entry->Hash(); 2829 uint32_t current_hash = entry->Hash();
2830 if (current_hash == hash && entry->Equals(name)) return number; 2830 if (current_hash == hash && entry->Equals(name)) return number;
2831 } 2831 }
2832 } 2832 }
2833 return T::kNotFound; 2833 return T::kNotFound;
2834 } 2834 }
2835 2835
2836 2836
2837 template<SearchMode search_mode, typename T> 2837 template<SearchMode search_mode, typename T>
2838 int Search(T* array, Name* name, int valid_entries) { 2838 int Search(T* array, Name* name, int valid_entries) {
2839 if (search_mode == VALID_ENTRIES) { 2839 if (search_mode == VALID_ENTRIES) {
2840 SLOW_ASSERT(array->IsSortedNoDuplicates(valid_entries)); 2840 SLOW_DCHECK(array->IsSortedNoDuplicates(valid_entries));
2841 } else { 2841 } else {
2842 SLOW_ASSERT(array->IsSortedNoDuplicates()); 2842 SLOW_DCHECK(array->IsSortedNoDuplicates());
2843 } 2843 }
2844 2844
2845 int nof = array->number_of_entries(); 2845 int nof = array->number_of_entries();
2846 if (nof == 0) return T::kNotFound; 2846 if (nof == 0) return T::kNotFound;
2847 2847
2848 // Fast case: do linear search for small arrays. 2848 // Fast case: do linear search for small arrays.
2849 const int kMaxElementsForLinearSearch = 8; 2849 const int kMaxElementsForLinearSearch = 8;
2850 if ((search_mode == ALL_ENTRIES && 2850 if ((search_mode == ALL_ENTRIES &&
2851 nof <= kMaxElementsForLinearSearch) || 2851 nof <= kMaxElementsForLinearSearch) ||
2852 (search_mode == VALID_ENTRIES && 2852 (search_mode == VALID_ENTRIES &&
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2900 LookupResult* result) { 2900 LookupResult* result) {
2901 int transition_index = this->SearchTransition(name); 2901 int transition_index = this->SearchTransition(name);
2902 if (transition_index == TransitionArray::kNotFound) return result->NotFound(); 2902 if (transition_index == TransitionArray::kNotFound) return result->NotFound();
2903 result->TransitionResult(holder, this->GetTransition(transition_index)); 2903 result->TransitionResult(holder, this->GetTransition(transition_index));
2904 } 2904 }
2905 2905
2906 2906
2907 FixedArrayBase* Map::GetInitialElements() { 2907 FixedArrayBase* Map::GetInitialElements() {
2908 if (has_fast_smi_or_object_elements() || 2908 if (has_fast_smi_or_object_elements() ||
2909 has_fast_double_elements()) { 2909 has_fast_double_elements()) {
2910 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array())); 2910 DCHECK(!GetHeap()->InNewSpace(GetHeap()->empty_fixed_array()));
2911 return GetHeap()->empty_fixed_array(); 2911 return GetHeap()->empty_fixed_array();
2912 } else if (has_external_array_elements()) { 2912 } else if (has_external_array_elements()) {
2913 ExternalArray* empty_array = GetHeap()->EmptyExternalArrayForMap(this); 2913 ExternalArray* empty_array = GetHeap()->EmptyExternalArrayForMap(this);
2914 ASSERT(!GetHeap()->InNewSpace(empty_array)); 2914 DCHECK(!GetHeap()->InNewSpace(empty_array));
2915 return empty_array; 2915 return empty_array;
2916 } else if (has_fixed_typed_array_elements()) { 2916 } else if (has_fixed_typed_array_elements()) {
2917 FixedTypedArrayBase* empty_array = 2917 FixedTypedArrayBase* empty_array =
2918 GetHeap()->EmptyFixedTypedArrayForMap(this); 2918 GetHeap()->EmptyFixedTypedArrayForMap(this);
2919 ASSERT(!GetHeap()->InNewSpace(empty_array)); 2919 DCHECK(!GetHeap()->InNewSpace(empty_array));
2920 return empty_array; 2920 return empty_array;
2921 } else if (has_dictionary_elements()) { 2921 } else if (has_dictionary_elements()) {
2922 ASSERT(!GetHeap()->InNewSpace(GetHeap()->empty_slow_element_dictionary())); 2922 DCHECK(!GetHeap()->InNewSpace(GetHeap()->empty_slow_element_dictionary()));
2923 return GetHeap()->empty_slow_element_dictionary(); 2923 return GetHeap()->empty_slow_element_dictionary();
2924 } else { 2924 } else {
2925 UNREACHABLE(); 2925 UNREACHABLE();
2926 } 2926 }
2927 return NULL; 2927 return NULL;
2928 } 2928 }
2929 2929
2930 2930
2931 Object** DescriptorArray::GetKeySlot(int descriptor_number) { 2931 Object** DescriptorArray::GetKeySlot(int descriptor_number) {
2932 ASSERT(descriptor_number < number_of_descriptors()); 2932 DCHECK(descriptor_number < number_of_descriptors());
2933 return RawFieldOfElementAt(ToKeyIndex(descriptor_number)); 2933 return RawFieldOfElementAt(ToKeyIndex(descriptor_number));
2934 } 2934 }
2935 2935
2936 2936
2937 Object** DescriptorArray::GetDescriptorStartSlot(int descriptor_number) { 2937 Object** DescriptorArray::GetDescriptorStartSlot(int descriptor_number) {
2938 return GetKeySlot(descriptor_number); 2938 return GetKeySlot(descriptor_number);
2939 } 2939 }
2940 2940
2941 2941
2942 Object** DescriptorArray::GetDescriptorEndSlot(int descriptor_number) { 2942 Object** DescriptorArray::GetDescriptorEndSlot(int descriptor_number) {
2943 return GetValueSlot(descriptor_number - 1) + 1; 2943 return GetValueSlot(descriptor_number - 1) + 1;
2944 } 2944 }
2945 2945
2946 2946
2947 Name* DescriptorArray::GetKey(int descriptor_number) { 2947 Name* DescriptorArray::GetKey(int descriptor_number) {
2948 ASSERT(descriptor_number < number_of_descriptors()); 2948 DCHECK(descriptor_number < number_of_descriptors());
2949 return Name::cast(get(ToKeyIndex(descriptor_number))); 2949 return Name::cast(get(ToKeyIndex(descriptor_number)));
2950 } 2950 }
2951 2951
2952 2952
2953 int DescriptorArray::GetSortedKeyIndex(int descriptor_number) { 2953 int DescriptorArray::GetSortedKeyIndex(int descriptor_number) {
2954 return GetDetails(descriptor_number).pointer(); 2954 return GetDetails(descriptor_number).pointer();
2955 } 2955 }
2956 2956
2957 2957
2958 Name* DescriptorArray::GetSortedKey(int descriptor_number) { 2958 Name* DescriptorArray::GetSortedKey(int descriptor_number) {
2959 return GetKey(GetSortedKeyIndex(descriptor_number)); 2959 return GetKey(GetSortedKeyIndex(descriptor_number));
2960 } 2960 }
2961 2961
2962 2962
2963 void DescriptorArray::SetSortedKey(int descriptor_index, int pointer) { 2963 void DescriptorArray::SetSortedKey(int descriptor_index, int pointer) {
2964 PropertyDetails details = GetDetails(descriptor_index); 2964 PropertyDetails details = GetDetails(descriptor_index);
2965 set(ToDetailsIndex(descriptor_index), details.set_pointer(pointer).AsSmi()); 2965 set(ToDetailsIndex(descriptor_index), details.set_pointer(pointer).AsSmi());
2966 } 2966 }
2967 2967
2968 2968
2969 void DescriptorArray::SetRepresentation(int descriptor_index, 2969 void DescriptorArray::SetRepresentation(int descriptor_index,
2970 Representation representation) { 2970 Representation representation) {
2971 ASSERT(!representation.IsNone()); 2971 DCHECK(!representation.IsNone());
2972 PropertyDetails details = GetDetails(descriptor_index); 2972 PropertyDetails details = GetDetails(descriptor_index);
2973 set(ToDetailsIndex(descriptor_index), 2973 set(ToDetailsIndex(descriptor_index),
2974 details.CopyWithRepresentation(representation).AsSmi()); 2974 details.CopyWithRepresentation(representation).AsSmi());
2975 } 2975 }
2976 2976
2977 2977
2978 Object** DescriptorArray::GetValueSlot(int descriptor_number) { 2978 Object** DescriptorArray::GetValueSlot(int descriptor_number) {
2979 ASSERT(descriptor_number < number_of_descriptors()); 2979 DCHECK(descriptor_number < number_of_descriptors());
2980 return RawFieldOfElementAt(ToValueIndex(descriptor_number)); 2980 return RawFieldOfElementAt(ToValueIndex(descriptor_number));
2981 } 2981 }
2982 2982
2983 2983
2984 Object* DescriptorArray::GetValue(int descriptor_number) { 2984 Object* DescriptorArray::GetValue(int descriptor_number) {
2985 ASSERT(descriptor_number < number_of_descriptors()); 2985 DCHECK(descriptor_number < number_of_descriptors());
2986 return get(ToValueIndex(descriptor_number)); 2986 return get(ToValueIndex(descriptor_number));
2987 } 2987 }
2988 2988
2989 2989
2990 void DescriptorArray::SetValue(int descriptor_index, Object* value) { 2990 void DescriptorArray::SetValue(int descriptor_index, Object* value) {
2991 set(ToValueIndex(descriptor_index), value); 2991 set(ToValueIndex(descriptor_index), value);
2992 } 2992 }
2993 2993
2994 2994
2995 PropertyDetails DescriptorArray::GetDetails(int descriptor_number) { 2995 PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
2996 ASSERT(descriptor_number < number_of_descriptors()); 2996 DCHECK(descriptor_number < number_of_descriptors());
2997 Object* details = get(ToDetailsIndex(descriptor_number)); 2997 Object* details = get(ToDetailsIndex(descriptor_number));
2998 return PropertyDetails(Smi::cast(details)); 2998 return PropertyDetails(Smi::cast(details));
2999 } 2999 }
3000 3000
3001 3001
3002 PropertyType DescriptorArray::GetType(int descriptor_number) { 3002 PropertyType DescriptorArray::GetType(int descriptor_number) {
3003 return GetDetails(descriptor_number).type(); 3003 return GetDetails(descriptor_number).type();
3004 } 3004 }
3005 3005
3006 3006
3007 int DescriptorArray::GetFieldIndex(int descriptor_number) { 3007 int DescriptorArray::GetFieldIndex(int descriptor_number) {
3008 ASSERT(GetDetails(descriptor_number).type() == FIELD); 3008 DCHECK(GetDetails(descriptor_number).type() == FIELD);
3009 return GetDetails(descriptor_number).field_index(); 3009 return GetDetails(descriptor_number).field_index();
3010 } 3010 }
3011 3011
3012 3012
3013 HeapType* DescriptorArray::GetFieldType(int descriptor_number) { 3013 HeapType* DescriptorArray::GetFieldType(int descriptor_number) {
3014 ASSERT(GetDetails(descriptor_number).type() == FIELD); 3014 DCHECK(GetDetails(descriptor_number).type() == FIELD);
3015 return HeapType::cast(GetValue(descriptor_number)); 3015 return HeapType::cast(GetValue(descriptor_number));
3016 } 3016 }
3017 3017
3018 3018
3019 Object* DescriptorArray::GetConstant(int descriptor_number) { 3019 Object* DescriptorArray::GetConstant(int descriptor_number) {
3020 return GetValue(descriptor_number); 3020 return GetValue(descriptor_number);
3021 } 3021 }
3022 3022
3023 3023
3024 Object* DescriptorArray::GetCallbacksObject(int descriptor_number) { 3024 Object* DescriptorArray::GetCallbacksObject(int descriptor_number) {
3025 ASSERT(GetType(descriptor_number) == CALLBACKS); 3025 DCHECK(GetType(descriptor_number) == CALLBACKS);
3026 return GetValue(descriptor_number); 3026 return GetValue(descriptor_number);
3027 } 3027 }
3028 3028
3029 3029
3030 AccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) { 3030 AccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) {
3031 ASSERT(GetType(descriptor_number) == CALLBACKS); 3031 DCHECK(GetType(descriptor_number) == CALLBACKS);
3032 Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number)); 3032 Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number));
3033 return reinterpret_cast<AccessorDescriptor*>(p->foreign_address()); 3033 return reinterpret_cast<AccessorDescriptor*>(p->foreign_address());
3034 } 3034 }
3035 3035
3036 3036
3037 void DescriptorArray::Get(int descriptor_number, Descriptor* desc) { 3037 void DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
3038 desc->Init(handle(GetKey(descriptor_number), GetIsolate()), 3038 desc->Init(handle(GetKey(descriptor_number), GetIsolate()),
3039 handle(GetValue(descriptor_number), GetIsolate()), 3039 handle(GetValue(descriptor_number), GetIsolate()),
3040 GetDetails(descriptor_number)); 3040 GetDetails(descriptor_number));
3041 } 3041 }
3042 3042
3043 3043
3044 void DescriptorArray::Set(int descriptor_number, 3044 void DescriptorArray::Set(int descriptor_number,
3045 Descriptor* desc, 3045 Descriptor* desc,
3046 const WhitenessWitness&) { 3046 const WhitenessWitness&) {
3047 // Range check. 3047 // Range check.
3048 ASSERT(descriptor_number < number_of_descriptors()); 3048 DCHECK(descriptor_number < number_of_descriptors());
3049 3049
3050 NoIncrementalWriteBarrierSet(this, 3050 NoIncrementalWriteBarrierSet(this,
3051 ToKeyIndex(descriptor_number), 3051 ToKeyIndex(descriptor_number),
3052 *desc->GetKey()); 3052 *desc->GetKey());
3053 NoIncrementalWriteBarrierSet(this, 3053 NoIncrementalWriteBarrierSet(this,
3054 ToValueIndex(descriptor_number), 3054 ToValueIndex(descriptor_number),
3055 *desc->GetValue()); 3055 *desc->GetValue());
3056 NoIncrementalWriteBarrierSet(this, 3056 NoIncrementalWriteBarrierSet(this,
3057 ToDetailsIndex(descriptor_number), 3057 ToDetailsIndex(descriptor_number),
3058 desc->GetDetails().AsSmi()); 3058 desc->GetDetails().AsSmi());
3059 } 3059 }
3060 3060
3061 3061
3062 void DescriptorArray::Set(int descriptor_number, Descriptor* desc) { 3062 void DescriptorArray::Set(int descriptor_number, Descriptor* desc) {
3063 // Range check. 3063 // Range check.
3064 ASSERT(descriptor_number < number_of_descriptors()); 3064 DCHECK(descriptor_number < number_of_descriptors());
3065 3065
3066 set(ToKeyIndex(descriptor_number), *desc->GetKey()); 3066 set(ToKeyIndex(descriptor_number), *desc->GetKey());
3067 set(ToValueIndex(descriptor_number), *desc->GetValue()); 3067 set(ToValueIndex(descriptor_number), *desc->GetValue());
3068 set(ToDetailsIndex(descriptor_number), desc->GetDetails().AsSmi()); 3068 set(ToDetailsIndex(descriptor_number), desc->GetDetails().AsSmi());
3069 } 3069 }
3070 3070
3071 3071
3072 void DescriptorArray::Append(Descriptor* desc, 3072 void DescriptorArray::Append(Descriptor* desc,
3073 const WhitenessWitness& witness) { 3073 const WhitenessWitness& witness) {
3074 DisallowHeapAllocation no_gc; 3074 DisallowHeapAllocation no_gc;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3113 void DescriptorArray::SwapSortedKeys(int first, int second) { 3113 void DescriptorArray::SwapSortedKeys(int first, int second) {
3114 int first_key = GetSortedKeyIndex(first); 3114 int first_key = GetSortedKeyIndex(first);
3115 SetSortedKey(first, GetSortedKeyIndex(second)); 3115 SetSortedKey(first, GetSortedKeyIndex(second));
3116 SetSortedKey(second, first_key); 3116 SetSortedKey(second, first_key);
3117 } 3117 }
3118 3118
3119 3119
3120 DescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array) 3120 DescriptorArray::WhitenessWitness::WhitenessWitness(DescriptorArray* array)
3121 : marking_(array->GetHeap()->incremental_marking()) { 3121 : marking_(array->GetHeap()->incremental_marking()) {
3122 marking_->EnterNoMarkingScope(); 3122 marking_->EnterNoMarkingScope();
3123 ASSERT(!marking_->IsMarking() || 3123 DCHECK(!marking_->IsMarking() ||
3124 Marking::Color(array) == Marking::WHITE_OBJECT); 3124 Marking::Color(array) == Marking::WHITE_OBJECT);
3125 } 3125 }
3126 3126
3127 3127
3128 DescriptorArray::WhitenessWitness::~WhitenessWitness() { 3128 DescriptorArray::WhitenessWitness::~WhitenessWitness() {
3129 marking_->LeaveNoMarkingScope(); 3129 marking_->LeaveNoMarkingScope();
3130 } 3130 }
3131 3131
3132 3132
3133 template<typename Derived, typename Shape, typename Key> 3133 template<typename Derived, typename Shape, typename Key>
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3168 3168
3169 3169
3170 bool SeededNumberDictionary::requires_slow_elements() { 3170 bool SeededNumberDictionary::requires_slow_elements() {
3171 Object* max_index_object = get(kMaxNumberKeyIndex); 3171 Object* max_index_object = get(kMaxNumberKeyIndex);
3172 if (!max_index_object->IsSmi()) return false; 3172 if (!max_index_object->IsSmi()) return false;
3173 return 0 != 3173 return 0 !=
3174 (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask); 3174 (Smi::cast(max_index_object)->value() & kRequiresSlowElementsMask);
3175 } 3175 }
3176 3176
3177 uint32_t SeededNumberDictionary::max_number_key() { 3177 uint32_t SeededNumberDictionary::max_number_key() {
3178 ASSERT(!requires_slow_elements()); 3178 DCHECK(!requires_slow_elements());
3179 Object* max_index_object = get(kMaxNumberKeyIndex); 3179 Object* max_index_object = get(kMaxNumberKeyIndex);
3180 if (!max_index_object->IsSmi()) return 0; 3180 if (!max_index_object->IsSmi()) return 0;
3181 uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value()); 3181 uint32_t value = static_cast<uint32_t>(Smi::cast(max_index_object)->value());
3182 return value >> kRequiresSlowElementsTagSize; 3182 return value >> kRequiresSlowElementsTagSize;
3183 } 3183 }
3184 3184
3185 void SeededNumberDictionary::set_requires_slow_elements() { 3185 void SeededNumberDictionary::set_requires_slow_elements() {
3186 set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask)); 3186 set(kMaxNumberKeyIndex, Smi::FromInt(kRequiresSlowElementsMask));
3187 } 3187 }
3188 3188
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
3273 CAST_ACCESSOR(String) 3273 CAST_ACCESSOR(String)
3274 CAST_ACCESSOR(StringTable) 3274 CAST_ACCESSOR(StringTable)
3275 CAST_ACCESSOR(Struct) 3275 CAST_ACCESSOR(Struct)
3276 CAST_ACCESSOR(Symbol) 3276 CAST_ACCESSOR(Symbol)
3277 CAST_ACCESSOR(UnseededNumberDictionary) 3277 CAST_ACCESSOR(UnseededNumberDictionary)
3278 CAST_ACCESSOR(WeakHashTable) 3278 CAST_ACCESSOR(WeakHashTable)
3279 3279
3280 3280
3281 template <class Traits> 3281 template <class Traits>
3282 FixedTypedArray<Traits>* FixedTypedArray<Traits>::cast(Object* object) { 3282 FixedTypedArray<Traits>* FixedTypedArray<Traits>::cast(Object* object) {
3283 SLOW_ASSERT(object->IsHeapObject() && 3283 SLOW_DCHECK(object->IsHeapObject() &&
3284 HeapObject::cast(object)->map()->instance_type() == 3284 HeapObject::cast(object)->map()->instance_type() ==
3285 Traits::kInstanceType); 3285 Traits::kInstanceType);
3286 return reinterpret_cast<FixedTypedArray<Traits>*>(object); 3286 return reinterpret_cast<FixedTypedArray<Traits>*>(object);
3287 } 3287 }
3288 3288
3289 3289
3290 template <class Traits> 3290 template <class Traits>
3291 const FixedTypedArray<Traits>* 3291 const FixedTypedArray<Traits>*
3292 FixedTypedArray<Traits>::cast(const Object* object) { 3292 FixedTypedArray<Traits>::cast(const Object* object) {
3293 SLOW_ASSERT(object->IsHeapObject() && 3293 SLOW_DCHECK(object->IsHeapObject() &&
3294 HeapObject::cast(object)->map()->instance_type() == 3294 HeapObject::cast(object)->map()->instance_type() ==
3295 Traits::kInstanceType); 3295 Traits::kInstanceType);
3296 return reinterpret_cast<FixedTypedArray<Traits>*>(object); 3296 return reinterpret_cast<FixedTypedArray<Traits>*>(object);
3297 } 3297 }
3298 3298
3299 3299
3300 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name) 3300 #define MAKE_STRUCT_CAST(NAME, Name, name) CAST_ACCESSOR(Name)
3301 STRUCT_LIST(MAKE_STRUCT_CAST) 3301 STRUCT_LIST(MAKE_STRUCT_CAST)
3302 #undef MAKE_STRUCT_CAST 3302 #undef MAKE_STRUCT_CAST
3303 3303
3304 3304
3305 template <typename Derived, typename Shape, typename Key> 3305 template <typename Derived, typename Shape, typename Key>
3306 HashTable<Derived, Shape, Key>* 3306 HashTable<Derived, Shape, Key>*
3307 HashTable<Derived, Shape, Key>::cast(Object* obj) { 3307 HashTable<Derived, Shape, Key>::cast(Object* obj) {
3308 SLOW_ASSERT(obj->IsHashTable()); 3308 SLOW_DCHECK(obj->IsHashTable());
3309 return reinterpret_cast<HashTable*>(obj); 3309 return reinterpret_cast<HashTable*>(obj);
3310 } 3310 }
3311 3311
3312 3312
3313 template <typename Derived, typename Shape, typename Key> 3313 template <typename Derived, typename Shape, typename Key>
3314 const HashTable<Derived, Shape, Key>* 3314 const HashTable<Derived, Shape, Key>*
3315 HashTable<Derived, Shape, Key>::cast(const Object* obj) { 3315 HashTable<Derived, Shape, Key>::cast(const Object* obj) {
3316 SLOW_ASSERT(obj->IsHashTable()); 3316 SLOW_DCHECK(obj->IsHashTable());
3317 return reinterpret_cast<const HashTable*>(obj); 3317 return reinterpret_cast<const HashTable*>(obj);
3318 } 3318 }
3319 3319
3320 3320
3321 SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset) 3321 SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
3322 SYNCHRONIZED_SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset) 3322 SYNCHRONIZED_SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
3323 3323
3324 SMI_ACCESSORS(FreeSpace, size, kSizeOffset) 3324 SMI_ACCESSORS(FreeSpace, size, kSizeOffset)
3325 NOBARRIER_SMI_ACCESSORS(FreeSpace, size, kSizeOffset) 3325 NOBARRIER_SMI_ACCESSORS(FreeSpace, size, kSizeOffset)
3326 3326
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
3387 3387
3388 Handle<String> String::Flatten(Handle<String> string, PretenureFlag pretenure) { 3388 Handle<String> String::Flatten(Handle<String> string, PretenureFlag pretenure) {
3389 if (!string->IsConsString()) return string; 3389 if (!string->IsConsString()) return string;
3390 Handle<ConsString> cons = Handle<ConsString>::cast(string); 3390 Handle<ConsString> cons = Handle<ConsString>::cast(string);
3391 if (cons->IsFlat()) return handle(cons->first()); 3391 if (cons->IsFlat()) return handle(cons->first());
3392 return SlowFlatten(cons, pretenure); 3392 return SlowFlatten(cons, pretenure);
3393 } 3393 }
3394 3394
3395 3395
3396 uint16_t String::Get(int index) { 3396 uint16_t String::Get(int index) {
3397 ASSERT(index >= 0 && index < length()); 3397 DCHECK(index >= 0 && index < length());
3398 switch (StringShape(this).full_representation_tag()) { 3398 switch (StringShape(this).full_representation_tag()) {
3399 case kSeqStringTag | kOneByteStringTag: 3399 case kSeqStringTag | kOneByteStringTag:
3400 return SeqOneByteString::cast(this)->SeqOneByteStringGet(index); 3400 return SeqOneByteString::cast(this)->SeqOneByteStringGet(index);
3401 case kSeqStringTag | kTwoByteStringTag: 3401 case kSeqStringTag | kTwoByteStringTag:
3402 return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index); 3402 return SeqTwoByteString::cast(this)->SeqTwoByteStringGet(index);
3403 case kConsStringTag | kOneByteStringTag: 3403 case kConsStringTag | kOneByteStringTag:
3404 case kConsStringTag | kTwoByteStringTag: 3404 case kConsStringTag | kTwoByteStringTag:
3405 return ConsString::cast(this)->ConsStringGet(index); 3405 return ConsString::cast(this)->ConsStringGet(index);
3406 case kExternalStringTag | kOneByteStringTag: 3406 case kExternalStringTag | kOneByteStringTag:
3407 return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index); 3407 return ExternalAsciiString::cast(this)->ExternalAsciiStringGet(index);
3408 case kExternalStringTag | kTwoByteStringTag: 3408 case kExternalStringTag | kTwoByteStringTag:
3409 return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index); 3409 return ExternalTwoByteString::cast(this)->ExternalTwoByteStringGet(index);
3410 case kSlicedStringTag | kOneByteStringTag: 3410 case kSlicedStringTag | kOneByteStringTag:
3411 case kSlicedStringTag | kTwoByteStringTag: 3411 case kSlicedStringTag | kTwoByteStringTag:
3412 return SlicedString::cast(this)->SlicedStringGet(index); 3412 return SlicedString::cast(this)->SlicedStringGet(index);
3413 default: 3413 default:
3414 break; 3414 break;
3415 } 3415 }
3416 3416
3417 UNREACHABLE(); 3417 UNREACHABLE();
3418 return 0; 3418 return 0;
3419 } 3419 }
3420 3420
3421 3421
3422 void String::Set(int index, uint16_t value) { 3422 void String::Set(int index, uint16_t value) {
3423 ASSERT(index >= 0 && index < length()); 3423 DCHECK(index >= 0 && index < length());
3424 ASSERT(StringShape(this).IsSequential()); 3424 DCHECK(StringShape(this).IsSequential());
3425 3425
3426 return this->IsOneByteRepresentation() 3426 return this->IsOneByteRepresentation()
3427 ? SeqOneByteString::cast(this)->SeqOneByteStringSet(index, value) 3427 ? SeqOneByteString::cast(this)->SeqOneByteStringSet(index, value)
3428 : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value); 3428 : SeqTwoByteString::cast(this)->SeqTwoByteStringSet(index, value);
3429 } 3429 }
3430 3430
3431 3431
3432 bool String::IsFlat() { 3432 bool String::IsFlat() {
3433 if (!StringShape(this).IsCons()) return true; 3433 if (!StringShape(this).IsCons()) return true;
3434 return ConsString::cast(this)->second()->length() == 0; 3434 return ConsString::cast(this)->second()->length() == 0;
3435 } 3435 }
3436 3436
3437 3437
3438 String* String::GetUnderlying() { 3438 String* String::GetUnderlying() {
3439 // Giving direct access to underlying string only makes sense if the 3439 // Giving direct access to underlying string only makes sense if the
3440 // wrapping string is already flattened. 3440 // wrapping string is already flattened.
3441 ASSERT(this->IsFlat()); 3441 DCHECK(this->IsFlat());
3442 ASSERT(StringShape(this).IsIndirect()); 3442 DCHECK(StringShape(this).IsIndirect());
3443 STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset); 3443 STATIC_ASSERT(ConsString::kFirstOffset == SlicedString::kParentOffset);
3444 const int kUnderlyingOffset = SlicedString::kParentOffset; 3444 const int kUnderlyingOffset = SlicedString::kParentOffset;
3445 return String::cast(READ_FIELD(this, kUnderlyingOffset)); 3445 return String::cast(READ_FIELD(this, kUnderlyingOffset));
3446 } 3446 }
3447 3447
3448 3448
3449 template<class Visitor> 3449 template<class Visitor>
3450 ConsString* String::VisitFlat(Visitor* visitor, 3450 ConsString* String::VisitFlat(Visitor* visitor,
3451 String* string, 3451 String* string,
3452 const int offset) { 3452 const int offset) {
3453 int slice_offset = offset; 3453 int slice_offset = offset;
3454 const int length = string->length(); 3454 const int length = string->length();
3455 ASSERT(offset <= length); 3455 DCHECK(offset <= length);
3456 while (true) { 3456 while (true) {
3457 int32_t type = string->map()->instance_type(); 3457 int32_t type = string->map()->instance_type();
3458 switch (type & (kStringRepresentationMask | kStringEncodingMask)) { 3458 switch (type & (kStringRepresentationMask | kStringEncodingMask)) {
3459 case kSeqStringTag | kOneByteStringTag: 3459 case kSeqStringTag | kOneByteStringTag:
3460 visitor->VisitOneByteString( 3460 visitor->VisitOneByteString(
3461 SeqOneByteString::cast(string)->GetChars() + slice_offset, 3461 SeqOneByteString::cast(string)->GetChars() + slice_offset,
3462 length - offset); 3462 length - offset);
3463 return NULL; 3463 return NULL;
3464 3464
3465 case kSeqStringTag | kTwoByteStringTag: 3465 case kSeqStringTag | kTwoByteStringTag:
(...skipping 28 matching lines...) Expand all
3494 3494
3495 default: 3495 default:
3496 UNREACHABLE(); 3496 UNREACHABLE();
3497 return NULL; 3497 return NULL;
3498 } 3498 }
3499 } 3499 }
3500 } 3500 }
3501 3501
3502 3502
3503 uint16_t SeqOneByteString::SeqOneByteStringGet(int index) { 3503 uint16_t SeqOneByteString::SeqOneByteStringGet(int index) {
3504 ASSERT(index >= 0 && index < length()); 3504 DCHECK(index >= 0 && index < length());
3505 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); 3505 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
3506 } 3506 }
3507 3507
3508 3508
3509 void SeqOneByteString::SeqOneByteStringSet(int index, uint16_t value) { 3509 void SeqOneByteString::SeqOneByteStringSet(int index, uint16_t value) {
3510 ASSERT(index >= 0 && index < length() && value <= kMaxOneByteCharCode); 3510 DCHECK(index >= 0 && index < length() && value <= kMaxOneByteCharCode);
3511 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, 3511 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize,
3512 static_cast<byte>(value)); 3512 static_cast<byte>(value));
3513 } 3513 }
3514 3514
3515 3515
3516 Address SeqOneByteString::GetCharsAddress() { 3516 Address SeqOneByteString::GetCharsAddress() {
3517 return FIELD_ADDR(this, kHeaderSize); 3517 return FIELD_ADDR(this, kHeaderSize);
3518 } 3518 }
3519 3519
3520 3520
3521 uint8_t* SeqOneByteString::GetChars() { 3521 uint8_t* SeqOneByteString::GetChars() {
3522 return reinterpret_cast<uint8_t*>(GetCharsAddress()); 3522 return reinterpret_cast<uint8_t*>(GetCharsAddress());
3523 } 3523 }
3524 3524
3525 3525
3526 Address SeqTwoByteString::GetCharsAddress() { 3526 Address SeqTwoByteString::GetCharsAddress() {
3527 return FIELD_ADDR(this, kHeaderSize); 3527 return FIELD_ADDR(this, kHeaderSize);
3528 } 3528 }
3529 3529
3530 3530
3531 uc16* SeqTwoByteString::GetChars() { 3531 uc16* SeqTwoByteString::GetChars() {
3532 return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize)); 3532 return reinterpret_cast<uc16*>(FIELD_ADDR(this, kHeaderSize));
3533 } 3533 }
3534 3534
3535 3535
3536 uint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) { 3536 uint16_t SeqTwoByteString::SeqTwoByteStringGet(int index) {
3537 ASSERT(index >= 0 && index < length()); 3537 DCHECK(index >= 0 && index < length());
3538 return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize); 3538 return READ_SHORT_FIELD(this, kHeaderSize + index * kShortSize);
3539 } 3539 }
3540 3540
3541 3541
3542 void SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) { 3542 void SeqTwoByteString::SeqTwoByteStringSet(int index, uint16_t value) {
3543 ASSERT(index >= 0 && index < length()); 3543 DCHECK(index >= 0 && index < length());
3544 WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value); 3544 WRITE_SHORT_FIELD(this, kHeaderSize + index * kShortSize, value);
3545 } 3545 }
3546 3546
3547 3547
3548 int SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) { 3548 int SeqTwoByteString::SeqTwoByteStringSize(InstanceType instance_type) {
3549 return SizeFor(length()); 3549 return SizeFor(length());
3550 } 3550 }
3551 3551
3552 3552
3553 int SeqOneByteString::SeqOneByteStringSize(InstanceType instance_type) { 3553 int SeqOneByteString::SeqOneByteStringSize(InstanceType instance_type) {
3554 return SizeFor(length()); 3554 return SizeFor(length());
3555 } 3555 }
3556 3556
3557 3557
3558 String* SlicedString::parent() { 3558 String* SlicedString::parent() {
3559 return String::cast(READ_FIELD(this, kParentOffset)); 3559 return String::cast(READ_FIELD(this, kParentOffset));
3560 } 3560 }
3561 3561
3562 3562
3563 void SlicedString::set_parent(String* parent, WriteBarrierMode mode) { 3563 void SlicedString::set_parent(String* parent, WriteBarrierMode mode) {
3564 ASSERT(parent->IsSeqString() || parent->IsExternalString()); 3564 DCHECK(parent->IsSeqString() || parent->IsExternalString());
3565 WRITE_FIELD(this, kParentOffset, parent); 3565 WRITE_FIELD(this, kParentOffset, parent);
3566 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kParentOffset, parent, mode); 3566 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kParentOffset, parent, mode);
3567 } 3567 }
3568 3568
3569 3569
3570 SMI_ACCESSORS(SlicedString, offset, kOffsetOffset) 3570 SMI_ACCESSORS(SlicedString, offset, kOffsetOffset)
3571 3571
3572 3572
3573 String* ConsString::first() { 3573 String* ConsString::first() {
3574 return String::cast(READ_FIELD(this, kFirstOffset)); 3574 return String::cast(READ_FIELD(this, kFirstOffset));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3616 void ExternalAsciiString::update_data_cache() { 3616 void ExternalAsciiString::update_data_cache() {
3617 if (is_short()) return; 3617 if (is_short()) return;
3618 const char** data_field = 3618 const char** data_field =
3619 reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset)); 3619 reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset));
3620 *data_field = resource()->data(); 3620 *data_field = resource()->data();
3621 } 3621 }
3622 3622
3623 3623
3624 void ExternalAsciiString::set_resource( 3624 void ExternalAsciiString::set_resource(
3625 const ExternalAsciiString::Resource* resource) { 3625 const ExternalAsciiString::Resource* resource) {
3626 ASSERT(IsAligned(reinterpret_cast<intptr_t>(resource), kPointerSize)); 3626 DCHECK(IsAligned(reinterpret_cast<intptr_t>(resource), kPointerSize));
3627 *reinterpret_cast<const Resource**>( 3627 *reinterpret_cast<const Resource**>(
3628 FIELD_ADDR(this, kResourceOffset)) = resource; 3628 FIELD_ADDR(this, kResourceOffset)) = resource;
3629 if (resource != NULL) update_data_cache(); 3629 if (resource != NULL) update_data_cache();
3630 } 3630 }
3631 3631
3632 3632
3633 const uint8_t* ExternalAsciiString::GetChars() { 3633 const uint8_t* ExternalAsciiString::GetChars() {
3634 return reinterpret_cast<const uint8_t*>(resource()->data()); 3634 return reinterpret_cast<const uint8_t*>(resource()->data());
3635 } 3635 }
3636 3636
3637 3637
3638 uint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) { 3638 uint16_t ExternalAsciiString::ExternalAsciiStringGet(int index) {
3639 ASSERT(index >= 0 && index < length()); 3639 DCHECK(index >= 0 && index < length());
3640 return GetChars()[index]; 3640 return GetChars()[index];
3641 } 3641 }
3642 3642
3643 3643
3644 const ExternalTwoByteString::Resource* ExternalTwoByteString::resource() { 3644 const ExternalTwoByteString::Resource* ExternalTwoByteString::resource() {
3645 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)); 3645 return *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset));
3646 } 3646 }
3647 3647
3648 3648
3649 void ExternalTwoByteString::update_data_cache() { 3649 void ExternalTwoByteString::update_data_cache() {
(...skipping 11 matching lines...) Expand all
3661 if (resource != NULL) update_data_cache(); 3661 if (resource != NULL) update_data_cache();
3662 } 3662 }
3663 3663
3664 3664
3665 const uint16_t* ExternalTwoByteString::GetChars() { 3665 const uint16_t* ExternalTwoByteString::GetChars() {
3666 return resource()->data(); 3666 return resource()->data();
3667 } 3667 }
3668 3668
3669 3669
3670 uint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) { 3670 uint16_t ExternalTwoByteString::ExternalTwoByteStringGet(int index) {
3671 ASSERT(index >= 0 && index < length()); 3671 DCHECK(index >= 0 && index < length());
3672 return GetChars()[index]; 3672 return GetChars()[index];
3673 } 3673 }
3674 3674
3675 3675
3676 const uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData( 3676 const uint16_t* ExternalTwoByteString::ExternalTwoByteStringGetData(
3677 unsigned start) { 3677 unsigned start) {
3678 return GetChars() + start; 3678 return GetChars() + start;
3679 } 3679 }
3680 3680
3681 3681
(...skipping 12 matching lines...) Expand all
3694 frames_[(depth_-1) & kDepthMask] = string; 3694 frames_[(depth_-1) & kDepthMask] = string;
3695 } 3695 }
3696 3696
3697 3697
3698 void ConsStringIteratorOp::AdjustMaximumDepth() { 3698 void ConsStringIteratorOp::AdjustMaximumDepth() {
3699 if (depth_ > maximum_depth_) maximum_depth_ = depth_; 3699 if (depth_ > maximum_depth_) maximum_depth_ = depth_;
3700 } 3700 }
3701 3701
3702 3702
3703 void ConsStringIteratorOp::Pop() { 3703 void ConsStringIteratorOp::Pop() {
3704 ASSERT(depth_ > 0); 3704 DCHECK(depth_ > 0);
3705 ASSERT(depth_ <= maximum_depth_); 3705 DCHECK(depth_ <= maximum_depth_);
3706 depth_--; 3706 depth_--;
3707 } 3707 }
3708 3708
3709 3709
3710 uint16_t StringCharacterStream::GetNext() { 3710 uint16_t StringCharacterStream::GetNext() {
3711 ASSERT(buffer8_ != NULL && end_ != NULL); 3711 DCHECK(buffer8_ != NULL && end_ != NULL);
3712 // Advance cursor if needed. 3712 // Advance cursor if needed.
3713 if (buffer8_ == end_) HasMore(); 3713 if (buffer8_ == end_) HasMore();
3714 ASSERT(buffer8_ < end_); 3714 DCHECK(buffer8_ < end_);
3715 return is_one_byte_ ? *buffer8_++ : *buffer16_++; 3715 return is_one_byte_ ? *buffer8_++ : *buffer16_++;
3716 } 3716 }
3717 3717
3718 3718
3719 StringCharacterStream::StringCharacterStream(String* string, 3719 StringCharacterStream::StringCharacterStream(String* string,
3720 ConsStringIteratorOp* op, 3720 ConsStringIteratorOp* op,
3721 int offset) 3721 int offset)
3722 : is_one_byte_(false), 3722 : is_one_byte_(false),
3723 op_(op) { 3723 op_(op) {
3724 Reset(string, offset); 3724 Reset(string, offset);
3725 } 3725 }
3726 3726
3727 3727
3728 void StringCharacterStream::Reset(String* string, int offset) { 3728 void StringCharacterStream::Reset(String* string, int offset) {
3729 buffer8_ = NULL; 3729 buffer8_ = NULL;
3730 end_ = NULL; 3730 end_ = NULL;
3731 ConsString* cons_string = String::VisitFlat(this, string, offset); 3731 ConsString* cons_string = String::VisitFlat(this, string, offset);
3732 op_->Reset(cons_string, offset); 3732 op_->Reset(cons_string, offset);
3733 if (cons_string != NULL) { 3733 if (cons_string != NULL) {
3734 string = op_->Next(&offset); 3734 string = op_->Next(&offset);
3735 if (string != NULL) String::VisitFlat(this, string, offset); 3735 if (string != NULL) String::VisitFlat(this, string, offset);
3736 } 3736 }
3737 } 3737 }
3738 3738
3739 3739
3740 bool StringCharacterStream::HasMore() { 3740 bool StringCharacterStream::HasMore() {
3741 if (buffer8_ != end_) return true; 3741 if (buffer8_ != end_) return true;
3742 int offset; 3742 int offset;
3743 String* string = op_->Next(&offset); 3743 String* string = op_->Next(&offset);
3744 ASSERT_EQ(offset, 0); 3744 DCHECK_EQ(offset, 0);
3745 if (string == NULL) return false; 3745 if (string == NULL) return false;
3746 String::VisitFlat(this, string); 3746 String::VisitFlat(this, string);
3747 ASSERT(buffer8_ != end_); 3747 DCHECK(buffer8_ != end_);
3748 return true; 3748 return true;
3749 } 3749 }
3750 3750
3751 3751
3752 void StringCharacterStream::VisitOneByteString( 3752 void StringCharacterStream::VisitOneByteString(
3753 const uint8_t* chars, int length) { 3753 const uint8_t* chars, int length) {
3754 is_one_byte_ = true; 3754 is_one_byte_ = true;
3755 buffer8_ = chars; 3755 buffer8_ = chars;
3756 end_ = chars + length; 3756 end_ = chars + length;
3757 } 3757 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3795 return Smi::cast(get(kFingerIndex))->value(); 3795 return Smi::cast(get(kFingerIndex))->value();
3796 } 3796 }
3797 3797
3798 3798
3799 void JSFunctionResultCache::set_finger_index(int finger_index) { 3799 void JSFunctionResultCache::set_finger_index(int finger_index) {
3800 set(kFingerIndex, Smi::FromInt(finger_index)); 3800 set(kFingerIndex, Smi::FromInt(finger_index));
3801 } 3801 }
3802 3802
3803 3803
3804 byte ByteArray::get(int index) { 3804 byte ByteArray::get(int index) {
3805 ASSERT(index >= 0 && index < this->length()); 3805 DCHECK(index >= 0 && index < this->length());
3806 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); 3806 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
3807 } 3807 }
3808 3808
3809 3809
3810 void ByteArray::set(int index, byte value) { 3810 void ByteArray::set(int index, byte value) {
3811 ASSERT(index >= 0 && index < this->length()); 3811 DCHECK(index >= 0 && index < this->length());
3812 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value); 3812 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
3813 } 3813 }
3814 3814
3815 3815
3816 int ByteArray::get_int(int index) { 3816 int ByteArray::get_int(int index) {
3817 ASSERT(index >= 0 && (index * kIntSize) < this->length()); 3817 DCHECK(index >= 0 && (index * kIntSize) < this->length());
3818 return READ_INT_FIELD(this, kHeaderSize + index * kIntSize); 3818 return READ_INT_FIELD(this, kHeaderSize + index * kIntSize);
3819 } 3819 }
3820 3820
3821 3821
3822 ByteArray* ByteArray::FromDataStartAddress(Address address) { 3822 ByteArray* ByteArray::FromDataStartAddress(Address address) {
3823 ASSERT_TAG_ALIGNED(address); 3823 DCHECK_TAG_ALIGNED(address);
3824 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); 3824 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
3825 } 3825 }
3826 3826
3827 3827
3828 Address ByteArray::GetDataStartAddress() { 3828 Address ByteArray::GetDataStartAddress() {
3829 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; 3829 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
3830 } 3830 }
3831 3831
3832 3832
3833 uint8_t* ExternalUint8ClampedArray::external_uint8_clamped_pointer() { 3833 uint8_t* ExternalUint8ClampedArray::external_uint8_clamped_pointer() {
3834 return reinterpret_cast<uint8_t*>(external_pointer()); 3834 return reinterpret_cast<uint8_t*>(external_pointer());
3835 } 3835 }
3836 3836
3837 3837
3838 uint8_t ExternalUint8ClampedArray::get_scalar(int index) { 3838 uint8_t ExternalUint8ClampedArray::get_scalar(int index) {
3839 ASSERT((index >= 0) && (index < this->length())); 3839 DCHECK((index >= 0) && (index < this->length()));
3840 uint8_t* ptr = external_uint8_clamped_pointer(); 3840 uint8_t* ptr = external_uint8_clamped_pointer();
3841 return ptr[index]; 3841 return ptr[index];
3842 } 3842 }
3843 3843
3844 3844
3845 Handle<Object> ExternalUint8ClampedArray::get( 3845 Handle<Object> ExternalUint8ClampedArray::get(
3846 Handle<ExternalUint8ClampedArray> array, 3846 Handle<ExternalUint8ClampedArray> array,
3847 int index) { 3847 int index) {
3848 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)), 3848 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3849 array->GetIsolate()); 3849 array->GetIsolate());
3850 } 3850 }
3851 3851
3852 3852
3853 void ExternalUint8ClampedArray::set(int index, uint8_t value) { 3853 void ExternalUint8ClampedArray::set(int index, uint8_t value) {
3854 ASSERT((index >= 0) && (index < this->length())); 3854 DCHECK((index >= 0) && (index < this->length()));
3855 uint8_t* ptr = external_uint8_clamped_pointer(); 3855 uint8_t* ptr = external_uint8_clamped_pointer();
3856 ptr[index] = value; 3856 ptr[index] = value;
3857 } 3857 }
3858 3858
3859 3859
3860 void* ExternalArray::external_pointer() const { 3860 void* ExternalArray::external_pointer() const {
3861 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); 3861 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
3862 return reinterpret_cast<void*>(ptr); 3862 return reinterpret_cast<void*>(ptr);
3863 } 3863 }
3864 3864
3865 3865
3866 void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) { 3866 void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
3867 intptr_t ptr = reinterpret_cast<intptr_t>(value); 3867 intptr_t ptr = reinterpret_cast<intptr_t>(value);
3868 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); 3868 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
3869 } 3869 }
3870 3870
3871 3871
3872 int8_t ExternalInt8Array::get_scalar(int index) { 3872 int8_t ExternalInt8Array::get_scalar(int index) {
3873 ASSERT((index >= 0) && (index < this->length())); 3873 DCHECK((index >= 0) && (index < this->length()));
3874 int8_t* ptr = static_cast<int8_t*>(external_pointer()); 3874 int8_t* ptr = static_cast<int8_t*>(external_pointer());
3875 return ptr[index]; 3875 return ptr[index];
3876 } 3876 }
3877 3877
3878 3878
3879 Handle<Object> ExternalInt8Array::get(Handle<ExternalInt8Array> array, 3879 Handle<Object> ExternalInt8Array::get(Handle<ExternalInt8Array> array,
3880 int index) { 3880 int index) {
3881 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)), 3881 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3882 array->GetIsolate()); 3882 array->GetIsolate());
3883 } 3883 }
3884 3884
3885 3885
3886 void ExternalInt8Array::set(int index, int8_t value) { 3886 void ExternalInt8Array::set(int index, int8_t value) {
3887 ASSERT((index >= 0) && (index < this->length())); 3887 DCHECK((index >= 0) && (index < this->length()));
3888 int8_t* ptr = static_cast<int8_t*>(external_pointer()); 3888 int8_t* ptr = static_cast<int8_t*>(external_pointer());
3889 ptr[index] = value; 3889 ptr[index] = value;
3890 } 3890 }
3891 3891
3892 3892
3893 uint8_t ExternalUint8Array::get_scalar(int index) { 3893 uint8_t ExternalUint8Array::get_scalar(int index) {
3894 ASSERT((index >= 0) && (index < this->length())); 3894 DCHECK((index >= 0) && (index < this->length()));
3895 uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); 3895 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
3896 return ptr[index]; 3896 return ptr[index];
3897 } 3897 }
3898 3898
3899 3899
3900 Handle<Object> ExternalUint8Array::get(Handle<ExternalUint8Array> array, 3900 Handle<Object> ExternalUint8Array::get(Handle<ExternalUint8Array> array,
3901 int index) { 3901 int index) {
3902 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)), 3902 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3903 array->GetIsolate()); 3903 array->GetIsolate());
3904 } 3904 }
3905 3905
3906 3906
3907 void ExternalUint8Array::set(int index, uint8_t value) { 3907 void ExternalUint8Array::set(int index, uint8_t value) {
3908 ASSERT((index >= 0) && (index < this->length())); 3908 DCHECK((index >= 0) && (index < this->length()));
3909 uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); 3909 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
3910 ptr[index] = value; 3910 ptr[index] = value;
3911 } 3911 }
3912 3912
3913 3913
3914 int16_t ExternalInt16Array::get_scalar(int index) { 3914 int16_t ExternalInt16Array::get_scalar(int index) {
3915 ASSERT((index >= 0) && (index < this->length())); 3915 DCHECK((index >= 0) && (index < this->length()));
3916 int16_t* ptr = static_cast<int16_t*>(external_pointer()); 3916 int16_t* ptr = static_cast<int16_t*>(external_pointer());
3917 return ptr[index]; 3917 return ptr[index];
3918 } 3918 }
3919 3919
3920 3920
3921 Handle<Object> ExternalInt16Array::get(Handle<ExternalInt16Array> array, 3921 Handle<Object> ExternalInt16Array::get(Handle<ExternalInt16Array> array,
3922 int index) { 3922 int index) {
3923 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)), 3923 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3924 array->GetIsolate()); 3924 array->GetIsolate());
3925 } 3925 }
3926 3926
3927 3927
3928 void ExternalInt16Array::set(int index, int16_t value) { 3928 void ExternalInt16Array::set(int index, int16_t value) {
3929 ASSERT((index >= 0) && (index < this->length())); 3929 DCHECK((index >= 0) && (index < this->length()));
3930 int16_t* ptr = static_cast<int16_t*>(external_pointer()); 3930 int16_t* ptr = static_cast<int16_t*>(external_pointer());
3931 ptr[index] = value; 3931 ptr[index] = value;
3932 } 3932 }
3933 3933
3934 3934
3935 uint16_t ExternalUint16Array::get_scalar(int index) { 3935 uint16_t ExternalUint16Array::get_scalar(int index) {
3936 ASSERT((index >= 0) && (index < this->length())); 3936 DCHECK((index >= 0) && (index < this->length()));
3937 uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); 3937 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
3938 return ptr[index]; 3938 return ptr[index];
3939 } 3939 }
3940 3940
3941 3941
3942 Handle<Object> ExternalUint16Array::get(Handle<ExternalUint16Array> array, 3942 Handle<Object> ExternalUint16Array::get(Handle<ExternalUint16Array> array,
3943 int index) { 3943 int index) {
3944 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)), 3944 return Handle<Smi>(Smi::FromInt(array->get_scalar(index)),
3945 array->GetIsolate()); 3945 array->GetIsolate());
3946 } 3946 }
3947 3947
3948 3948
3949 void ExternalUint16Array::set(int index, uint16_t value) { 3949 void ExternalUint16Array::set(int index, uint16_t value) {
3950 ASSERT((index >= 0) && (index < this->length())); 3950 DCHECK((index >= 0) && (index < this->length()));
3951 uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); 3951 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
3952 ptr[index] = value; 3952 ptr[index] = value;
3953 } 3953 }
3954 3954
3955 3955
3956 int32_t ExternalInt32Array::get_scalar(int index) { 3956 int32_t ExternalInt32Array::get_scalar(int index) {
3957 ASSERT((index >= 0) && (index < this->length())); 3957 DCHECK((index >= 0) && (index < this->length()));
3958 int32_t* ptr = static_cast<int32_t*>(external_pointer()); 3958 int32_t* ptr = static_cast<int32_t*>(external_pointer());
3959 return ptr[index]; 3959 return ptr[index];
3960 } 3960 }
3961 3961
3962 3962
3963 Handle<Object> ExternalInt32Array::get(Handle<ExternalInt32Array> array, 3963 Handle<Object> ExternalInt32Array::get(Handle<ExternalInt32Array> array,
3964 int index) { 3964 int index) {
3965 return array->GetIsolate()->factory()-> 3965 return array->GetIsolate()->factory()->
3966 NewNumberFromInt(array->get_scalar(index)); 3966 NewNumberFromInt(array->get_scalar(index));
3967 } 3967 }
3968 3968
3969 3969
3970 void ExternalInt32Array::set(int index, int32_t value) { 3970 void ExternalInt32Array::set(int index, int32_t value) {
3971 ASSERT((index >= 0) && (index < this->length())); 3971 DCHECK((index >= 0) && (index < this->length()));
3972 int32_t* ptr = static_cast<int32_t*>(external_pointer()); 3972 int32_t* ptr = static_cast<int32_t*>(external_pointer());
3973 ptr[index] = value; 3973 ptr[index] = value;
3974 } 3974 }
3975 3975
3976 3976
3977 uint32_t ExternalUint32Array::get_scalar(int index) { 3977 uint32_t ExternalUint32Array::get_scalar(int index) {
3978 ASSERT((index >= 0) && (index < this->length())); 3978 DCHECK((index >= 0) && (index < this->length()));
3979 uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); 3979 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
3980 return ptr[index]; 3980 return ptr[index];
3981 } 3981 }
3982 3982
3983 3983
3984 Handle<Object> ExternalUint32Array::get(Handle<ExternalUint32Array> array, 3984 Handle<Object> ExternalUint32Array::get(Handle<ExternalUint32Array> array,
3985 int index) { 3985 int index) {
3986 return array->GetIsolate()->factory()-> 3986 return array->GetIsolate()->factory()->
3987 NewNumberFromUint(array->get_scalar(index)); 3987 NewNumberFromUint(array->get_scalar(index));
3988 } 3988 }
3989 3989
3990 3990
3991 void ExternalUint32Array::set(int index, uint32_t value) { 3991 void ExternalUint32Array::set(int index, uint32_t value) {
3992 ASSERT((index >= 0) && (index < this->length())); 3992 DCHECK((index >= 0) && (index < this->length()));
3993 uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); 3993 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
3994 ptr[index] = value; 3994 ptr[index] = value;
3995 } 3995 }
3996 3996
3997 3997
3998 float ExternalFloat32Array::get_scalar(int index) { 3998 float ExternalFloat32Array::get_scalar(int index) {
3999 ASSERT((index >= 0) && (index < this->length())); 3999 DCHECK((index >= 0) && (index < this->length()));
4000 float* ptr = static_cast<float*>(external_pointer()); 4000 float* ptr = static_cast<float*>(external_pointer());
4001 return ptr[index]; 4001 return ptr[index];
4002 } 4002 }
4003 4003
4004 4004
4005 Handle<Object> ExternalFloat32Array::get(Handle<ExternalFloat32Array> array, 4005 Handle<Object> ExternalFloat32Array::get(Handle<ExternalFloat32Array> array,
4006 int index) { 4006 int index) {
4007 return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index)); 4007 return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index));
4008 } 4008 }
4009 4009
4010 4010
4011 void ExternalFloat32Array::set(int index, float value) { 4011 void ExternalFloat32Array::set(int index, float value) {
4012 ASSERT((index >= 0) && (index < this->length())); 4012 DCHECK((index >= 0) && (index < this->length()));
4013 float* ptr = static_cast<float*>(external_pointer()); 4013 float* ptr = static_cast<float*>(external_pointer());
4014 ptr[index] = value; 4014 ptr[index] = value;
4015 } 4015 }
4016 4016
4017 4017
4018 double ExternalFloat64Array::get_scalar(int index) { 4018 double ExternalFloat64Array::get_scalar(int index) {
4019 ASSERT((index >= 0) && (index < this->length())); 4019 DCHECK((index >= 0) && (index < this->length()));
4020 double* ptr = static_cast<double*>(external_pointer()); 4020 double* ptr = static_cast<double*>(external_pointer());
4021 return ptr[index]; 4021 return ptr[index];
4022 } 4022 }
4023 4023
4024 4024
4025 Handle<Object> ExternalFloat64Array::get(Handle<ExternalFloat64Array> array, 4025 Handle<Object> ExternalFloat64Array::get(Handle<ExternalFloat64Array> array,
4026 int index) { 4026 int index) {
4027 return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index)); 4027 return array->GetIsolate()->factory()->NewNumber(array->get_scalar(index));
4028 } 4028 }
4029 4029
4030 4030
4031 void ExternalFloat64Array::set(int index, double value) { 4031 void ExternalFloat64Array::set(int index, double value) {
4032 ASSERT((index >= 0) && (index < this->length())); 4032 DCHECK((index >= 0) && (index < this->length()));
4033 double* ptr = static_cast<double*>(external_pointer()); 4033 double* ptr = static_cast<double*>(external_pointer());
4034 ptr[index] = value; 4034 ptr[index] = value;
4035 } 4035 }
4036 4036
4037 4037
4038 void* FixedTypedArrayBase::DataPtr() { 4038 void* FixedTypedArrayBase::DataPtr() {
4039 return FIELD_ADDR(this, kDataOffset); 4039 return FIELD_ADDR(this, kDataOffset);
4040 } 4040 }
4041 4041
4042 4042
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
4097 float Float32ArrayTraits::defaultValue() { 4097 float Float32ArrayTraits::defaultValue() {
4098 return static_cast<float>(base::OS::nan_value()); 4098 return static_cast<float>(base::OS::nan_value());
4099 } 4099 }
4100 4100
4101 4101
4102 double Float64ArrayTraits::defaultValue() { return base::OS::nan_value(); } 4102 double Float64ArrayTraits::defaultValue() { return base::OS::nan_value(); }
4103 4103
4104 4104
4105 template <class Traits> 4105 template <class Traits>
4106 typename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) { 4106 typename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) {
4107 ASSERT((index >= 0) && (index < this->length())); 4107 DCHECK((index >= 0) && (index < this->length()));
4108 ElementType* ptr = reinterpret_cast<ElementType*>( 4108 ElementType* ptr = reinterpret_cast<ElementType*>(
4109 FIELD_ADDR(this, kDataOffset)); 4109 FIELD_ADDR(this, kDataOffset));
4110 return ptr[index]; 4110 return ptr[index];
4111 } 4111 }
4112 4112
4113 4113
4114 template<> inline 4114 template<> inline
4115 FixedTypedArray<Float64ArrayTraits>::ElementType 4115 FixedTypedArray<Float64ArrayTraits>::ElementType
4116 FixedTypedArray<Float64ArrayTraits>::get_scalar(int index) { 4116 FixedTypedArray<Float64ArrayTraits>::get_scalar(int index) {
4117 ASSERT((index >= 0) && (index < this->length())); 4117 DCHECK((index >= 0) && (index < this->length()));
4118 return READ_DOUBLE_FIELD(this, ElementOffset(index)); 4118 return READ_DOUBLE_FIELD(this, ElementOffset(index));
4119 } 4119 }
4120 4120
4121 4121
4122 template <class Traits> 4122 template <class Traits>
4123 void FixedTypedArray<Traits>::set(int index, ElementType value) { 4123 void FixedTypedArray<Traits>::set(int index, ElementType value) {
4124 ASSERT((index >= 0) && (index < this->length())); 4124 DCHECK((index >= 0) && (index < this->length()));
4125 ElementType* ptr = reinterpret_cast<ElementType*>( 4125 ElementType* ptr = reinterpret_cast<ElementType*>(
4126 FIELD_ADDR(this, kDataOffset)); 4126 FIELD_ADDR(this, kDataOffset));
4127 ptr[index] = value; 4127 ptr[index] = value;
4128 } 4128 }
4129 4129
4130 4130
4131 template<> inline 4131 template<> inline
4132 void FixedTypedArray<Float64ArrayTraits>::set( 4132 void FixedTypedArray<Float64ArrayTraits>::set(
4133 int index, Float64ArrayTraits::ElementType value) { 4133 int index, Float64ArrayTraits::ElementType value) {
4134 ASSERT((index >= 0) && (index < this->length())); 4134 DCHECK((index >= 0) && (index < this->length()));
4135 WRITE_DOUBLE_FIELD(this, ElementOffset(index), value); 4135 WRITE_DOUBLE_FIELD(this, ElementOffset(index), value);
4136 } 4136 }
4137 4137
4138 4138
4139 template <class Traits> 4139 template <class Traits>
4140 typename Traits::ElementType FixedTypedArray<Traits>::from_int(int value) { 4140 typename Traits::ElementType FixedTypedArray<Traits>::from_int(int value) {
4141 return static_cast<ElementType>(value); 4141 return static_cast<ElementType>(value);
4142 } 4142 }
4143 4143
4144 4144
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
4194 if (index < static_cast<uint32_t>(array->length())) { 4194 if (index < static_cast<uint32_t>(array->length())) {
4195 if (value->IsSmi()) { 4195 if (value->IsSmi()) {
4196 int int_value = Handle<Smi>::cast(value)->value(); 4196 int int_value = Handle<Smi>::cast(value)->value();
4197 cast_value = from_int(int_value); 4197 cast_value = from_int(int_value);
4198 } else if (value->IsHeapNumber()) { 4198 } else if (value->IsHeapNumber()) {
4199 double double_value = Handle<HeapNumber>::cast(value)->value(); 4199 double double_value = Handle<HeapNumber>::cast(value)->value();
4200 cast_value = from_double(double_value); 4200 cast_value = from_double(double_value);
4201 } else { 4201 } else {
4202 // Clamp undefined to the default value. All other types have been 4202 // Clamp undefined to the default value. All other types have been
4203 // converted to a number type further up in the call chain. 4203 // converted to a number type further up in the call chain.
4204 ASSERT(value->IsUndefined()); 4204 DCHECK(value->IsUndefined());
4205 } 4205 }
4206 array->set(index, cast_value); 4206 array->set(index, cast_value);
4207 } 4207 }
4208 return Traits::ToHandle(array->GetIsolate(), cast_value); 4208 return Traits::ToHandle(array->GetIsolate(), cast_value);
4209 } 4209 }
4210 4210
4211 4211
4212 Handle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) { 4212 Handle<Object> Uint8ArrayTraits::ToHandle(Isolate* isolate, uint8_t scalar) {
4213 return handle(Smi::FromInt(scalar), isolate); 4213 return handle(Smi::FromInt(scalar), isolate);
4214 } 4214 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
4254 return isolate->factory()->NewNumber(scalar); 4254 return isolate->factory()->NewNumber(scalar);
4255 } 4255 }
4256 4256
4257 4257
4258 int Map::visitor_id() { 4258 int Map::visitor_id() {
4259 return READ_BYTE_FIELD(this, kVisitorIdOffset); 4259 return READ_BYTE_FIELD(this, kVisitorIdOffset);
4260 } 4260 }
4261 4261
4262 4262
4263 void Map::set_visitor_id(int id) { 4263 void Map::set_visitor_id(int id) {
4264 ASSERT(0 <= id && id < 256); 4264 DCHECK(0 <= id && id < 256);
4265 WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id)); 4265 WRITE_BYTE_FIELD(this, kVisitorIdOffset, static_cast<byte>(id));
4266 } 4266 }
4267 4267
4268 4268
4269 int Map::instance_size() { 4269 int Map::instance_size() {
4270 return NOBARRIER_READ_BYTE_FIELD( 4270 return NOBARRIER_READ_BYTE_FIELD(
4271 this, kInstanceSizeOffset) << kPointerSizeLog2; 4271 this, kInstanceSizeOffset) << kPointerSizeLog2;
4272 } 4272 }
4273 4273
4274 4274
4275 int Map::inobject_properties() { 4275 int Map::inobject_properties() {
4276 return READ_BYTE_FIELD(this, kInObjectPropertiesOffset); 4276 return READ_BYTE_FIELD(this, kInObjectPropertiesOffset);
4277 } 4277 }
4278 4278
4279 4279
4280 int Map::pre_allocated_property_fields() { 4280 int Map::pre_allocated_property_fields() {
4281 return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset); 4281 return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset);
4282 } 4282 }
4283 4283
4284 4284
4285 int Map::GetInObjectPropertyOffset(int index) { 4285 int Map::GetInObjectPropertyOffset(int index) {
4286 // Adjust for the number of properties stored in the object. 4286 // Adjust for the number of properties stored in the object.
4287 index -= inobject_properties(); 4287 index -= inobject_properties();
4288 ASSERT(index <= 0); 4288 DCHECK(index <= 0);
4289 return instance_size() + (index * kPointerSize); 4289 return instance_size() + (index * kPointerSize);
4290 } 4290 }
4291 4291
4292 4292
4293 int HeapObject::SizeFromMap(Map* map) { 4293 int HeapObject::SizeFromMap(Map* map) {
4294 int instance_size = map->instance_size(); 4294 int instance_size = map->instance_size();
4295 if (instance_size != kVariableSizeSentinel) return instance_size; 4295 if (instance_size != kVariableSizeSentinel) return instance_size;
4296 // Only inline the most frequent cases. 4296 // Only inline the most frequent cases.
4297 InstanceType instance_type = map->instance_type(); 4297 InstanceType instance_type = map->instance_type();
4298 if (instance_type == FIXED_ARRAY_TYPE) { 4298 if (instance_type == FIXED_ARRAY_TYPE) {
(...skipping 20 matching lines...) Expand all
4319 reinterpret_cast<FixedDoubleArray*>(this)->length()); 4319 reinterpret_cast<FixedDoubleArray*>(this)->length());
4320 } 4320 }
4321 if (instance_type == CONSTANT_POOL_ARRAY_TYPE) { 4321 if (instance_type == CONSTANT_POOL_ARRAY_TYPE) {
4322 return reinterpret_cast<ConstantPoolArray*>(this)->size(); 4322 return reinterpret_cast<ConstantPoolArray*>(this)->size();
4323 } 4323 }
4324 if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE && 4324 if (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
4325 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) { 4325 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE) {
4326 return reinterpret_cast<FixedTypedArrayBase*>( 4326 return reinterpret_cast<FixedTypedArrayBase*>(
4327 this)->TypedArraySize(instance_type); 4327 this)->TypedArraySize(instance_type);
4328 } 4328 }
4329 ASSERT(instance_type == CODE_TYPE); 4329 DCHECK(instance_type == CODE_TYPE);
4330 return reinterpret_cast<Code*>(this)->CodeSize(); 4330 return reinterpret_cast<Code*>(this)->CodeSize();
4331 } 4331 }
4332 4332
4333 4333
4334 void Map::set_instance_size(int value) { 4334 void Map::set_instance_size(int value) {
4335 ASSERT_EQ(0, value & (kPointerSize - 1)); 4335 DCHECK_EQ(0, value & (kPointerSize - 1));
4336 value >>= kPointerSizeLog2; 4336 value >>= kPointerSizeLog2;
4337 ASSERT(0 <= value && value < 256); 4337 DCHECK(0 <= value && value < 256);
4338 NOBARRIER_WRITE_BYTE_FIELD( 4338 NOBARRIER_WRITE_BYTE_FIELD(
4339 this, kInstanceSizeOffset, static_cast<byte>(value)); 4339 this, kInstanceSizeOffset, static_cast<byte>(value));
4340 } 4340 }
4341 4341
4342 4342
4343 void Map::set_inobject_properties(int value) { 4343 void Map::set_inobject_properties(int value) {
4344 ASSERT(0 <= value && value < 256); 4344 DCHECK(0 <= value && value < 256);
4345 WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value)); 4345 WRITE_BYTE_FIELD(this, kInObjectPropertiesOffset, static_cast<byte>(value));
4346 } 4346 }
4347 4347
4348 4348
4349 void Map::set_pre_allocated_property_fields(int value) { 4349 void Map::set_pre_allocated_property_fields(int value) {
4350 ASSERT(0 <= value && value < 256); 4350 DCHECK(0 <= value && value < 256);
4351 WRITE_BYTE_FIELD(this, 4351 WRITE_BYTE_FIELD(this,
4352 kPreAllocatedPropertyFieldsOffset, 4352 kPreAllocatedPropertyFieldsOffset,
4353 static_cast<byte>(value)); 4353 static_cast<byte>(value));
4354 } 4354 }
4355 4355
4356 4356
4357 InstanceType Map::instance_type() { 4357 InstanceType Map::instance_type() {
4358 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset)); 4358 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
4359 } 4359 }
4360 4360
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
4664 kind() == COMPARE_IC || kind() == COMPARE_NIL_IC || 4664 kind() == COMPARE_IC || kind() == COMPARE_NIL_IC ||
4665 kind() == TO_BOOLEAN_IC; 4665 kind() == TO_BOOLEAN_IC;
4666 } 4666 }
4667 4667
4668 4668
4669 InlineCacheState Code::ic_state() { 4669 InlineCacheState Code::ic_state() {
4670 InlineCacheState result = ExtractICStateFromFlags(flags()); 4670 InlineCacheState result = ExtractICStateFromFlags(flags());
4671 // Only allow uninitialized or debugger states for non-IC code 4671 // Only allow uninitialized or debugger states for non-IC code
4672 // objects. This is used in the debugger to determine whether or not 4672 // objects. This is used in the debugger to determine whether or not
4673 // a call to code object has been replaced with a debug break call. 4673 // a call to code object has been replaced with a debug break call.
4674 ASSERT(is_inline_cache_stub() || 4674 DCHECK(is_inline_cache_stub() ||
4675 result == UNINITIALIZED || 4675 result == UNINITIALIZED ||
4676 result == DEBUG_STUB); 4676 result == DEBUG_STUB);
4677 return result; 4677 return result;
4678 } 4678 }
4679 4679
4680 4680
4681 ExtraICState Code::extra_ic_state() { 4681 ExtraICState Code::extra_ic_state() {
4682 ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB); 4682 DCHECK(is_inline_cache_stub() || ic_state() == DEBUG_STUB);
4683 return ExtractExtraICStateFromFlags(flags()); 4683 return ExtractExtraICStateFromFlags(flags());
4684 } 4684 }
4685 4685
4686 4686
4687 Code::StubType Code::type() { 4687 Code::StubType Code::type() {
4688 return ExtractTypeFromFlags(flags()); 4688 return ExtractTypeFromFlags(flags());
4689 } 4689 }
4690 4690
4691 4691
4692 // For initialization. 4692 // For initialization.
(...skipping 19 matching lines...) Expand all
4712 4712
4713 4713
4714 inline void Code::set_is_crankshafted(bool value) { 4714 inline void Code::set_is_crankshafted(bool value) {
4715 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); 4715 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4716 int updated = IsCrankshaftedField::update(previous, value); 4716 int updated = IsCrankshaftedField::update(previous, value);
4717 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated); 4717 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4718 } 4718 }
4719 4719
4720 4720
4721 inline bool Code::is_turbofanned() { 4721 inline bool Code::is_turbofanned() {
4722 ASSERT(kind() == OPTIMIZED_FUNCTION || kind() == STUB); 4722 DCHECK(kind() == OPTIMIZED_FUNCTION || kind() == STUB);
4723 return IsTurbofannedField::decode( 4723 return IsTurbofannedField::decode(
4724 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset)); 4724 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4725 } 4725 }
4726 4726
4727 4727
4728 inline void Code::set_is_turbofanned(bool value) { 4728 inline void Code::set_is_turbofanned(bool value) {
4729 ASSERT(kind() == OPTIMIZED_FUNCTION || kind() == STUB); 4729 DCHECK(kind() == OPTIMIZED_FUNCTION || kind() == STUB);
4730 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); 4730 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4731 int updated = IsTurbofannedField::update(previous, value); 4731 int updated = IsTurbofannedField::update(previous, value);
4732 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); 4732 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4733 } 4733 }
4734 4734
4735 4735
4736 bool Code::optimizable() { 4736 bool Code::optimizable() {
4737 ASSERT_EQ(FUNCTION, kind()); 4737 DCHECK_EQ(FUNCTION, kind());
4738 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1; 4738 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1;
4739 } 4739 }
4740 4740
4741 4741
4742 void Code::set_optimizable(bool value) { 4742 void Code::set_optimizable(bool value) {
4743 ASSERT_EQ(FUNCTION, kind()); 4743 DCHECK_EQ(FUNCTION, kind());
4744 WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0); 4744 WRITE_BYTE_FIELD(this, kOptimizableOffset, value ? 1 : 0);
4745 } 4745 }
4746 4746
4747 4747
4748 bool Code::has_deoptimization_support() { 4748 bool Code::has_deoptimization_support() {
4749 ASSERT_EQ(FUNCTION, kind()); 4749 DCHECK_EQ(FUNCTION, kind());
4750 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 4750 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
4751 return FullCodeFlagsHasDeoptimizationSupportField::decode(flags); 4751 return FullCodeFlagsHasDeoptimizationSupportField::decode(flags);
4752 } 4752 }
4753 4753
4754 4754
4755 void Code::set_has_deoptimization_support(bool value) { 4755 void Code::set_has_deoptimization_support(bool value) {
4756 ASSERT_EQ(FUNCTION, kind()); 4756 DCHECK_EQ(FUNCTION, kind());
4757 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 4757 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
4758 flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value); 4758 flags = FullCodeFlagsHasDeoptimizationSupportField::update(flags, value);
4759 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags); 4759 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
4760 } 4760 }
4761 4761
4762 4762
4763 bool Code::has_debug_break_slots() { 4763 bool Code::has_debug_break_slots() {
4764 ASSERT_EQ(FUNCTION, kind()); 4764 DCHECK_EQ(FUNCTION, kind());
4765 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 4765 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
4766 return FullCodeFlagsHasDebugBreakSlotsField::decode(flags); 4766 return FullCodeFlagsHasDebugBreakSlotsField::decode(flags);
4767 } 4767 }
4768 4768
4769 4769
4770 void Code::set_has_debug_break_slots(bool value) { 4770 void Code::set_has_debug_break_slots(bool value) {
4771 ASSERT_EQ(FUNCTION, kind()); 4771 DCHECK_EQ(FUNCTION, kind());
4772 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 4772 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
4773 flags = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value); 4773 flags = FullCodeFlagsHasDebugBreakSlotsField::update(flags, value);
4774 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags); 4774 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
4775 } 4775 }
4776 4776
4777 4777
4778 bool Code::is_compiled_optimizable() { 4778 bool Code::is_compiled_optimizable() {
4779 ASSERT_EQ(FUNCTION, kind()); 4779 DCHECK_EQ(FUNCTION, kind());
4780 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 4780 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
4781 return FullCodeFlagsIsCompiledOptimizable::decode(flags); 4781 return FullCodeFlagsIsCompiledOptimizable::decode(flags);
4782 } 4782 }
4783 4783
4784 4784
4785 void Code::set_compiled_optimizable(bool value) { 4785 void Code::set_compiled_optimizable(bool value) {
4786 ASSERT_EQ(FUNCTION, kind()); 4786 DCHECK_EQ(FUNCTION, kind());
4787 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags); 4787 byte flags = READ_BYTE_FIELD(this, kFullCodeFlags);
4788 flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value); 4788 flags = FullCodeFlagsIsCompiledOptimizable::update(flags, value);
4789 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags); 4789 WRITE_BYTE_FIELD(this, kFullCodeFlags, flags);
4790 } 4790 }
4791 4791
4792 4792
4793 int Code::allow_osr_at_loop_nesting_level() { 4793 int Code::allow_osr_at_loop_nesting_level() {
4794 ASSERT_EQ(FUNCTION, kind()); 4794 DCHECK_EQ(FUNCTION, kind());
4795 int fields = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); 4795 int fields = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4796 return AllowOSRAtLoopNestingLevelField::decode(fields); 4796 return AllowOSRAtLoopNestingLevelField::decode(fields);
4797 } 4797 }
4798 4798
4799 4799
4800 void Code::set_allow_osr_at_loop_nesting_level(int level) { 4800 void Code::set_allow_osr_at_loop_nesting_level(int level) {
4801 ASSERT_EQ(FUNCTION, kind()); 4801 DCHECK_EQ(FUNCTION, kind());
4802 ASSERT(level >= 0 && level <= kMaxLoopNestingMarker); 4802 DCHECK(level >= 0 && level <= kMaxLoopNestingMarker);
4803 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); 4803 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4804 int updated = AllowOSRAtLoopNestingLevelField::update(previous, level); 4804 int updated = AllowOSRAtLoopNestingLevelField::update(previous, level);
4805 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated); 4805 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4806 } 4806 }
4807 4807
4808 4808
4809 int Code::profiler_ticks() { 4809 int Code::profiler_ticks() {
4810 ASSERT_EQ(FUNCTION, kind()); 4810 DCHECK_EQ(FUNCTION, kind());
4811 return READ_BYTE_FIELD(this, kProfilerTicksOffset); 4811 return READ_BYTE_FIELD(this, kProfilerTicksOffset);
4812 } 4812 }
4813 4813
4814 4814
4815 void Code::set_profiler_ticks(int ticks) { 4815 void Code::set_profiler_ticks(int ticks) {
4816 ASSERT_EQ(FUNCTION, kind()); 4816 DCHECK_EQ(FUNCTION, kind());
4817 ASSERT(ticks < 256); 4817 DCHECK(ticks < 256);
4818 WRITE_BYTE_FIELD(this, kProfilerTicksOffset, ticks); 4818 WRITE_BYTE_FIELD(this, kProfilerTicksOffset, ticks);
4819 } 4819 }
4820 4820
4821 4821
4822 int Code::builtin_index() { 4822 int Code::builtin_index() {
4823 ASSERT_EQ(BUILTIN, kind()); 4823 DCHECK_EQ(BUILTIN, kind());
4824 return READ_INT32_FIELD(this, kKindSpecificFlags1Offset); 4824 return READ_INT32_FIELD(this, kKindSpecificFlags1Offset);
4825 } 4825 }
4826 4826
4827 4827
4828 void Code::set_builtin_index(int index) { 4828 void Code::set_builtin_index(int index) {
4829 ASSERT_EQ(BUILTIN, kind()); 4829 DCHECK_EQ(BUILTIN, kind());
4830 WRITE_INT32_FIELD(this, kKindSpecificFlags1Offset, index); 4830 WRITE_INT32_FIELD(this, kKindSpecificFlags1Offset, index);
4831 } 4831 }
4832 4832
4833 4833
4834 unsigned Code::stack_slots() { 4834 unsigned Code::stack_slots() {
4835 ASSERT(is_crankshafted()); 4835 DCHECK(is_crankshafted());
4836 return StackSlotsField::decode( 4836 return StackSlotsField::decode(
4837 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset)); 4837 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4838 } 4838 }
4839 4839
4840 4840
4841 void Code::set_stack_slots(unsigned slots) { 4841 void Code::set_stack_slots(unsigned slots) {
4842 CHECK(slots <= (1 << kStackSlotsBitCount)); 4842 CHECK(slots <= (1 << kStackSlotsBitCount));
4843 ASSERT(is_crankshafted()); 4843 DCHECK(is_crankshafted());
4844 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); 4844 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4845 int updated = StackSlotsField::update(previous, slots); 4845 int updated = StackSlotsField::update(previous, slots);
4846 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); 4846 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4847 } 4847 }
4848 4848
4849 4849
4850 unsigned Code::safepoint_table_offset() { 4850 unsigned Code::safepoint_table_offset() {
4851 ASSERT(is_crankshafted()); 4851 DCHECK(is_crankshafted());
4852 return SafepointTableOffsetField::decode( 4852 return SafepointTableOffsetField::decode(
4853 READ_UINT32_FIELD(this, kKindSpecificFlags2Offset)); 4853 READ_UINT32_FIELD(this, kKindSpecificFlags2Offset));
4854 } 4854 }
4855 4855
4856 4856
4857 void Code::set_safepoint_table_offset(unsigned offset) { 4857 void Code::set_safepoint_table_offset(unsigned offset) {
4858 CHECK(offset <= (1 << kSafepointTableOffsetBitCount)); 4858 CHECK(offset <= (1 << kSafepointTableOffsetBitCount));
4859 ASSERT(is_crankshafted()); 4859 DCHECK(is_crankshafted());
4860 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize))); 4860 DCHECK(IsAligned(offset, static_cast<unsigned>(kIntSize)));
4861 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); 4861 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4862 int updated = SafepointTableOffsetField::update(previous, offset); 4862 int updated = SafepointTableOffsetField::update(previous, offset);
4863 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated); 4863 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4864 } 4864 }
4865 4865
4866 4866
4867 unsigned Code::back_edge_table_offset() { 4867 unsigned Code::back_edge_table_offset() {
4868 ASSERT_EQ(FUNCTION, kind()); 4868 DCHECK_EQ(FUNCTION, kind());
4869 return BackEdgeTableOffsetField::decode( 4869 return BackEdgeTableOffsetField::decode(
4870 READ_UINT32_FIELD(this, kKindSpecificFlags2Offset)) << kPointerSizeLog2; 4870 READ_UINT32_FIELD(this, kKindSpecificFlags2Offset)) << kPointerSizeLog2;
4871 } 4871 }
4872 4872
4873 4873
4874 void Code::set_back_edge_table_offset(unsigned offset) { 4874 void Code::set_back_edge_table_offset(unsigned offset) {
4875 ASSERT_EQ(FUNCTION, kind()); 4875 DCHECK_EQ(FUNCTION, kind());
4876 ASSERT(IsAligned(offset, static_cast<unsigned>(kPointerSize))); 4876 DCHECK(IsAligned(offset, static_cast<unsigned>(kPointerSize)));
4877 offset = offset >> kPointerSizeLog2; 4877 offset = offset >> kPointerSizeLog2;
4878 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); 4878 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4879 int updated = BackEdgeTableOffsetField::update(previous, offset); 4879 int updated = BackEdgeTableOffsetField::update(previous, offset);
4880 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated); 4880 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4881 } 4881 }
4882 4882
4883 4883
4884 bool Code::back_edges_patched_for_osr() { 4884 bool Code::back_edges_patched_for_osr() {
4885 ASSERT_EQ(FUNCTION, kind()); 4885 DCHECK_EQ(FUNCTION, kind());
4886 return allow_osr_at_loop_nesting_level() > 0; 4886 return allow_osr_at_loop_nesting_level() > 0;
4887 } 4887 }
4888 4888
4889 4889
4890 byte Code::to_boolean_state() { 4890 byte Code::to_boolean_state() {
4891 return extra_ic_state(); 4891 return extra_ic_state();
4892 } 4892 }
4893 4893
4894 4894
4895 bool Code::has_function_cache() { 4895 bool Code::has_function_cache() {
4896 ASSERT(kind() == STUB); 4896 DCHECK(kind() == STUB);
4897 return HasFunctionCacheField::decode( 4897 return HasFunctionCacheField::decode(
4898 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset)); 4898 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4899 } 4899 }
4900 4900
4901 4901
4902 void Code::set_has_function_cache(bool flag) { 4902 void Code::set_has_function_cache(bool flag) {
4903 ASSERT(kind() == STUB); 4903 DCHECK(kind() == STUB);
4904 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); 4904 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4905 int updated = HasFunctionCacheField::update(previous, flag); 4905 int updated = HasFunctionCacheField::update(previous, flag);
4906 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); 4906 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4907 } 4907 }
4908 4908
4909 4909
4910 bool Code::marked_for_deoptimization() { 4910 bool Code::marked_for_deoptimization() {
4911 ASSERT(kind() == OPTIMIZED_FUNCTION); 4911 DCHECK(kind() == OPTIMIZED_FUNCTION);
4912 return MarkedForDeoptimizationField::decode( 4912 return MarkedForDeoptimizationField::decode(
4913 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset)); 4913 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4914 } 4914 }
4915 4915
4916 4916
4917 void Code::set_marked_for_deoptimization(bool flag) { 4917 void Code::set_marked_for_deoptimization(bool flag) {
4918 ASSERT(kind() == OPTIMIZED_FUNCTION); 4918 DCHECK(kind() == OPTIMIZED_FUNCTION);
4919 ASSERT(!flag || AllowDeoptimization::IsAllowed(GetIsolate())); 4919 DCHECK(!flag || AllowDeoptimization::IsAllowed(GetIsolate()));
4920 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); 4920 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4921 int updated = MarkedForDeoptimizationField::update(previous, flag); 4921 int updated = MarkedForDeoptimizationField::update(previous, flag);
4922 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); 4922 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4923 } 4923 }
4924 4924
4925 4925
4926 bool Code::is_weak_stub() { 4926 bool Code::is_weak_stub() {
4927 return CanBeWeakStub() && WeakStubField::decode( 4927 return CanBeWeakStub() && WeakStubField::decode(
4928 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset)); 4928 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4929 } 4929 }
4930 4930
4931 4931
4932 void Code::mark_as_weak_stub() { 4932 void Code::mark_as_weak_stub() {
4933 ASSERT(CanBeWeakStub()); 4933 DCHECK(CanBeWeakStub());
4934 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); 4934 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4935 int updated = WeakStubField::update(previous, true); 4935 int updated = WeakStubField::update(previous, true);
4936 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); 4936 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4937 } 4937 }
4938 4938
4939 4939
4940 bool Code::is_invalidated_weak_stub() { 4940 bool Code::is_invalidated_weak_stub() {
4941 return is_weak_stub() && InvalidatedWeakStubField::decode( 4941 return is_weak_stub() && InvalidatedWeakStubField::decode(
4942 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset)); 4942 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4943 } 4943 }
4944 4944
4945 4945
4946 void Code::mark_as_invalidated_weak_stub() { 4946 void Code::mark_as_invalidated_weak_stub() {
4947 ASSERT(is_inline_cache_stub()); 4947 DCHECK(is_inline_cache_stub());
4948 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); 4948 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
4949 int updated = InvalidatedWeakStubField::update(previous, true); 4949 int updated = InvalidatedWeakStubField::update(previous, true);
4950 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated); 4950 WRITE_UINT32_FIELD(this, kKindSpecificFlags1Offset, updated);
4951 } 4951 }
4952 4952
4953 4953
4954 bool Code::is_inline_cache_stub() { 4954 bool Code::is_inline_cache_stub() {
4955 Kind kind = this->kind(); 4955 Kind kind = this->kind();
4956 switch (kind) { 4956 switch (kind) {
4957 #define CASE(name) case name: return true; 4957 #define CASE(name) case name: return true;
(...skipping 13 matching lines...) Expand all
4971 return ic_state() == DEBUG_STUB; 4971 return ic_state() == DEBUG_STUB;
4972 } 4972 }
4973 4973
4974 4974
4975 ConstantPoolArray* Code::constant_pool() { 4975 ConstantPoolArray* Code::constant_pool() {
4976 return ConstantPoolArray::cast(READ_FIELD(this, kConstantPoolOffset)); 4976 return ConstantPoolArray::cast(READ_FIELD(this, kConstantPoolOffset));
4977 } 4977 }
4978 4978
4979 4979
4980 void Code::set_constant_pool(Object* value) { 4980 void Code::set_constant_pool(Object* value) {
4981 ASSERT(value->IsConstantPoolArray()); 4981 DCHECK(value->IsConstantPoolArray());
4982 WRITE_FIELD(this, kConstantPoolOffset, value); 4982 WRITE_FIELD(this, kConstantPoolOffset, value);
4983 WRITE_BARRIER(GetHeap(), this, kConstantPoolOffset, value); 4983 WRITE_BARRIER(GetHeap(), this, kConstantPoolOffset, value);
4984 } 4984 }
4985 4985
4986 4986
4987 Code::Flags Code::ComputeFlags(Kind kind, InlineCacheState ic_state, 4987 Code::Flags Code::ComputeFlags(Kind kind, InlineCacheState ic_state,
4988 ExtraICState extra_ic_state, StubType type, 4988 ExtraICState extra_ic_state, StubType type,
4989 CacheHolderFlag holder) { 4989 CacheHolderFlag holder) {
4990 // Compute the bit mask. 4990 // Compute the bit mask.
4991 unsigned int bits = KindField::encode(kind) 4991 unsigned int bits = KindField::encode(kind)
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
5076 return FLAG_weak_embedded_objects_in_optimized_code; 5076 return FLAG_weak_embedded_objects_in_optimized_code;
5077 } 5077 }
5078 return false; 5078 return false;
5079 } 5079 }
5080 5080
5081 5081
5082 class Code::FindAndReplacePattern { 5082 class Code::FindAndReplacePattern {
5083 public: 5083 public:
5084 FindAndReplacePattern() : count_(0) { } 5084 FindAndReplacePattern() : count_(0) { }
5085 void Add(Handle<Map> map_to_find, Handle<Object> obj_to_replace) { 5085 void Add(Handle<Map> map_to_find, Handle<Object> obj_to_replace) {
5086 ASSERT(count_ < kMaxCount); 5086 DCHECK(count_ < kMaxCount);
5087 find_[count_] = map_to_find; 5087 find_[count_] = map_to_find;
5088 replace_[count_] = obj_to_replace; 5088 replace_[count_] = obj_to_replace;
5089 ++count_; 5089 ++count_;
5090 } 5090 }
5091 private: 5091 private:
5092 static const int kMaxCount = 4; 5092 static const int kMaxCount = 4;
5093 int count_; 5093 int count_;
5094 Handle<Map> find_[kMaxCount]; 5094 Handle<Map> find_[kMaxCount];
5095 Handle<Object> replace_[kMaxCount]; 5095 Handle<Object> replace_[kMaxCount];
5096 friend class Code; 5096 friend class Code;
5097 }; 5097 };
5098 5098
5099 5099
5100 bool Code::IsWeakObjectInIC(Object* object) { 5100 bool Code::IsWeakObjectInIC(Object* object) {
5101 return object->IsMap() && Map::cast(object)->CanTransition() && 5101 return object->IsMap() && Map::cast(object)->CanTransition() &&
5102 FLAG_collect_maps && 5102 FLAG_collect_maps &&
5103 FLAG_weak_embedded_maps_in_ic; 5103 FLAG_weak_embedded_maps_in_ic;
5104 } 5104 }
5105 5105
5106 5106
5107 Object* Map::prototype() const { 5107 Object* Map::prototype() const {
5108 return READ_FIELD(this, kPrototypeOffset); 5108 return READ_FIELD(this, kPrototypeOffset);
5109 } 5109 }
5110 5110
5111 5111
5112 void Map::set_prototype(Object* value, WriteBarrierMode mode) { 5112 void Map::set_prototype(Object* value, WriteBarrierMode mode) {
5113 ASSERT(value->IsNull() || value->IsJSReceiver()); 5113 DCHECK(value->IsNull() || value->IsJSReceiver());
5114 WRITE_FIELD(this, kPrototypeOffset, value); 5114 WRITE_FIELD(this, kPrototypeOffset, value);
5115 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode); 5115 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode);
5116 } 5116 }
5117 5117
5118 5118
5119 // If the descriptor is using the empty transition array, install a new empty 5119 // If the descriptor is using the empty transition array, install a new empty
5120 // transition array that will have place for an element transition. 5120 // transition array that will have place for an element transition.
5121 static void EnsureHasTransitionArray(Handle<Map> map) { 5121 static void EnsureHasTransitionArray(Handle<Map> map) {
5122 Handle<TransitionArray> transitions; 5122 Handle<TransitionArray> transitions;
5123 if (!map->HasTransitionArray()) { 5123 if (!map->HasTransitionArray()) {
(...skipping 27 matching lines...) Expand all
5151 5151
5152 5152
5153 uint32_t Map::bit_field3() { 5153 uint32_t Map::bit_field3() {
5154 return READ_UINT32_FIELD(this, kBitField3Offset); 5154 return READ_UINT32_FIELD(this, kBitField3Offset);
5155 } 5155 }
5156 5156
5157 5157
5158 void Map::AppendDescriptor(Descriptor* desc) { 5158 void Map::AppendDescriptor(Descriptor* desc) {
5159 DescriptorArray* descriptors = instance_descriptors(); 5159 DescriptorArray* descriptors = instance_descriptors();
5160 int number_of_own_descriptors = NumberOfOwnDescriptors(); 5160 int number_of_own_descriptors = NumberOfOwnDescriptors();
5161 ASSERT(descriptors->number_of_descriptors() == number_of_own_descriptors); 5161 DCHECK(descriptors->number_of_descriptors() == number_of_own_descriptors);
5162 descriptors->Append(desc); 5162 descriptors->Append(desc);
5163 SetNumberOfOwnDescriptors(number_of_own_descriptors + 1); 5163 SetNumberOfOwnDescriptors(number_of_own_descriptors + 1);
5164 } 5164 }
5165 5165
5166 5166
5167 Object* Map::GetBackPointer() { 5167 Object* Map::GetBackPointer() {
5168 Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset); 5168 Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset);
5169 if (object->IsDescriptorArray()) { 5169 if (object->IsDescriptorArray()) {
5170 return TransitionArray::cast(object)->back_pointer_storage(); 5170 return TransitionArray::cast(object)->back_pointer_storage();
5171 } else { 5171 } else {
5172 ASSERT(object->IsMap() || object->IsUndefined()); 5172 DCHECK(object->IsMap() || object->IsUndefined());
5173 return object; 5173 return object;
5174 } 5174 }
5175 } 5175 }
5176 5176
5177 5177
5178 bool Map::HasElementsTransition() { 5178 bool Map::HasElementsTransition() {
5179 return HasTransitionArray() && transitions()->HasElementsTransition(); 5179 return HasTransitionArray() && transitions()->HasElementsTransition();
5180 } 5180 }
5181 5181
5182 5182
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
5219 return transitions()->GetPrototypeTransitions(); 5219 return transitions()->GetPrototypeTransitions();
5220 } 5220 }
5221 5221
5222 5222
5223 void Map::SetPrototypeTransitions( 5223 void Map::SetPrototypeTransitions(
5224 Handle<Map> map, Handle<FixedArray> proto_transitions) { 5224 Handle<Map> map, Handle<FixedArray> proto_transitions) {
5225 EnsureHasTransitionArray(map); 5225 EnsureHasTransitionArray(map);
5226 int old_number_of_transitions = map->NumberOfProtoTransitions(); 5226 int old_number_of_transitions = map->NumberOfProtoTransitions();
5227 #ifdef DEBUG 5227 #ifdef DEBUG
5228 if (map->HasPrototypeTransitions()) { 5228 if (map->HasPrototypeTransitions()) {
5229 ASSERT(map->GetPrototypeTransitions() != *proto_transitions); 5229 DCHECK(map->GetPrototypeTransitions() != *proto_transitions);
5230 map->ZapPrototypeTransitions(); 5230 map->ZapPrototypeTransitions();
5231 } 5231 }
5232 #endif 5232 #endif
5233 map->transitions()->SetPrototypeTransitions(*proto_transitions); 5233 map->transitions()->SetPrototypeTransitions(*proto_transitions);
5234 map->SetNumberOfProtoTransitions(old_number_of_transitions); 5234 map->SetNumberOfProtoTransitions(old_number_of_transitions);
5235 } 5235 }
5236 5236
5237 5237
5238 bool Map::HasPrototypeTransitions() { 5238 bool Map::HasPrototypeTransitions() {
5239 return HasTransitionArray() && transitions()->HasPrototypeTransitions(); 5239 return HasTransitionArray() && transitions()->HasPrototypeTransitions();
5240 } 5240 }
5241 5241
5242 5242
5243 TransitionArray* Map::transitions() const { 5243 TransitionArray* Map::transitions() const {
5244 ASSERT(HasTransitionArray()); 5244 DCHECK(HasTransitionArray());
5245 Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset); 5245 Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset);
5246 return TransitionArray::cast(object); 5246 return TransitionArray::cast(object);
5247 } 5247 }
5248 5248
5249 5249
5250 void Map::set_transitions(TransitionArray* transition_array, 5250 void Map::set_transitions(TransitionArray* transition_array,
5251 WriteBarrierMode mode) { 5251 WriteBarrierMode mode) {
5252 // Transition arrays are not shared. When one is replaced, it should not 5252 // Transition arrays are not shared. When one is replaced, it should not
5253 // keep referenced objects alive, so we zap it. 5253 // keep referenced objects alive, so we zap it.
5254 // When there is another reference to the array somewhere (e.g. a handle), 5254 // When there is another reference to the array somewhere (e.g. a handle),
5255 // not zapping turns from a waste of memory into a source of crashes. 5255 // not zapping turns from a waste of memory into a source of crashes.
5256 if (HasTransitionArray()) { 5256 if (HasTransitionArray()) {
5257 #ifdef DEBUG 5257 #ifdef DEBUG
5258 for (int i = 0; i < transitions()->number_of_transitions(); i++) { 5258 for (int i = 0; i < transitions()->number_of_transitions(); i++) {
5259 Map* target = transitions()->GetTarget(i); 5259 Map* target = transitions()->GetTarget(i);
5260 if (target->instance_descriptors() == instance_descriptors()) { 5260 if (target->instance_descriptors() == instance_descriptors()) {
5261 Name* key = transitions()->GetKey(i); 5261 Name* key = transitions()->GetKey(i);
5262 int new_target_index = transition_array->Search(key); 5262 int new_target_index = transition_array->Search(key);
5263 ASSERT(new_target_index != TransitionArray::kNotFound); 5263 DCHECK(new_target_index != TransitionArray::kNotFound);
5264 ASSERT(transition_array->GetTarget(new_target_index) == target); 5264 DCHECK(transition_array->GetTarget(new_target_index) == target);
5265 } 5265 }
5266 } 5266 }
5267 #endif 5267 #endif
5268 ASSERT(transitions() != transition_array); 5268 DCHECK(transitions() != transition_array);
5269 ZapTransitions(); 5269 ZapTransitions();
5270 } 5270 }
5271 5271
5272 WRITE_FIELD(this, kTransitionsOrBackPointerOffset, transition_array); 5272 WRITE_FIELD(this, kTransitionsOrBackPointerOffset, transition_array);
5273 CONDITIONAL_WRITE_BARRIER( 5273 CONDITIONAL_WRITE_BARRIER(
5274 GetHeap(), this, kTransitionsOrBackPointerOffset, transition_array, mode); 5274 GetHeap(), this, kTransitionsOrBackPointerOffset, transition_array, mode);
5275 } 5275 }
5276 5276
5277 5277
5278 void Map::init_back_pointer(Object* undefined) { 5278 void Map::init_back_pointer(Object* undefined) {
5279 ASSERT(undefined->IsUndefined()); 5279 DCHECK(undefined->IsUndefined());
5280 WRITE_FIELD(this, kTransitionsOrBackPointerOffset, undefined); 5280 WRITE_FIELD(this, kTransitionsOrBackPointerOffset, undefined);
5281 } 5281 }
5282 5282
5283 5283
5284 void Map::SetBackPointer(Object* value, WriteBarrierMode mode) { 5284 void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
5285 ASSERT(instance_type() >= FIRST_JS_RECEIVER_TYPE); 5285 DCHECK(instance_type() >= FIRST_JS_RECEIVER_TYPE);
5286 ASSERT((value->IsUndefined() && GetBackPointer()->IsMap()) || 5286 DCHECK((value->IsUndefined() && GetBackPointer()->IsMap()) ||
5287 (value->IsMap() && GetBackPointer()->IsUndefined())); 5287 (value->IsMap() && GetBackPointer()->IsUndefined()));
5288 Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset); 5288 Object* object = READ_FIELD(this, kTransitionsOrBackPointerOffset);
5289 if (object->IsTransitionArray()) { 5289 if (object->IsTransitionArray()) {
5290 TransitionArray::cast(object)->set_back_pointer_storage(value); 5290 TransitionArray::cast(object)->set_back_pointer_storage(value);
5291 } else { 5291 } else {
5292 WRITE_FIELD(this, kTransitionsOrBackPointerOffset, value); 5292 WRITE_FIELD(this, kTransitionsOrBackPointerOffset, value);
5293 CONDITIONAL_WRITE_BARRIER( 5293 CONDITIONAL_WRITE_BARRIER(
5294 GetHeap(), this, kTransitionsOrBackPointerOffset, value, mode); 5294 GetHeap(), this, kTransitionsOrBackPointerOffset, value, mode);
5295 } 5295 }
5296 } 5296 }
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
5501 SMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset) 5501 SMI_ACCESSORS(SharedFunctionInfo, counters, kCountersOffset)
5502 SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset) 5502 SMI_ACCESSORS(SharedFunctionInfo, ast_node_count, kAstNodeCountOffset)
5503 SMI_ACCESSORS(SharedFunctionInfo, profiler_ticks, kProfilerTicksOffset) 5503 SMI_ACCESSORS(SharedFunctionInfo, profiler_ticks, kProfilerTicksOffset)
5504 5504
5505 #else 5505 #else
5506 5506
5507 #define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \ 5507 #define PSEUDO_SMI_ACCESSORS_LO(holder, name, offset) \
5508 STATIC_ASSERT(holder::offset % kPointerSize == 0); \ 5508 STATIC_ASSERT(holder::offset % kPointerSize == 0); \
5509 int holder::name() const { \ 5509 int holder::name() const { \
5510 int value = READ_INT_FIELD(this, offset); \ 5510 int value = READ_INT_FIELD(this, offset); \
5511 ASSERT(kHeapObjectTag == 1); \ 5511 DCHECK(kHeapObjectTag == 1); \
5512 ASSERT((value & kHeapObjectTag) == 0); \ 5512 DCHECK((value & kHeapObjectTag) == 0); \
5513 return value >> 1; \ 5513 return value >> 1; \
5514 } \ 5514 } \
5515 void holder::set_##name(int value) { \ 5515 void holder::set_##name(int value) { \
5516 ASSERT(kHeapObjectTag == 1); \ 5516 DCHECK(kHeapObjectTag == 1); \
5517 ASSERT((value & 0xC0000000) == 0xC0000000 || \ 5517 DCHECK((value & 0xC0000000) == 0xC0000000 || \
5518 (value & 0xC0000000) == 0x0); \ 5518 (value & 0xC0000000) == 0x0); \
5519 WRITE_INT_FIELD(this, \ 5519 WRITE_INT_FIELD(this, \
5520 offset, \ 5520 offset, \
5521 (value << 1) & ~kHeapObjectTag); \ 5521 (value << 1) & ~kHeapObjectTag); \
5522 } 5522 }
5523 5523
5524 #define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \ 5524 #define PSEUDO_SMI_ACCESSORS_HI(holder, name, offset) \
5525 STATIC_ASSERT(holder::offset % kPointerSize == kIntSize); \ 5525 STATIC_ASSERT(holder::offset % kPointerSize == kIntSize); \
5526 INT_ACCESSORS(holder, name, offset) 5526 INT_ACCESSORS(holder, name, offset)
5527 5527
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
5582 5582
5583 5583
5584 StrictMode SharedFunctionInfo::strict_mode() { 5584 StrictMode SharedFunctionInfo::strict_mode() {
5585 return BooleanBit::get(compiler_hints(), kStrictModeFunction) 5585 return BooleanBit::get(compiler_hints(), kStrictModeFunction)
5586 ? STRICT : SLOPPY; 5586 ? STRICT : SLOPPY;
5587 } 5587 }
5588 5588
5589 5589
5590 void SharedFunctionInfo::set_strict_mode(StrictMode strict_mode) { 5590 void SharedFunctionInfo::set_strict_mode(StrictMode strict_mode) {
5591 // We only allow mode transitions from sloppy to strict. 5591 // We only allow mode transitions from sloppy to strict.
5592 ASSERT(this->strict_mode() == SLOPPY || this->strict_mode() == strict_mode); 5592 DCHECK(this->strict_mode() == SLOPPY || this->strict_mode() == strict_mode);
5593 int hints = compiler_hints(); 5593 int hints = compiler_hints();
5594 hints = BooleanBit::set(hints, kStrictModeFunction, strict_mode == STRICT); 5594 hints = BooleanBit::set(hints, kStrictModeFunction, strict_mode == STRICT);
5595 set_compiler_hints(hints); 5595 set_compiler_hints(hints);
5596 } 5596 }
5597 5597
5598 5598
5599 BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative) 5599 BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, native, kNative)
5600 BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, inline_builtin, 5600 BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, inline_builtin,
5601 kInlineBuiltin) 5601 kInlineBuiltin)
5602 BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints, 5602 BOOL_ACCESSORS(SharedFunctionInfo, compiler_hints,
(...skipping 20 matching lines...) Expand all
5623 if (src_str->IsOneByteRepresentation()) { 5623 if (src_str->IsOneByteRepresentation()) {
5624 return ExternalAsciiString::cast(src)->resource() != NULL; 5624 return ExternalAsciiString::cast(src)->resource() != NULL;
5625 } else if (src_str->IsTwoByteRepresentation()) { 5625 } else if (src_str->IsTwoByteRepresentation()) {
5626 return ExternalTwoByteString::cast(src)->resource() != NULL; 5626 return ExternalTwoByteString::cast(src)->resource() != NULL;
5627 } 5627 }
5628 return true; 5628 return true;
5629 } 5629 }
5630 5630
5631 5631
5632 void SharedFunctionInfo::DontAdaptArguments() { 5632 void SharedFunctionInfo::DontAdaptArguments() {
5633 ASSERT(code()->kind() == Code::BUILTIN); 5633 DCHECK(code()->kind() == Code::BUILTIN);
5634 set_formal_parameter_count(kDontAdaptArgumentsSentinel); 5634 set_formal_parameter_count(kDontAdaptArgumentsSentinel);
5635 } 5635 }
5636 5636
5637 5637
5638 int SharedFunctionInfo::start_position() const { 5638 int SharedFunctionInfo::start_position() const {
5639 return start_position_and_type() >> kStartPositionShift; 5639 return start_position_and_type() >> kStartPositionShift;
5640 } 5640 }
5641 5641
5642 5642
5643 void SharedFunctionInfo::set_start_position(int start_position) { 5643 void SharedFunctionInfo::set_start_position(int start_position) {
5644 set_start_position_and_type((start_position << kStartPositionShift) 5644 set_start_position_and_type((start_position << kStartPositionShift)
5645 | (start_position_and_type() & ~kStartPositionMask)); 5645 | (start_position_and_type() & ~kStartPositionMask));
5646 } 5646 }
5647 5647
5648 5648
5649 Code* SharedFunctionInfo::code() const { 5649 Code* SharedFunctionInfo::code() const {
5650 return Code::cast(READ_FIELD(this, kCodeOffset)); 5650 return Code::cast(READ_FIELD(this, kCodeOffset));
5651 } 5651 }
5652 5652
5653 5653
5654 void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) { 5654 void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
5655 ASSERT(value->kind() != Code::OPTIMIZED_FUNCTION); 5655 DCHECK(value->kind() != Code::OPTIMIZED_FUNCTION);
5656 WRITE_FIELD(this, kCodeOffset, value); 5656 WRITE_FIELD(this, kCodeOffset, value);
5657 CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode); 5657 CONDITIONAL_WRITE_BARRIER(value->GetHeap(), this, kCodeOffset, value, mode);
5658 } 5658 }
5659 5659
5660 5660
5661 void SharedFunctionInfo::ReplaceCode(Code* value) { 5661 void SharedFunctionInfo::ReplaceCode(Code* value) {
5662 // If the GC metadata field is already used then the function was 5662 // If the GC metadata field is already used then the function was
5663 // enqueued as a code flushing candidate and we remove it now. 5663 // enqueued as a code flushing candidate and we remove it now.
5664 if (code()->gc_metadata() != NULL) { 5664 if (code()->gc_metadata() != NULL) {
5665 CodeFlusher* flusher = GetHeap()->mark_compact_collector()->code_flusher(); 5665 CodeFlusher* flusher = GetHeap()->mark_compact_collector()->code_flusher();
5666 flusher->EvictCandidate(this); 5666 flusher->EvictCandidate(this);
5667 } 5667 }
5668 5668
5669 ASSERT(code()->gc_metadata() == NULL && value->gc_metadata() == NULL); 5669 DCHECK(code()->gc_metadata() == NULL && value->gc_metadata() == NULL);
5670 5670
5671 set_code(value); 5671 set_code(value);
5672 } 5672 }
5673 5673
5674 5674
5675 ScopeInfo* SharedFunctionInfo::scope_info() const { 5675 ScopeInfo* SharedFunctionInfo::scope_info() const {
5676 return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset)); 5676 return reinterpret_cast<ScopeInfo*>(READ_FIELD(this, kScopeInfoOffset));
5677 } 5677 }
5678 5678
5679 5679
(...skipping 13 matching lines...) Expand all
5693 GetIsolate()->builtins()->builtin(Builtins::kCompileUnoptimized); 5693 GetIsolate()->builtins()->builtin(Builtins::kCompileUnoptimized);
5694 } 5694 }
5695 5695
5696 5696
5697 bool SharedFunctionInfo::IsApiFunction() { 5697 bool SharedFunctionInfo::IsApiFunction() {
5698 return function_data()->IsFunctionTemplateInfo(); 5698 return function_data()->IsFunctionTemplateInfo();
5699 } 5699 }
5700 5700
5701 5701
5702 FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() { 5702 FunctionTemplateInfo* SharedFunctionInfo::get_api_func_data() {
5703 ASSERT(IsApiFunction()); 5703 DCHECK(IsApiFunction());
5704 return FunctionTemplateInfo::cast(function_data()); 5704 return FunctionTemplateInfo::cast(function_data());
5705 } 5705 }
5706 5706
5707 5707
5708 bool SharedFunctionInfo::HasBuiltinFunctionId() { 5708 bool SharedFunctionInfo::HasBuiltinFunctionId() {
5709 return function_data()->IsSmi(); 5709 return function_data()->IsSmi();
5710 } 5710 }
5711 5711
5712 5712
5713 BuiltinFunctionId SharedFunctionInfo::builtin_function_id() { 5713 BuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
5714 ASSERT(HasBuiltinFunctionId()); 5714 DCHECK(HasBuiltinFunctionId());
5715 return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value()); 5715 return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value());
5716 } 5716 }
5717 5717
5718 5718
5719 int SharedFunctionInfo::ic_age() { 5719 int SharedFunctionInfo::ic_age() {
5720 return ICAgeBits::decode(counters()); 5720 return ICAgeBits::decode(counters());
5721 } 5721 }
5722 5722
5723 5723
5724 void SharedFunctionInfo::set_ic_age(int ic_age) { 5724 void SharedFunctionInfo::set_ic_age(int ic_age) {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
5794 5794
5795 bool JSFunction::IsBuiltin() { 5795 bool JSFunction::IsBuiltin() {
5796 return context()->global_object()->IsJSBuiltinsObject(); 5796 return context()->global_object()->IsJSBuiltinsObject();
5797 } 5797 }
5798 5798
5799 5799
5800 bool JSFunction::IsFromNativeScript() { 5800 bool JSFunction::IsFromNativeScript() {
5801 Object* script = shared()->script(); 5801 Object* script = shared()->script();
5802 bool native = script->IsScript() && 5802 bool native = script->IsScript() &&
5803 Script::cast(script)->type()->value() == Script::TYPE_NATIVE; 5803 Script::cast(script)->type()->value() == Script::TYPE_NATIVE;
5804 ASSERT(!IsBuiltin() || native); // All builtins are also native. 5804 DCHECK(!IsBuiltin() || native); // All builtins are also native.
5805 return native; 5805 return native;
5806 } 5806 }
5807 5807
5808 5808
5809 bool JSFunction::IsFromExtensionScript() { 5809 bool JSFunction::IsFromExtensionScript() {
5810 Object* script = shared()->script(); 5810 Object* script = shared()->script();
5811 return script->IsScript() && 5811 return script->IsScript() &&
5812 Script::cast(script)->type()->value() == Script::TYPE_EXTENSION; 5812 Script::cast(script)->type()->value() == Script::TYPE_EXTENSION;
5813 } 5813 }
5814 5814
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
5853 } 5853 }
5854 5854
5855 5855
5856 Code* JSFunction::code() { 5856 Code* JSFunction::code() {
5857 return Code::cast( 5857 return Code::cast(
5858 Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset))); 5858 Code::GetObjectFromEntryAddress(FIELD_ADDR(this, kCodeEntryOffset)));
5859 } 5859 }
5860 5860
5861 5861
5862 void JSFunction::set_code(Code* value) { 5862 void JSFunction::set_code(Code* value) {
5863 ASSERT(!GetHeap()->InNewSpace(value)); 5863 DCHECK(!GetHeap()->InNewSpace(value));
5864 Address entry = value->entry(); 5864 Address entry = value->entry();
5865 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry)); 5865 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
5866 GetHeap()->incremental_marking()->RecordWriteOfCodeEntry( 5866 GetHeap()->incremental_marking()->RecordWriteOfCodeEntry(
5867 this, 5867 this,
5868 HeapObject::RawField(this, kCodeEntryOffset), 5868 HeapObject::RawField(this, kCodeEntryOffset),
5869 value); 5869 value);
5870 } 5870 }
5871 5871
5872 5872
5873 void JSFunction::set_code_no_write_barrier(Code* value) { 5873 void JSFunction::set_code_no_write_barrier(Code* value) {
5874 ASSERT(!GetHeap()->InNewSpace(value)); 5874 DCHECK(!GetHeap()->InNewSpace(value));
5875 Address entry = value->entry(); 5875 Address entry = value->entry();
5876 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry)); 5876 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
5877 } 5877 }
5878 5878
5879 5879
5880 void JSFunction::ReplaceCode(Code* code) { 5880 void JSFunction::ReplaceCode(Code* code) {
5881 bool was_optimized = IsOptimized(); 5881 bool was_optimized = IsOptimized();
5882 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION; 5882 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
5883 5883
5884 if (was_optimized && is_optimized) { 5884 if (was_optimized && is_optimized) {
(...skipping 19 matching lines...) Expand all
5904 return Context::cast(READ_FIELD(this, kContextOffset)); 5904 return Context::cast(READ_FIELD(this, kContextOffset));
5905 } 5905 }
5906 5906
5907 5907
5908 JSObject* JSFunction::global_proxy() { 5908 JSObject* JSFunction::global_proxy() {
5909 return context()->global_proxy(); 5909 return context()->global_proxy();
5910 } 5910 }
5911 5911
5912 5912
5913 void JSFunction::set_context(Object* value) { 5913 void JSFunction::set_context(Object* value) {
5914 ASSERT(value->IsUndefined() || value->IsContext()); 5914 DCHECK(value->IsUndefined() || value->IsContext());
5915 WRITE_FIELD(this, kContextOffset, value); 5915 WRITE_FIELD(this, kContextOffset, value);
5916 WRITE_BARRIER(GetHeap(), this, kContextOffset, value); 5916 WRITE_BARRIER(GetHeap(), this, kContextOffset, value);
5917 } 5917 }
5918 5918
5919 ACCESSORS(JSFunction, prototype_or_initial_map, Object, 5919 ACCESSORS(JSFunction, prototype_or_initial_map, Object,
5920 kPrototypeOrInitialMapOffset) 5920 kPrototypeOrInitialMapOffset)
5921 5921
5922 5922
5923 Map* JSFunction::initial_map() { 5923 Map* JSFunction::initial_map() {
5924 return Map::cast(prototype_or_initial_map()); 5924 return Map::cast(prototype_or_initial_map());
(...skipping 14 matching lines...) Expand all
5939 return has_initial_map() || !prototype_or_initial_map()->IsTheHole(); 5939 return has_initial_map() || !prototype_or_initial_map()->IsTheHole();
5940 } 5940 }
5941 5941
5942 5942
5943 bool JSFunction::has_prototype() { 5943 bool JSFunction::has_prototype() {
5944 return map()->has_non_instance_prototype() || has_instance_prototype(); 5944 return map()->has_non_instance_prototype() || has_instance_prototype();
5945 } 5945 }
5946 5946
5947 5947
5948 Object* JSFunction::instance_prototype() { 5948 Object* JSFunction::instance_prototype() {
5949 ASSERT(has_instance_prototype()); 5949 DCHECK(has_instance_prototype());
5950 if (has_initial_map()) return initial_map()->prototype(); 5950 if (has_initial_map()) return initial_map()->prototype();
5951 // When there is no initial map and the prototype is a JSObject, the 5951 // When there is no initial map and the prototype is a JSObject, the
5952 // initial map field is used for the prototype field. 5952 // initial map field is used for the prototype field.
5953 return prototype_or_initial_map(); 5953 return prototype_or_initial_map();
5954 } 5954 }
5955 5955
5956 5956
5957 Object* JSFunction::prototype() { 5957 Object* JSFunction::prototype() {
5958 ASSERT(has_prototype()); 5958 DCHECK(has_prototype());
5959 // If the function's prototype property has been set to a non-JSObject 5959 // If the function's prototype property has been set to a non-JSObject
5960 // value, that value is stored in the constructor field of the map. 5960 // value, that value is stored in the constructor field of the map.
5961 if (map()->has_non_instance_prototype()) return map()->constructor(); 5961 if (map()->has_non_instance_prototype()) return map()->constructor();
5962 return instance_prototype(); 5962 return instance_prototype();
5963 } 5963 }
5964 5964
5965 5965
5966 bool JSFunction::should_have_prototype() { 5966 bool JSFunction::should_have_prototype() {
5967 return map()->function_with_prototype(); 5967 return map()->function_with_prototype();
5968 } 5968 }
5969 5969
5970 5970
5971 bool JSFunction::is_compiled() { 5971 bool JSFunction::is_compiled() {
5972 return code() != 5972 return code() !=
5973 GetIsolate()->builtins()->builtin(Builtins::kCompileUnoptimized); 5973 GetIsolate()->builtins()->builtin(Builtins::kCompileUnoptimized);
5974 } 5974 }
5975 5975
5976 5976
5977 FixedArray* JSFunction::literals() { 5977 FixedArray* JSFunction::literals() {
5978 ASSERT(!shared()->bound()); 5978 DCHECK(!shared()->bound());
5979 return literals_or_bindings(); 5979 return literals_or_bindings();
5980 } 5980 }
5981 5981
5982 5982
5983 void JSFunction::set_literals(FixedArray* literals) { 5983 void JSFunction::set_literals(FixedArray* literals) {
5984 ASSERT(!shared()->bound()); 5984 DCHECK(!shared()->bound());
5985 set_literals_or_bindings(literals); 5985 set_literals_or_bindings(literals);
5986 } 5986 }
5987 5987
5988 5988
5989 FixedArray* JSFunction::function_bindings() { 5989 FixedArray* JSFunction::function_bindings() {
5990 ASSERT(shared()->bound()); 5990 DCHECK(shared()->bound());
5991 return literals_or_bindings(); 5991 return literals_or_bindings();
5992 } 5992 }
5993 5993
5994 5994
5995 void JSFunction::set_function_bindings(FixedArray* bindings) { 5995 void JSFunction::set_function_bindings(FixedArray* bindings) {
5996 ASSERT(shared()->bound()); 5996 DCHECK(shared()->bound());
5997 // Bound function literal may be initialized to the empty fixed array 5997 // Bound function literal may be initialized to the empty fixed array
5998 // before the bindings are set. 5998 // before the bindings are set.
5999 ASSERT(bindings == GetHeap()->empty_fixed_array() || 5999 DCHECK(bindings == GetHeap()->empty_fixed_array() ||
6000 bindings->map() == GetHeap()->fixed_cow_array_map()); 6000 bindings->map() == GetHeap()->fixed_cow_array_map());
6001 set_literals_or_bindings(bindings); 6001 set_literals_or_bindings(bindings);
6002 } 6002 }
6003 6003
6004 6004
6005 int JSFunction::NumberOfLiterals() { 6005 int JSFunction::NumberOfLiterals() {
6006 ASSERT(!shared()->bound()); 6006 DCHECK(!shared()->bound());
6007 return literals()->length(); 6007 return literals()->length();
6008 } 6008 }
6009 6009
6010 6010
6011 Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) { 6011 Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
6012 ASSERT(id < kJSBuiltinsCount); // id is unsigned. 6012 DCHECK(id < kJSBuiltinsCount); // id is unsigned.
6013 return READ_FIELD(this, OffsetOfFunctionWithId(id)); 6013 return READ_FIELD(this, OffsetOfFunctionWithId(id));
6014 } 6014 }
6015 6015
6016 6016
6017 void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id, 6017 void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
6018 Object* value) { 6018 Object* value) {
6019 ASSERT(id < kJSBuiltinsCount); // id is unsigned. 6019 DCHECK(id < kJSBuiltinsCount); // id is unsigned.
6020 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value); 6020 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
6021 WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value); 6021 WRITE_BARRIER(GetHeap(), this, OffsetOfFunctionWithId(id), value);
6022 } 6022 }
6023 6023
6024 6024
6025 Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) { 6025 Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
6026 ASSERT(id < kJSBuiltinsCount); // id is unsigned. 6026 DCHECK(id < kJSBuiltinsCount); // id is unsigned.
6027 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id))); 6027 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
6028 } 6028 }
6029 6029
6030 6030
6031 void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id, 6031 void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
6032 Code* value) { 6032 Code* value) {
6033 ASSERT(id < kJSBuiltinsCount); // id is unsigned. 6033 DCHECK(id < kJSBuiltinsCount); // id is unsigned.
6034 WRITE_FIELD(this, OffsetOfCodeWithId(id), value); 6034 WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
6035 ASSERT(!GetHeap()->InNewSpace(value)); 6035 DCHECK(!GetHeap()->InNewSpace(value));
6036 } 6036 }
6037 6037
6038 6038
6039 ACCESSORS(JSProxy, handler, Object, kHandlerOffset) 6039 ACCESSORS(JSProxy, handler, Object, kHandlerOffset)
6040 ACCESSORS(JSProxy, hash, Object, kHashOffset) 6040 ACCESSORS(JSProxy, hash, Object, kHashOffset)
6041 ACCESSORS(JSFunctionProxy, call_trap, Object, kCallTrapOffset) 6041 ACCESSORS(JSFunctionProxy, call_trap, Object, kCallTrapOffset)
6042 ACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset) 6042 ACCESSORS(JSFunctionProxy, construct_trap, Object, kConstructTrapOffset)
6043 6043
6044 6044
6045 void JSProxy::InitializeBody(int object_size, Object* value) { 6045 void JSProxy::InitializeBody(int object_size, Object* value) {
6046 ASSERT(!value->IsHeapObject() || !GetHeap()->InNewSpace(value)); 6046 DCHECK(!value->IsHeapObject() || !GetHeap()->InNewSpace(value));
6047 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) { 6047 for (int offset = kHeaderSize; offset < object_size; offset += kPointerSize) {
6048 WRITE_FIELD(this, offset, value); 6048 WRITE_FIELD(this, offset, value);
6049 } 6049 }
6050 } 6050 }
6051 6051
6052 6052
6053 ACCESSORS(JSCollection, table, Object, kTableOffset) 6053 ACCESSORS(JSCollection, table, Object, kTableOffset)
6054 6054
6055 6055
6056 #define ORDERED_HASH_TABLE_ITERATOR_ACCESSORS(name, type, offset) \ 6056 #define ORDERED_HASH_TABLE_ITERATOR_ACCESSORS(name, type, offset) \
(...skipping 30 matching lines...) Expand all
6087 6087
6088 6088
6089 ACCESSORS(JSGeneratorObject, function, JSFunction, kFunctionOffset) 6089 ACCESSORS(JSGeneratorObject, function, JSFunction, kFunctionOffset)
6090 ACCESSORS(JSGeneratorObject, context, Context, kContextOffset) 6090 ACCESSORS(JSGeneratorObject, context, Context, kContextOffset)
6091 ACCESSORS(JSGeneratorObject, receiver, Object, kReceiverOffset) 6091 ACCESSORS(JSGeneratorObject, receiver, Object, kReceiverOffset)
6092 SMI_ACCESSORS(JSGeneratorObject, continuation, kContinuationOffset) 6092 SMI_ACCESSORS(JSGeneratorObject, continuation, kContinuationOffset)
6093 ACCESSORS(JSGeneratorObject, operand_stack, FixedArray, kOperandStackOffset) 6093 ACCESSORS(JSGeneratorObject, operand_stack, FixedArray, kOperandStackOffset)
6094 SMI_ACCESSORS(JSGeneratorObject, stack_handler_index, kStackHandlerIndexOffset) 6094 SMI_ACCESSORS(JSGeneratorObject, stack_handler_index, kStackHandlerIndexOffset)
6095 6095
6096 bool JSGeneratorObject::is_suspended() { 6096 bool JSGeneratorObject::is_suspended() {
6097 ASSERT_LT(kGeneratorExecuting, kGeneratorClosed); 6097 DCHECK_LT(kGeneratorExecuting, kGeneratorClosed);
6098 ASSERT_EQ(kGeneratorClosed, 0); 6098 DCHECK_EQ(kGeneratorClosed, 0);
6099 return continuation() > 0; 6099 return continuation() > 0;
6100 } 6100 }
6101 6101
6102 bool JSGeneratorObject::is_closed() { 6102 bool JSGeneratorObject::is_closed() {
6103 return continuation() == kGeneratorClosed; 6103 return continuation() == kGeneratorClosed;
6104 } 6104 }
6105 6105
6106 bool JSGeneratorObject::is_executing() { 6106 bool JSGeneratorObject::is_executing() {
6107 return continuation() == kGeneratorExecuting; 6107 return continuation() == kGeneratorExecuting;
6108 } 6108 }
6109 6109
6110 ACCESSORS(JSModule, context, Object, kContextOffset) 6110 ACCESSORS(JSModule, context, Object, kContextOffset)
6111 ACCESSORS(JSModule, scope_info, ScopeInfo, kScopeInfoOffset) 6111 ACCESSORS(JSModule, scope_info, ScopeInfo, kScopeInfoOffset)
6112 6112
6113 6113
6114 ACCESSORS(JSValue, value, Object, kValueOffset) 6114 ACCESSORS(JSValue, value, Object, kValueOffset)
6115 6115
6116 6116
6117 HeapNumber* HeapNumber::cast(Object* object) { 6117 HeapNumber* HeapNumber::cast(Object* object) {
6118 SLOW_ASSERT(object->IsHeapNumber() || object->IsMutableHeapNumber()); 6118 SLOW_DCHECK(object->IsHeapNumber() || object->IsMutableHeapNumber());
6119 return reinterpret_cast<HeapNumber*>(object); 6119 return reinterpret_cast<HeapNumber*>(object);
6120 } 6120 }
6121 6121
6122 6122
6123 const HeapNumber* HeapNumber::cast(const Object* object) { 6123 const HeapNumber* HeapNumber::cast(const Object* object) {
6124 SLOW_ASSERT(object->IsHeapNumber() || object->IsMutableHeapNumber()); 6124 SLOW_DCHECK(object->IsHeapNumber() || object->IsMutableHeapNumber());
6125 return reinterpret_cast<const HeapNumber*>(object); 6125 return reinterpret_cast<const HeapNumber*>(object);
6126 } 6126 }
6127 6127
6128 6128
6129 ACCESSORS(JSDate, value, Object, kValueOffset) 6129 ACCESSORS(JSDate, value, Object, kValueOffset)
6130 ACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset) 6130 ACCESSORS(JSDate, cache_stamp, Object, kCacheStampOffset)
6131 ACCESSORS(JSDate, year, Object, kYearOffset) 6131 ACCESSORS(JSDate, year, Object, kYearOffset)
6132 ACCESSORS(JSDate, month, Object, kMonthOffset) 6132 ACCESSORS(JSDate, month, Object, kMonthOffset)
6133 ACCESSORS(JSDate, day, Object, kDayOffset) 6133 ACCESSORS(JSDate, day, Object, kDayOffset)
6134 ACCESSORS(JSDate, weekday, Object, kWeekdayOffset) 6134 ACCESSORS(JSDate, weekday, Object, kWeekdayOffset)
(...skipping 25 matching lines...) Expand all
6160 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL); 6160 WRITE_FIELD(this, kDeoptimizationDataOffset, NULL);
6161 WRITE_FIELD(this, kConstantPoolOffset, NULL); 6161 WRITE_FIELD(this, kConstantPoolOffset, NULL);
6162 // Do not wipe out major/minor keys on a code stub or IC 6162 // Do not wipe out major/minor keys on a code stub or IC
6163 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) { 6163 if (!READ_FIELD(this, kTypeFeedbackInfoOffset)->IsSmi()) {
6164 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL); 6164 WRITE_FIELD(this, kTypeFeedbackInfoOffset, NULL);
6165 } 6165 }
6166 } 6166 }
6167 6167
6168 6168
6169 Object* Code::type_feedback_info() { 6169 Object* Code::type_feedback_info() {
6170 ASSERT(kind() == FUNCTION); 6170 DCHECK(kind() == FUNCTION);
6171 return raw_type_feedback_info(); 6171 return raw_type_feedback_info();
6172 } 6172 }
6173 6173
6174 6174
6175 void Code::set_type_feedback_info(Object* value, WriteBarrierMode mode) { 6175 void Code::set_type_feedback_info(Object* value, WriteBarrierMode mode) {
6176 ASSERT(kind() == FUNCTION); 6176 DCHECK(kind() == FUNCTION);
6177 set_raw_type_feedback_info(value, mode); 6177 set_raw_type_feedback_info(value, mode);
6178 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kTypeFeedbackInfoOffset, 6178 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kTypeFeedbackInfoOffset,
6179 value, mode); 6179 value, mode);
6180 } 6180 }
6181 6181
6182 6182
6183 uint32_t Code::stub_key() { 6183 uint32_t Code::stub_key() {
6184 ASSERT(IsCodeStubOrIC()); 6184 DCHECK(IsCodeStubOrIC());
6185 Smi* smi_key = Smi::cast(raw_type_feedback_info()); 6185 Smi* smi_key = Smi::cast(raw_type_feedback_info());
6186 return static_cast<uint32_t>(smi_key->value()); 6186 return static_cast<uint32_t>(smi_key->value());
6187 } 6187 }
6188 6188
6189 6189
6190 void Code::set_stub_key(uint32_t key) { 6190 void Code::set_stub_key(uint32_t key) {
6191 ASSERT(IsCodeStubOrIC()); 6191 DCHECK(IsCodeStubOrIC());
6192 set_raw_type_feedback_info(Smi::FromInt(key)); 6192 set_raw_type_feedback_info(Smi::FromInt(key));
6193 } 6193 }
6194 6194
6195 6195
6196 ACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset) 6196 ACCESSORS(Code, gc_metadata, Object, kGCMetadataOffset)
6197 INT_ACCESSORS(Code, ic_age, kICAgeOffset) 6197 INT_ACCESSORS(Code, ic_age, kICAgeOffset)
6198 6198
6199 6199
6200 byte* Code::instruction_start() { 6200 byte* Code::instruction_start() {
6201 return FIELD_ADDR(this, kHeaderSize); 6201 return FIELD_ADDR(this, kHeaderSize);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
6304 case IRREGEXP: 6304 case IRREGEXP:
6305 return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value(); 6305 return Smi::cast(DataAt(kIrregexpCaptureCountIndex))->value();
6306 default: 6306 default:
6307 UNREACHABLE(); 6307 UNREACHABLE();
6308 return -1; 6308 return -1;
6309 } 6309 }
6310 } 6310 }
6311 6311
6312 6312
6313 JSRegExp::Flags JSRegExp::GetFlags() { 6313 JSRegExp::Flags JSRegExp::GetFlags() {
6314 ASSERT(this->data()->IsFixedArray()); 6314 DCHECK(this->data()->IsFixedArray());
6315 Object* data = this->data(); 6315 Object* data = this->data();
6316 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex)); 6316 Smi* smi = Smi::cast(FixedArray::cast(data)->get(kFlagsIndex));
6317 return Flags(smi->value()); 6317 return Flags(smi->value());
6318 } 6318 }
6319 6319
6320 6320
6321 String* JSRegExp::Pattern() { 6321 String* JSRegExp::Pattern() {
6322 ASSERT(this->data()->IsFixedArray()); 6322 DCHECK(this->data()->IsFixedArray());
6323 Object* data = this->data(); 6323 Object* data = this->data();
6324 String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex)); 6324 String* pattern= String::cast(FixedArray::cast(data)->get(kSourceIndex));
6325 return pattern; 6325 return pattern;
6326 } 6326 }
6327 6327
6328 6328
6329 Object* JSRegExp::DataAt(int index) { 6329 Object* JSRegExp::DataAt(int index) {
6330 ASSERT(TypeTag() != NOT_COMPILED); 6330 DCHECK(TypeTag() != NOT_COMPILED);
6331 return FixedArray::cast(data())->get(index); 6331 return FixedArray::cast(data())->get(index);
6332 } 6332 }
6333 6333
6334 6334
6335 void JSRegExp::SetDataAt(int index, Object* value) { 6335 void JSRegExp::SetDataAt(int index, Object* value) {
6336 ASSERT(TypeTag() != NOT_COMPILED); 6336 DCHECK(TypeTag() != NOT_COMPILED);
6337 ASSERT(index >= kDataIndex); // Only implementation data can be set this way. 6337 DCHECK(index >= kDataIndex); // Only implementation data can be set this way.
6338 FixedArray::cast(data())->set(index, value); 6338 FixedArray::cast(data())->set(index, value);
6339 } 6339 }
6340 6340
6341 6341
6342 ElementsKind JSObject::GetElementsKind() { 6342 ElementsKind JSObject::GetElementsKind() {
6343 ElementsKind kind = map()->elements_kind(); 6343 ElementsKind kind = map()->elements_kind();
6344 #if DEBUG 6344 #if DEBUG
6345 FixedArrayBase* fixed_array = 6345 FixedArrayBase* fixed_array =
6346 reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset)); 6346 reinterpret_cast<FixedArrayBase*>(READ_FIELD(this, kElementsOffset));
6347 6347
6348 // If a GC was caused while constructing this object, the elements 6348 // If a GC was caused while constructing this object, the elements
6349 // pointer may point to a one pointer filler map. 6349 // pointer may point to a one pointer filler map.
6350 if (ElementsAreSafeToExamine()) { 6350 if (ElementsAreSafeToExamine()) {
6351 Map* map = fixed_array->map(); 6351 Map* map = fixed_array->map();
6352 ASSERT((IsFastSmiOrObjectElementsKind(kind) && 6352 DCHECK((IsFastSmiOrObjectElementsKind(kind) &&
6353 (map == GetHeap()->fixed_array_map() || 6353 (map == GetHeap()->fixed_array_map() ||
6354 map == GetHeap()->fixed_cow_array_map())) || 6354 map == GetHeap()->fixed_cow_array_map())) ||
6355 (IsFastDoubleElementsKind(kind) && 6355 (IsFastDoubleElementsKind(kind) &&
6356 (fixed_array->IsFixedDoubleArray() || 6356 (fixed_array->IsFixedDoubleArray() ||
6357 fixed_array == GetHeap()->empty_fixed_array())) || 6357 fixed_array == GetHeap()->empty_fixed_array())) ||
6358 (kind == DICTIONARY_ELEMENTS && 6358 (kind == DICTIONARY_ELEMENTS &&
6359 fixed_array->IsFixedArray() && 6359 fixed_array->IsFixedArray() &&
6360 fixed_array->IsDictionary()) || 6360 fixed_array->IsDictionary()) ||
6361 (kind > DICTIONARY_ELEMENTS)); 6361 (kind > DICTIONARY_ELEMENTS));
6362 ASSERT((kind != SLOPPY_ARGUMENTS_ELEMENTS) || 6362 DCHECK((kind != SLOPPY_ARGUMENTS_ELEMENTS) ||
6363 (elements()->IsFixedArray() && elements()->length() >= 2)); 6363 (elements()->IsFixedArray() && elements()->length() >= 2));
6364 } 6364 }
6365 #endif 6365 #endif
6366 return kind; 6366 return kind;
6367 } 6367 }
6368 6368
6369 6369
6370 ElementsAccessor* JSObject::GetElementsAccessor() { 6370 ElementsAccessor* JSObject::GetElementsAccessor() {
6371 return ElementsAccessor::ForKind(GetElementsKind()); 6371 return ElementsAccessor::ForKind(GetElementsKind());
6372 } 6372 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
6407 } 6407 }
6408 6408
6409 6409
6410 bool JSObject::HasSloppyArgumentsElements() { 6410 bool JSObject::HasSloppyArgumentsElements() {
6411 return GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS; 6411 return GetElementsKind() == SLOPPY_ARGUMENTS_ELEMENTS;
6412 } 6412 }
6413 6413
6414 6414
6415 bool JSObject::HasExternalArrayElements() { 6415 bool JSObject::HasExternalArrayElements() {
6416 HeapObject* array = elements(); 6416 HeapObject* array = elements();
6417 ASSERT(array != NULL); 6417 DCHECK(array != NULL);
6418 return array->IsExternalArray(); 6418 return array->IsExternalArray();
6419 } 6419 }
6420 6420
6421 6421
6422 #define EXTERNAL_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \ 6422 #define EXTERNAL_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \
6423 bool JSObject::HasExternal##Type##Elements() { \ 6423 bool JSObject::HasExternal##Type##Elements() { \
6424 HeapObject* array = elements(); \ 6424 HeapObject* array = elements(); \
6425 ASSERT(array != NULL); \ 6425 DCHECK(array != NULL); \
6426 if (!array->IsHeapObject()) \ 6426 if (!array->IsHeapObject()) \
6427 return false; \ 6427 return false; \
6428 return array->map()->instance_type() == EXTERNAL_##TYPE##_ARRAY_TYPE; \ 6428 return array->map()->instance_type() == EXTERNAL_##TYPE##_ARRAY_TYPE; \
6429 } 6429 }
6430 6430
6431 TYPED_ARRAYS(EXTERNAL_ELEMENTS_CHECK) 6431 TYPED_ARRAYS(EXTERNAL_ELEMENTS_CHECK)
6432 6432
6433 #undef EXTERNAL_ELEMENTS_CHECK 6433 #undef EXTERNAL_ELEMENTS_CHECK
6434 6434
6435 6435
6436 bool JSObject::HasFixedTypedArrayElements() { 6436 bool JSObject::HasFixedTypedArrayElements() {
6437 HeapObject* array = elements(); 6437 HeapObject* array = elements();
6438 ASSERT(array != NULL); 6438 DCHECK(array != NULL);
6439 return array->IsFixedTypedArrayBase(); 6439 return array->IsFixedTypedArrayBase();
6440 } 6440 }
6441 6441
6442 6442
6443 #define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \ 6443 #define FIXED_TYPED_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \
6444 bool JSObject::HasFixed##Type##Elements() { \ 6444 bool JSObject::HasFixed##Type##Elements() { \
6445 HeapObject* array = elements(); \ 6445 HeapObject* array = elements(); \
6446 ASSERT(array != NULL); \ 6446 DCHECK(array != NULL); \
6447 if (!array->IsHeapObject()) \ 6447 if (!array->IsHeapObject()) \
6448 return false; \ 6448 return false; \
6449 return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \ 6449 return array->map()->instance_type() == FIXED_##TYPE##_ARRAY_TYPE; \
6450 } 6450 }
6451 6451
6452 TYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK) 6452 TYPED_ARRAYS(FIXED_TYPED_ELEMENTS_CHECK)
6453 6453
6454 #undef FIXED_TYPED_ELEMENTS_CHECK 6454 #undef FIXED_TYPED_ELEMENTS_CHECK
6455 6455
6456 6456
6457 bool JSObject::HasNamedInterceptor() { 6457 bool JSObject::HasNamedInterceptor() {
6458 return map()->has_named_interceptor(); 6458 return map()->has_named_interceptor();
6459 } 6459 }
6460 6460
6461 6461
6462 bool JSObject::HasIndexedInterceptor() { 6462 bool JSObject::HasIndexedInterceptor() {
6463 return map()->has_indexed_interceptor(); 6463 return map()->has_indexed_interceptor();
6464 } 6464 }
6465 6465
6466 6466
6467 NameDictionary* JSObject::property_dictionary() { 6467 NameDictionary* JSObject::property_dictionary() {
6468 ASSERT(!HasFastProperties()); 6468 DCHECK(!HasFastProperties());
6469 return NameDictionary::cast(properties()); 6469 return NameDictionary::cast(properties());
6470 } 6470 }
6471 6471
6472 6472
6473 SeededNumberDictionary* JSObject::element_dictionary() { 6473 SeededNumberDictionary* JSObject::element_dictionary() {
6474 ASSERT(HasDictionaryElements()); 6474 DCHECK(HasDictionaryElements());
6475 return SeededNumberDictionary::cast(elements()); 6475 return SeededNumberDictionary::cast(elements());
6476 } 6476 }
6477 6477
6478 6478
6479 bool Name::IsHashFieldComputed(uint32_t field) { 6479 bool Name::IsHashFieldComputed(uint32_t field) {
6480 return (field & kHashNotComputedMask) == 0; 6480 return (field & kHashNotComputedMask) == 0;
6481 } 6481 }
6482 6482
6483 6483
6484 bool Name::HasHashCode() { 6484 bool Name::HasHashCode() {
6485 return IsHashFieldComputed(hash_field()); 6485 return IsHashFieldComputed(hash_field());
6486 } 6486 }
6487 6487
6488 6488
6489 uint32_t Name::Hash() { 6489 uint32_t Name::Hash() {
6490 // Fast case: has hash code already been computed? 6490 // Fast case: has hash code already been computed?
6491 uint32_t field = hash_field(); 6491 uint32_t field = hash_field();
6492 if (IsHashFieldComputed(field)) return field >> kHashShift; 6492 if (IsHashFieldComputed(field)) return field >> kHashShift;
6493 // Slow case: compute hash code and set it. Has to be a string. 6493 // Slow case: compute hash code and set it. Has to be a string.
6494 return String::cast(this)->ComputeAndSetHash(); 6494 return String::cast(this)->ComputeAndSetHash();
6495 } 6495 }
6496 6496
6497 6497
6498 StringHasher::StringHasher(int length, uint32_t seed) 6498 StringHasher::StringHasher(int length, uint32_t seed)
6499 : length_(length), 6499 : length_(length),
6500 raw_running_hash_(seed), 6500 raw_running_hash_(seed),
6501 array_index_(0), 6501 array_index_(0),
6502 is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize), 6502 is_array_index_(0 < length_ && length_ <= String::kMaxArrayIndexSize),
6503 is_first_char_(true) { 6503 is_first_char_(true) {
6504 ASSERT(FLAG_randomize_hashes || raw_running_hash_ == 0); 6504 DCHECK(FLAG_randomize_hashes || raw_running_hash_ == 0);
6505 } 6505 }
6506 6506
6507 6507
6508 bool StringHasher::has_trivial_hash() { 6508 bool StringHasher::has_trivial_hash() {
6509 return length_ > String::kMaxHashCalcLength; 6509 return length_ > String::kMaxHashCalcLength;
6510 } 6510 }
6511 6511
6512 6512
6513 uint32_t StringHasher::AddCharacterCore(uint32_t running_hash, uint16_t c) { 6513 uint32_t StringHasher::AddCharacterCore(uint32_t running_hash, uint16_t c) {
6514 running_hash += c; 6514 running_hash += c;
(...skipping 15 matching lines...) Expand all
6530 6530
6531 6531
6532 void StringHasher::AddCharacter(uint16_t c) { 6532 void StringHasher::AddCharacter(uint16_t c) {
6533 // Use the Jenkins one-at-a-time hash function to update the hash 6533 // Use the Jenkins one-at-a-time hash function to update the hash
6534 // for the given character. 6534 // for the given character.
6535 raw_running_hash_ = AddCharacterCore(raw_running_hash_, c); 6535 raw_running_hash_ = AddCharacterCore(raw_running_hash_, c);
6536 } 6536 }
6537 6537
6538 6538
6539 bool StringHasher::UpdateIndex(uint16_t c) { 6539 bool StringHasher::UpdateIndex(uint16_t c) {
6540 ASSERT(is_array_index_); 6540 DCHECK(is_array_index_);
6541 if (c < '0' || c > '9') { 6541 if (c < '0' || c > '9') {
6542 is_array_index_ = false; 6542 is_array_index_ = false;
6543 return false; 6543 return false;
6544 } 6544 }
6545 int d = c - '0'; 6545 int d = c - '0';
6546 if (is_first_char_) { 6546 if (is_first_char_) {
6547 is_first_char_ = false; 6547 is_first_char_ = false;
6548 if (c == '0' && length_ > 1) { 6548 if (c == '0' && length_ > 1) {
6549 is_array_index_ = false; 6549 is_array_index_ = false;
6550 return false; 6550 return false;
6551 } 6551 }
6552 } 6552 }
6553 if (array_index_ > 429496729U - ((d + 2) >> 3)) { 6553 if (array_index_ > 429496729U - ((d + 2) >> 3)) {
6554 is_array_index_ = false; 6554 is_array_index_ = false;
6555 return false; 6555 return false;
6556 } 6556 }
6557 array_index_ = array_index_ * 10 + d; 6557 array_index_ = array_index_ * 10 + d;
6558 return true; 6558 return true;
6559 } 6559 }
6560 6560
6561 6561
6562 template<typename Char> 6562 template<typename Char>
6563 inline void StringHasher::AddCharacters(const Char* chars, int length) { 6563 inline void StringHasher::AddCharacters(const Char* chars, int length) {
6564 ASSERT(sizeof(Char) == 1 || sizeof(Char) == 2); 6564 DCHECK(sizeof(Char) == 1 || sizeof(Char) == 2);
6565 int i = 0; 6565 int i = 0;
6566 if (is_array_index_) { 6566 if (is_array_index_) {
6567 for (; i < length; i++) { 6567 for (; i < length; i++) {
6568 AddCharacter(chars[i]); 6568 AddCharacter(chars[i]);
6569 if (!UpdateIndex(chars[i])) { 6569 if (!UpdateIndex(chars[i])) {
6570 i++; 6570 i++;
6571 break; 6571 break;
6572 } 6572 }
6573 } 6573 }
6574 } 6574 }
6575 for (; i < length; i++) { 6575 for (; i < length; i++) {
6576 ASSERT(!is_array_index_); 6576 DCHECK(!is_array_index_);
6577 AddCharacter(chars[i]); 6577 AddCharacter(chars[i]);
6578 } 6578 }
6579 } 6579 }
6580 6580
6581 6581
6582 template <typename schar> 6582 template <typename schar>
6583 uint32_t StringHasher::HashSequentialString(const schar* chars, 6583 uint32_t StringHasher::HashSequentialString(const schar* chars,
6584 int length, 6584 int length,
6585 uint32_t seed) { 6585 uint32_t seed) {
6586 StringHasher hasher(length, seed); 6586 StringHasher hasher(length, seed);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
6626 bool String::AsArrayIndex(uint32_t* index) { 6626 bool String::AsArrayIndex(uint32_t* index) {
6627 uint32_t field = hash_field(); 6627 uint32_t field = hash_field();
6628 if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) { 6628 if (IsHashFieldComputed(field) && (field & kIsNotArrayIndexMask)) {
6629 return false; 6629 return false;
6630 } 6630 }
6631 return SlowAsArrayIndex(index); 6631 return SlowAsArrayIndex(index);
6632 } 6632 }
6633 6633
6634 6634
6635 void String::SetForwardedInternalizedString(String* canonical) { 6635 void String::SetForwardedInternalizedString(String* canonical) {
6636 ASSERT(IsInternalizedString()); 6636 DCHECK(IsInternalizedString());
6637 ASSERT(HasHashCode()); 6637 DCHECK(HasHashCode());
6638 if (canonical == this) return; // No need to forward. 6638 if (canonical == this) return; // No need to forward.
6639 ASSERT(SlowEquals(canonical)); 6639 DCHECK(SlowEquals(canonical));
6640 ASSERT(canonical->IsInternalizedString()); 6640 DCHECK(canonical->IsInternalizedString());
6641 ASSERT(canonical->HasHashCode()); 6641 DCHECK(canonical->HasHashCode());
6642 WRITE_FIELD(this, kHashFieldOffset, canonical); 6642 WRITE_FIELD(this, kHashFieldOffset, canonical);
6643 // Setting the hash field to a tagged value sets the LSB, causing the hash 6643 // Setting the hash field to a tagged value sets the LSB, causing the hash
6644 // code to be interpreted as uninitialized. We use this fact to recognize 6644 // code to be interpreted as uninitialized. We use this fact to recognize
6645 // that we have a forwarded string. 6645 // that we have a forwarded string.
6646 ASSERT(!HasHashCode()); 6646 DCHECK(!HasHashCode());
6647 } 6647 }
6648 6648
6649 6649
6650 String* String::GetForwardedInternalizedString() { 6650 String* String::GetForwardedInternalizedString() {
6651 ASSERT(IsInternalizedString()); 6651 DCHECK(IsInternalizedString());
6652 if (HasHashCode()) return this; 6652 if (HasHashCode()) return this;
6653 String* canonical = String::cast(READ_FIELD(this, kHashFieldOffset)); 6653 String* canonical = String::cast(READ_FIELD(this, kHashFieldOffset));
6654 ASSERT(canonical->IsInternalizedString()); 6654 DCHECK(canonical->IsInternalizedString());
6655 ASSERT(SlowEquals(canonical)); 6655 DCHECK(SlowEquals(canonical));
6656 ASSERT(canonical->HasHashCode()); 6656 DCHECK(canonical->HasHashCode());
6657 return canonical; 6657 return canonical;
6658 } 6658 }
6659 6659
6660 6660
6661 Object* JSReceiver::GetConstructor() { 6661 Object* JSReceiver::GetConstructor() {
6662 return map()->constructor(); 6662 return map()->constructor();
6663 } 6663 }
6664 6664
6665 6665
6666 Maybe<bool> JSReceiver::HasProperty(Handle<JSReceiver> object, 6666 Maybe<bool> JSReceiver::HasProperty(Handle<JSReceiver> object,
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
6820 Handle<Object> value) { 6820 Handle<Object> value) {
6821 SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0))); 6821 SetEntry(entry, key, value, PropertyDetails(Smi::FromInt(0)));
6822 } 6822 }
6823 6823
6824 6824
6825 template<typename Derived, typename Shape, typename Key> 6825 template<typename Derived, typename Shape, typename Key>
6826 void Dictionary<Derived, Shape, Key>::SetEntry(int entry, 6826 void Dictionary<Derived, Shape, Key>::SetEntry(int entry,
6827 Handle<Object> key, 6827 Handle<Object> key,
6828 Handle<Object> value, 6828 Handle<Object> value,
6829 PropertyDetails details) { 6829 PropertyDetails details) {
6830 ASSERT(!key->IsName() || 6830 DCHECK(!key->IsName() ||
6831 details.IsDeleted() || 6831 details.IsDeleted() ||
6832 details.dictionary_index() > 0); 6832 details.dictionary_index() > 0);
6833 int index = DerivedHashTable::EntryToIndex(entry); 6833 int index = DerivedHashTable::EntryToIndex(entry);
6834 DisallowHeapAllocation no_gc; 6834 DisallowHeapAllocation no_gc;
6835 WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc); 6835 WriteBarrierMode mode = FixedArray::GetWriteBarrierMode(no_gc);
6836 FixedArray::set(index, *key, mode); 6836 FixedArray::set(index, *key, mode);
6837 FixedArray::set(index+1, *value, mode); 6837 FixedArray::set(index+1, *value, mode);
6838 FixedArray::set(index+2, details.AsSmi()); 6838 FixedArray::set(index+2, details.AsSmi());
6839 } 6839 }
6840 6840
6841 6841
6842 bool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) { 6842 bool NumberDictionaryShape::IsMatch(uint32_t key, Object* other) {
6843 ASSERT(other->IsNumber()); 6843 DCHECK(other->IsNumber());
6844 return key == static_cast<uint32_t>(other->Number()); 6844 return key == static_cast<uint32_t>(other->Number());
6845 } 6845 }
6846 6846
6847 6847
6848 uint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) { 6848 uint32_t UnseededNumberDictionaryShape::Hash(uint32_t key) {
6849 return ComputeIntegerHash(key, 0); 6849 return ComputeIntegerHash(key, 0);
6850 } 6850 }
6851 6851
6852 6852
6853 uint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key, 6853 uint32_t UnseededNumberDictionaryShape::HashForObject(uint32_t key,
6854 Object* other) { 6854 Object* other) {
6855 ASSERT(other->IsNumber()); 6855 DCHECK(other->IsNumber());
6856 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0); 6856 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), 0);
6857 } 6857 }
6858 6858
6859 6859
6860 uint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) { 6860 uint32_t SeededNumberDictionaryShape::SeededHash(uint32_t key, uint32_t seed) {
6861 return ComputeIntegerHash(key, seed); 6861 return ComputeIntegerHash(key, seed);
6862 } 6862 }
6863 6863
6864 6864
6865 uint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key, 6865 uint32_t SeededNumberDictionaryShape::SeededHashForObject(uint32_t key,
6866 uint32_t seed, 6866 uint32_t seed,
6867 Object* other) { 6867 Object* other) {
6868 ASSERT(other->IsNumber()); 6868 DCHECK(other->IsNumber());
6869 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed); 6869 return ComputeIntegerHash(static_cast<uint32_t>(other->Number()), seed);
6870 } 6870 }
6871 6871
6872 6872
6873 Handle<Object> NumberDictionaryShape::AsHandle(Isolate* isolate, uint32_t key) { 6873 Handle<Object> NumberDictionaryShape::AsHandle(Isolate* isolate, uint32_t key) {
6874 return isolate->factory()->NewNumberFromUint(key); 6874 return isolate->factory()->NewNumberFromUint(key);
6875 } 6875 }
6876 6876
6877 6877
6878 bool NameDictionaryShape::IsMatch(Handle<Name> key, Object* other) { 6878 bool NameDictionaryShape::IsMatch(Handle<Name> key, Object* other) {
6879 // We know that all entries in a hash table had their hash keys created. 6879 // We know that all entries in a hash table had their hash keys created.
6880 // Use that knowledge to have fast failure. 6880 // Use that knowledge to have fast failure.
6881 if (key->Hash() != Name::cast(other)->Hash()) return false; 6881 if (key->Hash() != Name::cast(other)->Hash()) return false;
6882 return key->Equals(Name::cast(other)); 6882 return key->Equals(Name::cast(other));
6883 } 6883 }
6884 6884
6885 6885
6886 uint32_t NameDictionaryShape::Hash(Handle<Name> key) { 6886 uint32_t NameDictionaryShape::Hash(Handle<Name> key) {
6887 return key->Hash(); 6887 return key->Hash();
6888 } 6888 }
6889 6889
6890 6890
6891 uint32_t NameDictionaryShape::HashForObject(Handle<Name> key, Object* other) { 6891 uint32_t NameDictionaryShape::HashForObject(Handle<Name> key, Object* other) {
6892 return Name::cast(other)->Hash(); 6892 return Name::cast(other)->Hash();
6893 } 6893 }
6894 6894
6895 6895
6896 Handle<Object> NameDictionaryShape::AsHandle(Isolate* isolate, 6896 Handle<Object> NameDictionaryShape::AsHandle(Isolate* isolate,
6897 Handle<Name> key) { 6897 Handle<Name> key) {
6898 ASSERT(key->IsUniqueName()); 6898 DCHECK(key->IsUniqueName());
6899 return key; 6899 return key;
6900 } 6900 }
6901 6901
6902 6902
6903 void NameDictionary::DoGenerateNewEnumerationIndices( 6903 void NameDictionary::DoGenerateNewEnumerationIndices(
6904 Handle<NameDictionary> dictionary) { 6904 Handle<NameDictionary> dictionary) {
6905 DerivedDictionary::GenerateNewEnumerationIndices(dictionary); 6905 DerivedDictionary::GenerateNewEnumerationIndices(dictionary);
6906 } 6906 }
6907 6907
6908 6908
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
6960 Handle<Object> key) { 6960 Handle<Object> key) {
6961 return key; 6961 return key;
6962 } 6962 }
6963 6963
6964 6964
6965 void Map::ClearCodeCache(Heap* heap) { 6965 void Map::ClearCodeCache(Heap* heap) {
6966 // No write barrier is needed since empty_fixed_array is not in new space. 6966 // No write barrier is needed since empty_fixed_array is not in new space.
6967 // Please note this function is used during marking: 6967 // Please note this function is used during marking:
6968 // - MarkCompactCollector::MarkUnmarkedObject 6968 // - MarkCompactCollector::MarkUnmarkedObject
6969 // - IncrementalMarking::Step 6969 // - IncrementalMarking::Step
6970 ASSERT(!heap->InNewSpace(heap->empty_fixed_array())); 6970 DCHECK(!heap->InNewSpace(heap->empty_fixed_array()));
6971 WRITE_FIELD(this, kCodeCacheOffset, heap->empty_fixed_array()); 6971 WRITE_FIELD(this, kCodeCacheOffset, heap->empty_fixed_array());
6972 } 6972 }
6973 6973
6974 6974
6975 void JSArray::EnsureSize(Handle<JSArray> array, int required_size) { 6975 void JSArray::EnsureSize(Handle<JSArray> array, int required_size) {
6976 ASSERT(array->HasFastSmiOrObjectElements()); 6976 DCHECK(array->HasFastSmiOrObjectElements());
6977 Handle<FixedArray> elts = handle(FixedArray::cast(array->elements())); 6977 Handle<FixedArray> elts = handle(FixedArray::cast(array->elements()));
6978 const int kArraySizeThatFitsComfortablyInNewSpace = 128; 6978 const int kArraySizeThatFitsComfortablyInNewSpace = 128;
6979 if (elts->length() < required_size) { 6979 if (elts->length() < required_size) {
6980 // Doubling in size would be overkill, but leave some slack to avoid 6980 // Doubling in size would be overkill, but leave some slack to avoid
6981 // constantly growing. 6981 // constantly growing.
6982 Expand(array, required_size + (required_size >> 3)); 6982 Expand(array, required_size + (required_size >> 3));
6983 // It's a performance benefit to keep a frequently used array in new-space. 6983 // It's a performance benefit to keep a frequently used array in new-space.
6984 } else if (!array->GetHeap()->new_space()->Contains(*elts) && 6984 } else if (!array->GetHeap()->new_space()->Contains(*elts) &&
6985 required_size < kArraySizeThatFitsComfortablyInNewSpace) { 6985 required_size < kArraySizeThatFitsComfortablyInNewSpace) {
6986 // Expand will allocate a new backing store in new space even if the size 6986 // Expand will allocate a new backing store in new space even if the size
6987 // we asked for isn't larger than what we had before. 6987 // we asked for isn't larger than what we had before.
6988 Expand(array, required_size); 6988 Expand(array, required_size);
6989 } 6989 }
6990 } 6990 }
6991 6991
6992 6992
6993 void JSArray::set_length(Smi* length) { 6993 void JSArray::set_length(Smi* length) {
6994 // Don't need a write barrier for a Smi. 6994 // Don't need a write barrier for a Smi.
6995 set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER); 6995 set_length(static_cast<Object*>(length), SKIP_WRITE_BARRIER);
6996 } 6996 }
6997 6997
6998 6998
6999 bool JSArray::AllowsSetElementsLength() { 6999 bool JSArray::AllowsSetElementsLength() {
7000 bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray(); 7000 bool result = elements()->IsFixedArray() || elements()->IsFixedDoubleArray();
7001 ASSERT(result == !HasExternalArrayElements()); 7001 DCHECK(result == !HasExternalArrayElements());
7002 return result; 7002 return result;
7003 } 7003 }
7004 7004
7005 7005
7006 void JSArray::SetContent(Handle<JSArray> array, 7006 void JSArray::SetContent(Handle<JSArray> array,
7007 Handle<FixedArrayBase> storage) { 7007 Handle<FixedArrayBase> storage) {
7008 EnsureCanContainElements(array, storage, storage->length(), 7008 EnsureCanContainElements(array, storage, storage->length(),
7009 ALLOW_COPIED_DOUBLE_ELEMENTS); 7009 ALLOW_COPIED_DOUBLE_ELEMENTS);
7010 7010
7011 ASSERT((storage->map() == array->GetHeap()->fixed_double_array_map() && 7011 DCHECK((storage->map() == array->GetHeap()->fixed_double_array_map() &&
7012 IsFastDoubleElementsKind(array->GetElementsKind())) || 7012 IsFastDoubleElementsKind(array->GetElementsKind())) ||
7013 ((storage->map() != array->GetHeap()->fixed_double_array_map()) && 7013 ((storage->map() != array->GetHeap()->fixed_double_array_map()) &&
7014 (IsFastObjectElementsKind(array->GetElementsKind()) || 7014 (IsFastObjectElementsKind(array->GetElementsKind()) ||
7015 (IsFastSmiElementsKind(array->GetElementsKind()) && 7015 (IsFastSmiElementsKind(array->GetElementsKind()) &&
7016 Handle<FixedArray>::cast(storage)->ContainsOnlySmisOrHoles())))); 7016 Handle<FixedArray>::cast(storage)->ContainsOnlySmisOrHoles()))));
7017 array->set_elements(*storage); 7017 array->set_elements(*storage);
7018 array->set_length(Smi::FromInt(storage->length())); 7018 array->set_length(Smi::FromInt(storage->length()));
7019 } 7019 }
7020 7020
7021 7021
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
7122 7122
7123 7123
7124 Relocatable::Relocatable(Isolate* isolate) { 7124 Relocatable::Relocatable(Isolate* isolate) {
7125 isolate_ = isolate; 7125 isolate_ = isolate;
7126 prev_ = isolate->relocatable_top(); 7126 prev_ = isolate->relocatable_top();
7127 isolate->set_relocatable_top(this); 7127 isolate->set_relocatable_top(this);
7128 } 7128 }
7129 7129
7130 7130
7131 Relocatable::~Relocatable() { 7131 Relocatable::~Relocatable() {
7132 ASSERT_EQ(isolate_->relocatable_top(), this); 7132 DCHECK_EQ(isolate_->relocatable_top(), this);
7133 isolate_->set_relocatable_top(prev_); 7133 isolate_->set_relocatable_top(prev_);
7134 } 7134 }
7135 7135
7136 7136
7137 int JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) { 7137 int JSObject::BodyDescriptor::SizeOf(Map* map, HeapObject* object) {
7138 return map->instance_size(); 7138 return map->instance_size();
7139 } 7139 }
7140 7140
7141 7141
7142 void Foreign::ForeignIterateBody(ObjectVisitor* v) { 7142 void Foreign::ForeignIterateBody(ObjectVisitor* v) {
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
7198 v->VisitPointers(HeapObject::RawField(obj, start_offset), 7198 v->VisitPointers(HeapObject::RawField(obj, start_offset),
7199 HeapObject::RawField(obj, object_size)); 7199 HeapObject::RawField(obj, object_size));
7200 } 7200 }
7201 7201
7202 7202
7203 template<class Derived, class TableType> 7203 template<class Derived, class TableType>
7204 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() { 7204 Object* OrderedHashTableIterator<Derived, TableType>::CurrentKey() {
7205 TableType* table(TableType::cast(this->table())); 7205 TableType* table(TableType::cast(this->table()));
7206 int index = Smi::cast(this->index())->value(); 7206 int index = Smi::cast(this->index())->value();
7207 Object* key = table->KeyAt(index); 7207 Object* key = table->KeyAt(index);
7208 ASSERT(!key->IsTheHole()); 7208 DCHECK(!key->IsTheHole());
7209 return key; 7209 return key;
7210 } 7210 }
7211 7211
7212 7212
7213 void JSSetIterator::PopulateValueArray(FixedArray* array) { 7213 void JSSetIterator::PopulateValueArray(FixedArray* array) {
7214 array->set(0, CurrentKey()); 7214 array->set(0, CurrentKey());
7215 } 7215 }
7216 7216
7217 7217
7218 void JSMapIterator::PopulateValueArray(FixedArray* array) { 7218 void JSMapIterator::PopulateValueArray(FixedArray* array) {
7219 array->set(0, CurrentKey()); 7219 array->set(0, CurrentKey());
7220 array->set(1, CurrentValue()); 7220 array->set(1, CurrentValue());
7221 } 7221 }
7222 7222
7223 7223
7224 Object* JSMapIterator::CurrentValue() { 7224 Object* JSMapIterator::CurrentValue() {
7225 OrderedHashMap* table(OrderedHashMap::cast(this->table())); 7225 OrderedHashMap* table(OrderedHashMap::cast(this->table()));
7226 int index = Smi::cast(this->index())->value(); 7226 int index = Smi::cast(this->index())->value();
7227 Object* value = table->ValueAt(index); 7227 Object* value = table->ValueAt(index);
7228 ASSERT(!value->IsTheHole()); 7228 DCHECK(!value->IsTheHole());
7229 return value; 7229 return value;
7230 } 7230 }
7231 7231
7232 7232
7233 #undef TYPE_CHECKER 7233 #undef TYPE_CHECKER
7234 #undef CAST_ACCESSOR 7234 #undef CAST_ACCESSOR
7235 #undef INT_ACCESSORS 7235 #undef INT_ACCESSORS
7236 #undef ACCESSORS 7236 #undef ACCESSORS
7237 #undef ACCESSORS_TO_SMI 7237 #undef ACCESSORS_TO_SMI
7238 #undef SMI_ACCESSORS 7238 #undef SMI_ACCESSORS
(...skipping 20 matching lines...) Expand all
7259 #undef READ_SHORT_FIELD 7259 #undef READ_SHORT_FIELD
7260 #undef WRITE_SHORT_FIELD 7260 #undef WRITE_SHORT_FIELD
7261 #undef READ_BYTE_FIELD 7261 #undef READ_BYTE_FIELD
7262 #undef WRITE_BYTE_FIELD 7262 #undef WRITE_BYTE_FIELD
7263 #undef NOBARRIER_READ_BYTE_FIELD 7263 #undef NOBARRIER_READ_BYTE_FIELD
7264 #undef NOBARRIER_WRITE_BYTE_FIELD 7264 #undef NOBARRIER_WRITE_BYTE_FIELD
7265 7265
7266 } } // namespace v8::internal 7266 } } // namespace v8::internal
7267 7267
7268 #endif // V8_OBJECTS_INL_H_ 7268 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-visiting.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698