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

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

Issue 6529032: Merge 6168:6800 from bleeding_edge to experimental/gc branch. (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/gc/
Patch Set: Created 9 years, 10 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-printer.cc » ('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 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 value_ = smi->value(); 51 value_ = smi->value();
52 } 52 }
53 53
54 54
55 Smi* PropertyDetails::AsSmi() { 55 Smi* PropertyDetails::AsSmi() {
56 return Smi::FromInt(value_); 56 return Smi::FromInt(value_);
57 } 57 }
58 58
59 59
60 PropertyDetails PropertyDetails::AsDeleted() { 60 PropertyDetails PropertyDetails::AsDeleted() {
61 PropertyDetails d(DONT_ENUM, NORMAL); 61 Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
62 Smi* smi = Smi::FromInt(AsSmi()->value() | DeletedField::encode(1));
63 return PropertyDetails(smi); 62 return PropertyDetails(smi);
64 } 63 }
65 64
66 65
67 #define CAST_ACCESSOR(type) \ 66 #define CAST_ACCESSOR(type) \
68 type* type::cast(Object* object) { \ 67 type* type::cast(Object* object) { \
69 ASSERT(object->Is##type()); \ 68 ASSERT(object->Is##type()); \
70 return reinterpret_cast<type*>(object); \ 69 return reinterpret_cast<type*>(object); \
71 } 70 }
72 71
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 402
404 403
405 bool MaybeObject::IsRetryAfterGC() { 404 bool MaybeObject::IsRetryAfterGC() {
406 return HAS_FAILURE_TAG(this) 405 return HAS_FAILURE_TAG(this)
407 && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC; 406 && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC;
408 } 407 }
409 408
410 409
411 bool MaybeObject::IsOutOfMemory() { 410 bool MaybeObject::IsOutOfMemory() {
412 return HAS_FAILURE_TAG(this) 411 return HAS_FAILURE_TAG(this)
413 && Failure::cast(this)->IsOutOfMemoryException(); 412 && Failure::cast(this)->IsOutOfMemoryException();
414 } 413 }
415 414
416 415
417 bool MaybeObject::IsException() { 416 bool MaybeObject::IsException() {
418 return this == Failure::Exception(); 417 return this == Failure::Exception();
419 } 418 }
420 419
421 420
422 bool MaybeObject::IsTheHole() { 421 bool MaybeObject::IsTheHole() {
423 return this == Heap::the_hole_value(); 422 return this == Heap::the_hole_value();
424 } 423 }
425 424
426 425
427 Failure* Failure::cast(MaybeObject* obj) { 426 Failure* Failure::cast(MaybeObject* obj) {
428 ASSERT(HAS_FAILURE_TAG(obj)); 427 ASSERT(HAS_FAILURE_TAG(obj));
429 return reinterpret_cast<Failure*>(obj); 428 return reinterpret_cast<Failure*>(obj);
430 } 429 }
431 430
432 431
433 bool Object::IsJSObject() { 432 bool Object::IsJSObject() {
434 return IsHeapObject() 433 return IsHeapObject()
435 && HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE; 434 && HeapObject::cast(this)->map()->instance_type() >= FIRST_JS_OBJECT_TYPE;
436 } 435 }
437 436
438 437
439 bool Object::IsJSContextExtensionObject() { 438 bool Object::IsJSContextExtensionObject() {
440 return IsHeapObject() 439 return IsHeapObject()
441 && (HeapObject::cast(this)->map()->instance_type() == 440 && (HeapObject::cast(this)->map()->instance_type() ==
442 JS_CONTEXT_EXTENSION_OBJECT_TYPE); 441 JS_CONTEXT_EXTENSION_OBJECT_TYPE);
443 } 442 }
444 443
445 444
446 bool Object::IsMap() { 445 bool Object::IsMap() {
447 return Object::IsHeapObject() 446 return Object::IsHeapObject()
448 && HeapObject::cast(this)->map()->instance_type() == MAP_TYPE; 447 && HeapObject::cast(this)->map()->instance_type() == MAP_TYPE;
449 } 448 }
450 449
451 450
452 bool Object::IsFixedArray() { 451 bool Object::IsFixedArray() {
453 return Object::IsHeapObject() 452 return Object::IsHeapObject()
454 && HeapObject::cast(this)->map()->instance_type() == FIXED_ARRAY_TYPE; 453 && HeapObject::cast(this)->map()->instance_type() == FIXED_ARRAY_TYPE;
455 } 454 }
456 455
457 456
458 bool Object::IsDescriptorArray() { 457 bool Object::IsDescriptorArray() {
459 return IsFixedArray(); 458 return IsFixedArray();
460 } 459 }
461 460
462 461
463 bool Object::IsDeoptimizationInputData() { 462 bool Object::IsDeoptimizationInputData() {
464 // Must be a fixed array. 463 // Must be a fixed array.
(...skipping 25 matching lines...) Expand all
490 bool Object::IsContext() { 489 bool Object::IsContext() {
491 return Object::IsHeapObject() 490 return Object::IsHeapObject()
492 && (HeapObject::cast(this)->map() == Heap::context_map() || 491 && (HeapObject::cast(this)->map() == Heap::context_map() ||
493 HeapObject::cast(this)->map() == Heap::catch_context_map() || 492 HeapObject::cast(this)->map() == Heap::catch_context_map() ||
494 HeapObject::cast(this)->map() == Heap::global_context_map()); 493 HeapObject::cast(this)->map() == Heap::global_context_map());
495 } 494 }
496 495
497 496
498 bool Object::IsCatchContext() { 497 bool Object::IsCatchContext() {
499 return Object::IsHeapObject() 498 return Object::IsHeapObject()
500 && HeapObject::cast(this)->map() == Heap::catch_context_map(); 499 && HeapObject::cast(this)->map() == Heap::catch_context_map();
501 } 500 }
502 501
503 502
504 bool Object::IsGlobalContext() { 503 bool Object::IsGlobalContext() {
505 return Object::IsHeapObject() 504 return Object::IsHeapObject()
506 && HeapObject::cast(this)->map() == Heap::global_context_map(); 505 && HeapObject::cast(this)->map() == Heap::global_context_map();
507 } 506 }
508 507
509 508
510 bool Object::IsJSFunction() { 509 bool Object::IsJSFunction() {
511 return Object::IsHeapObject() 510 return Object::IsHeapObject()
512 && HeapObject::cast(this)->map()->instance_type() == JS_FUNCTION_TYPE; 511 && HeapObject::cast(this)->map()->instance_type() == JS_FUNCTION_TYPE;
513 } 512 }
514 513
515 514
516 template <> inline bool Is<JSFunction>(Object* obj) { 515 template <> inline bool Is<JSFunction>(Object* obj) {
517 return obj->IsJSFunction(); 516 return obj->IsJSFunction();
518 } 517 }
519 518
520 519
521 bool Object::IsCode() { 520 bool Object::IsCode() {
522 return Object::IsHeapObject() 521 return Object::IsHeapObject()
523 && HeapObject::cast(this)->map()->instance_type() == CODE_TYPE; 522 && HeapObject::cast(this)->map()->instance_type() == CODE_TYPE;
524 } 523 }
525 524
526 525
527 bool Object::IsOddball() { 526 bool Object::IsOddball() {
528 return Object::IsHeapObject() 527 return Object::IsHeapObject()
529 && HeapObject::cast(this)->map()->instance_type() == ODDBALL_TYPE; 528 && HeapObject::cast(this)->map()->instance_type() == ODDBALL_TYPE;
530 } 529 }
531 530
532 531
533 bool Object::IsJSGlobalPropertyCell() { 532 bool Object::IsJSGlobalPropertyCell() {
534 return Object::IsHeapObject() 533 return Object::IsHeapObject()
535 && HeapObject::cast(this)->map()->instance_type() 534 && HeapObject::cast(this)->map()->instance_type()
536 == JS_GLOBAL_PROPERTY_CELL_TYPE; 535 == JS_GLOBAL_PROPERTY_CELL_TYPE;
537 } 536 }
538 537
539 538
540 bool Object::IsSharedFunctionInfo() { 539 bool Object::IsSharedFunctionInfo() {
541 return Object::IsHeapObject() && 540 return Object::IsHeapObject() &&
542 (HeapObject::cast(this)->map()->instance_type() == 541 (HeapObject::cast(this)->map()->instance_type() ==
543 SHARED_FUNCTION_INFO_TYPE); 542 SHARED_FUNCTION_INFO_TYPE);
544 } 543 }
545 544
546 545
547 bool Object::IsJSValue() { 546 bool Object::IsJSValue() {
548 return Object::IsHeapObject() 547 return Object::IsHeapObject()
549 && HeapObject::cast(this)->map()->instance_type() == JS_VALUE_TYPE; 548 && HeapObject::cast(this)->map()->instance_type() == JS_VALUE_TYPE;
549 }
550
551
552 bool Object::IsJSMessageObject() {
553 return Object::IsHeapObject()
554 && (HeapObject::cast(this)->map()->instance_type() ==
555 JS_MESSAGE_OBJECT_TYPE);
550 } 556 }
551 557
552 558
553 bool Object::IsStringWrapper() { 559 bool Object::IsStringWrapper() {
554 return IsJSValue() && JSValue::cast(this)->value()->IsString(); 560 return IsJSValue() && JSValue::cast(this)->value()->IsString();
555 } 561 }
556 562
557 563
558 bool Object::IsProxy() { 564 bool Object::IsProxy() {
559 return Object::IsHeapObject() 565 return Object::IsHeapObject()
560 && HeapObject::cast(this)->map()->instance_type() == PROXY_TYPE; 566 && HeapObject::cast(this)->map()->instance_type() == PROXY_TYPE;
561 } 567 }
562 568
563 569
564 bool Object::IsBoolean() { 570 bool Object::IsBoolean() {
565 return IsTrue() || IsFalse(); 571 return IsTrue() || IsFalse();
566 } 572 }
567 573
568 574
569 bool Object::IsJSArray() { 575 bool Object::IsJSArray() {
570 return Object::IsHeapObject() 576 return Object::IsHeapObject()
571 && HeapObject::cast(this)->map()->instance_type() == JS_ARRAY_TYPE; 577 && HeapObject::cast(this)->map()->instance_type() == JS_ARRAY_TYPE;
572 } 578 }
573 579
574 580
575 bool Object::IsJSRegExp() { 581 bool Object::IsJSRegExp() {
576 return Object::IsHeapObject() 582 return Object::IsHeapObject()
577 && HeapObject::cast(this)->map()->instance_type() == JS_REGEXP_TYPE; 583 && HeapObject::cast(this)->map()->instance_type() == JS_REGEXP_TYPE;
578 } 584 }
579 585
580 586
581 template <> inline bool Is<JSArray>(Object* obj) { 587 template <> inline bool Is<JSArray>(Object* obj) {
582 return obj->IsJSArray(); 588 return obj->IsJSArray();
583 } 589 }
584 590
585 591
586 bool Object::IsHashTable() { 592 bool Object::IsHashTable() {
587 return Object::IsHeapObject() 593 return Object::IsHeapObject()
588 && HeapObject::cast(this)->map() == Heap::hash_table_map(); 594 && HeapObject::cast(this)->map() == Heap::hash_table_map();
589 } 595 }
590 596
591 597
592 bool Object::IsDictionary() { 598 bool Object::IsDictionary() {
593 return IsHashTable() && this != Heap::symbol_table(); 599 return IsHashTable() && this != Heap::symbol_table();
594 } 600 }
595 601
596 602
597 bool Object::IsSymbolTable() { 603 bool Object::IsSymbolTable() {
598 return IsHashTable() && this == Heap::raw_unchecked_symbol_table(); 604 return IsHashTable() && this == Heap::raw_unchecked_symbol_table();
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
724 bool Object::IsTrue() { 730 bool Object::IsTrue() {
725 return this == Heap::true_value(); 731 return this == Heap::true_value();
726 } 732 }
727 733
728 734
729 bool Object::IsFalse() { 735 bool Object::IsFalse() {
730 return this == Heap::false_value(); 736 return this == Heap::false_value();
731 } 737 }
732 738
733 739
740 bool Object::IsArgumentsMarker() {
741 return this == Heap::arguments_marker();
742 }
743
744
734 double Object::Number() { 745 double Object::Number() {
735 ASSERT(IsNumber()); 746 ASSERT(IsNumber());
736 return IsSmi() 747 return IsSmi()
737 ? static_cast<double>(reinterpret_cast<Smi*>(this)->value()) 748 ? static_cast<double>(reinterpret_cast<Smi*>(this)->value())
738 : reinterpret_cast<HeapNumber*>(this)->value(); 749 : reinterpret_cast<HeapNumber*>(this)->value();
739 } 750 }
740 751
741 752
742 753
743 MaybeObject* Object::ToSmi() { 754 MaybeObject* Object::ToSmi() {
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
1148 case JS_FUNCTION_TYPE: 1159 case JS_FUNCTION_TYPE:
1149 return JSFunction::kSize; 1160 return JSFunction::kSize;
1150 case JS_VALUE_TYPE: 1161 case JS_VALUE_TYPE:
1151 return JSValue::kSize; 1162 return JSValue::kSize;
1152 case JS_ARRAY_TYPE: 1163 case JS_ARRAY_TYPE:
1153 return JSValue::kSize; 1164 return JSValue::kSize;
1154 case JS_REGEXP_TYPE: 1165 case JS_REGEXP_TYPE:
1155 return JSValue::kSize; 1166 return JSValue::kSize;
1156 case JS_CONTEXT_EXTENSION_OBJECT_TYPE: 1167 case JS_CONTEXT_EXTENSION_OBJECT_TYPE:
1157 return JSObject::kHeaderSize; 1168 return JSObject::kHeaderSize;
1169 case JS_MESSAGE_OBJECT_TYPE:
1170 return JSMessageObject::kSize;
1158 default: 1171 default:
1159 UNREACHABLE(); 1172 UNREACHABLE();
1160 return 0; 1173 return 0;
1161 } 1174 }
1162 } 1175 }
1163 1176
1164 1177
1165 int JSObject::GetInternalFieldCount() { 1178 int JSObject::GetInternalFieldCount() {
1166 ASSERT(1 << kPointerSizeLog2 == kPointerSize); 1179 ASSERT(1 << kPointerSizeLog2 == kPointerSize);
1167 // Make sure to adjust for the number of in-object properties. These 1180 // Make sure to adjust for the number of in-object properties. These
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
1840 } 1853 }
1841 1854
1842 1855
1843 void ExternalTwoByteString::set_resource( 1856 void ExternalTwoByteString::set_resource(
1844 ExternalTwoByteString::Resource* resource) { 1857 ExternalTwoByteString::Resource* resource) {
1845 *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)) = resource; 1858 *reinterpret_cast<Resource**>(FIELD_ADDR(this, kResourceOffset)) = resource;
1846 } 1859 }
1847 1860
1848 1861
1849 void JSFunctionResultCache::MakeZeroSize() { 1862 void JSFunctionResultCache::MakeZeroSize() {
1850 set(kFingerIndex, Smi::FromInt(kEntriesIndex)); 1863 set_finger_index(kEntriesIndex);
1851 set(kCacheSizeIndex, Smi::FromInt(kEntriesIndex)); 1864 set_size(kEntriesIndex);
1852 } 1865 }
1853 1866
1854 1867
1855 void JSFunctionResultCache::Clear() { 1868 void JSFunctionResultCache::Clear() {
1856 int cache_size = Smi::cast(get(kCacheSizeIndex))->value(); 1869 int cache_size = size();
1857 Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex)); 1870 Object** entries_start = RawField(this, OffsetOfElementAt(kEntriesIndex));
1858 MemsetPointer(entries_start, 1871 MemsetPointer(entries_start,
1859 Heap::the_hole_value(), 1872 Heap::the_hole_value(),
1860 cache_size - kEntriesIndex); 1873 cache_size - kEntriesIndex);
1861 MakeZeroSize(); 1874 MakeZeroSize();
1862 } 1875 }
1863 1876
1864 1877
1878 int JSFunctionResultCache::size() {
1879 return Smi::cast(get(kCacheSizeIndex))->value();
1880 }
1881
1882
1883 void JSFunctionResultCache::set_size(int size) {
1884 set(kCacheSizeIndex, Smi::FromInt(size));
1885 }
1886
1887
1888 int JSFunctionResultCache::finger_index() {
1889 return Smi::cast(get(kFingerIndex))->value();
1890 }
1891
1892
1893 void JSFunctionResultCache::set_finger_index(int finger_index) {
1894 set(kFingerIndex, Smi::FromInt(finger_index));
1895 }
1896
1897
1865 byte ByteArray::get(int index) { 1898 byte ByteArray::get(int index) {
1866 ASSERT(index >= 0 && index < this->length()); 1899 ASSERT(index >= 0 && index < this->length());
1867 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize); 1900 return READ_BYTE_FIELD(this, kHeaderSize + index * kCharSize);
1868 } 1901 }
1869 1902
1870 1903
1871 void ByteArray::set(int index, byte value) { 1904 void ByteArray::set(int index, byte value) {
1872 ASSERT(index >= 0 && index < this->length()); 1905 ASSERT(index >= 0 && index < this->length());
1873 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value); 1906 WRITE_BYTE_FIELD(this, kHeaderSize + index * kCharSize, value);
1874 } 1907 }
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
2100 static_cast<byte>(value)); 2133 static_cast<byte>(value));
2101 } 2134 }
2102 2135
2103 2136
2104 InstanceType Map::instance_type() { 2137 InstanceType Map::instance_type() {
2105 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset)); 2138 return static_cast<InstanceType>(READ_BYTE_FIELD(this, kInstanceTypeOffset));
2106 } 2139 }
2107 2140
2108 2141
2109 void Map::set_instance_type(InstanceType value) { 2142 void Map::set_instance_type(InstanceType value) {
2110 ASSERT(0 <= value && value < 256);
2111 WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value); 2143 WRITE_BYTE_FIELD(this, kInstanceTypeOffset, value);
2112 } 2144 }
2113 2145
2114 2146
2115 int Map::unused_property_fields() { 2147 int Map::unused_property_fields() {
2116 return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset); 2148 return READ_BYTE_FIELD(this, kUnusedPropertyFieldsOffset);
2117 } 2149 }
2118 2150
2119 2151
2120 void Map::set_unused_property_fields(int value) { 2152 void Map::set_unused_property_fields(int value) {
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
2259 // objects. This is used in the debugger to determine whether or not 2291 // objects. This is used in the debugger to determine whether or not
2260 // a call to code object has been replaced with a debug break call. 2292 // a call to code object has been replaced with a debug break call.
2261 ASSERT(is_inline_cache_stub() || 2293 ASSERT(is_inline_cache_stub() ||
2262 result == UNINITIALIZED || 2294 result == UNINITIALIZED ||
2263 result == DEBUG_BREAK || 2295 result == DEBUG_BREAK ||
2264 result == DEBUG_PREPARE_STEP_IN); 2296 result == DEBUG_PREPARE_STEP_IN);
2265 return result; 2297 return result;
2266 } 2298 }
2267 2299
2268 2300
2301 Code::ExtraICState Code::extra_ic_state() {
2302 ASSERT(is_inline_cache_stub());
2303 return ExtractExtraICStateFromFlags(flags());
2304 }
2305
2306
2269 PropertyType Code::type() { 2307 PropertyType Code::type() {
2270 ASSERT(ic_state() == MONOMORPHIC); 2308 ASSERT(ic_state() == MONOMORPHIC);
2271 return ExtractTypeFromFlags(flags()); 2309 return ExtractTypeFromFlags(flags());
2272 } 2310 }
2273 2311
2274 2312
2275 int Code::arguments_count() { 2313 int Code::arguments_count() {
2276 ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB); 2314 ASSERT(is_call_stub() || is_keyed_call_stub() || kind() == STUB);
2277 return ExtractArgumentsCountFromFlags(flags()); 2315 return ExtractArgumentsCountFromFlags(flags());
2278 } 2316 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
2339 return READ_UINT32_FIELD(this, kStackSlotsOffset); 2377 return READ_UINT32_FIELD(this, kStackSlotsOffset);
2340 } 2378 }
2341 2379
2342 2380
2343 void Code::set_stack_slots(unsigned slots) { 2381 void Code::set_stack_slots(unsigned slots) {
2344 ASSERT(kind() == OPTIMIZED_FUNCTION); 2382 ASSERT(kind() == OPTIMIZED_FUNCTION);
2345 WRITE_UINT32_FIELD(this, kStackSlotsOffset, slots); 2383 WRITE_UINT32_FIELD(this, kStackSlotsOffset, slots);
2346 } 2384 }
2347 2385
2348 2386
2349 unsigned Code::safepoint_table_start() { 2387 unsigned Code::safepoint_table_offset() {
2350 ASSERT(kind() == OPTIMIZED_FUNCTION); 2388 ASSERT(kind() == OPTIMIZED_FUNCTION);
2351 return READ_UINT32_FIELD(this, kSafepointTableStartOffset); 2389 return READ_UINT32_FIELD(this, kSafepointTableOffsetOffset);
2352 } 2390 }
2353 2391
2354 2392
2355 void Code::set_safepoint_table_start(unsigned offset) { 2393 void Code::set_safepoint_table_offset(unsigned offset) {
2356 ASSERT(kind() == OPTIMIZED_FUNCTION); 2394 ASSERT(kind() == OPTIMIZED_FUNCTION);
2357 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize))); 2395 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
2358 WRITE_UINT32_FIELD(this, kSafepointTableStartOffset, offset); 2396 WRITE_UINT32_FIELD(this, kSafepointTableOffsetOffset, offset);
2359 } 2397 }
2360 2398
2361 2399
2362 unsigned Code::stack_check_table_start() { 2400 unsigned Code::stack_check_table_offset() {
2363 ASSERT(kind() == FUNCTION); 2401 ASSERT(kind() == FUNCTION);
2364 return READ_UINT32_FIELD(this, kStackCheckTableStartOffset); 2402 return READ_UINT32_FIELD(this, kStackCheckTableOffsetOffset);
2365 } 2403 }
2366 2404
2367 2405
2368 void Code::set_stack_check_table_start(unsigned offset) { 2406 void Code::set_stack_check_table_offset(unsigned offset) {
2369 ASSERT(kind() == FUNCTION); 2407 ASSERT(kind() == FUNCTION);
2370 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize))); 2408 ASSERT(IsAligned(offset, static_cast<unsigned>(kIntSize)));
2371 WRITE_UINT32_FIELD(this, kStackCheckTableStartOffset, offset); 2409 WRITE_UINT32_FIELD(this, kStackCheckTableOffsetOffset, offset);
2372 } 2410 }
2373 2411
2374 2412
2375 CheckType Code::check_type() { 2413 CheckType Code::check_type() {
2376 ASSERT(is_call_stub() || is_keyed_call_stub()); 2414 ASSERT(is_call_stub() || is_keyed_call_stub());
2377 byte type = READ_BYTE_FIELD(this, kCheckTypeOffset); 2415 byte type = READ_BYTE_FIELD(this, kCheckTypeOffset);
2378 return static_cast<CheckType>(type); 2416 return static_cast<CheckType>(type);
2379 } 2417 }
2380 2418
2381 2419
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2435 2473
2436 bool Code::is_inline_cache_stub() { 2474 bool Code::is_inline_cache_stub() {
2437 Kind kind = this->kind(); 2475 Kind kind = this->kind();
2438 return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND; 2476 return kind >= FIRST_IC_KIND && kind <= LAST_IC_KIND;
2439 } 2477 }
2440 2478
2441 2479
2442 Code::Flags Code::ComputeFlags(Kind kind, 2480 Code::Flags Code::ComputeFlags(Kind kind,
2443 InLoopFlag in_loop, 2481 InLoopFlag in_loop,
2444 InlineCacheState ic_state, 2482 InlineCacheState ic_state,
2483 ExtraICState extra_ic_state,
2445 PropertyType type, 2484 PropertyType type,
2446 int argc, 2485 int argc,
2447 InlineCacheHolderFlag holder) { 2486 InlineCacheHolderFlag holder) {
2487 // Extra IC state is only allowed for monomorphic call IC stubs
2488 // or for store IC stubs.
2489 ASSERT(extra_ic_state == kNoExtraICState ||
2490 (kind == CALL_IC && (ic_state == MONOMORPHIC ||
2491 ic_state == MONOMORPHIC_PROTOTYPE_FAILURE)) ||
2492 (kind == STORE_IC));
2448 // Compute the bit mask. 2493 // Compute the bit mask.
2449 int bits = kind << kFlagsKindShift; 2494 int bits = kind << kFlagsKindShift;
2450 if (in_loop) bits |= kFlagsICInLoopMask; 2495 if (in_loop) bits |= kFlagsICInLoopMask;
2451 bits |= ic_state << kFlagsICStateShift; 2496 bits |= ic_state << kFlagsICStateShift;
2452 bits |= type << kFlagsTypeShift; 2497 bits |= type << kFlagsTypeShift;
2498 bits |= extra_ic_state << kFlagsExtraICStateShift;
2453 bits |= argc << kFlagsArgumentsCountShift; 2499 bits |= argc << kFlagsArgumentsCountShift;
2454 if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask; 2500 if (holder == PROTOTYPE_MAP) bits |= kFlagsCacheInPrototypeMapMask;
2455 // Cast to flags and validate result before returning it. 2501 // Cast to flags and validate result before returning it.
2456 Flags result = static_cast<Flags>(bits); 2502 Flags result = static_cast<Flags>(bits);
2457 ASSERT(ExtractKindFromFlags(result) == kind); 2503 ASSERT(ExtractKindFromFlags(result) == kind);
2458 ASSERT(ExtractICStateFromFlags(result) == ic_state); 2504 ASSERT(ExtractICStateFromFlags(result) == ic_state);
2459 ASSERT(ExtractICInLoopFromFlags(result) == in_loop); 2505 ASSERT(ExtractICInLoopFromFlags(result) == in_loop);
2460 ASSERT(ExtractTypeFromFlags(result) == type); 2506 ASSERT(ExtractTypeFromFlags(result) == type);
2507 ASSERT(ExtractExtraICStateFromFlags(result) == extra_ic_state);
2461 ASSERT(ExtractArgumentsCountFromFlags(result) == argc); 2508 ASSERT(ExtractArgumentsCountFromFlags(result) == argc);
2462 return result; 2509 return result;
2463 } 2510 }
2464 2511
2465 2512
2466 Code::Flags Code::ComputeMonomorphicFlags(Kind kind, 2513 Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
2467 PropertyType type, 2514 PropertyType type,
2515 ExtraICState extra_ic_state,
2468 InlineCacheHolderFlag holder, 2516 InlineCacheHolderFlag holder,
2469 InLoopFlag in_loop, 2517 InLoopFlag in_loop,
2470 int argc) { 2518 int argc) {
2471 return ComputeFlags(kind, in_loop, MONOMORPHIC, type, argc, holder); 2519 return ComputeFlags(
2520 kind, in_loop, MONOMORPHIC, extra_ic_state, type, argc, holder);
2472 } 2521 }
2473 2522
2474 2523
2475 Code::Kind Code::ExtractKindFromFlags(Flags flags) { 2524 Code::Kind Code::ExtractKindFromFlags(Flags flags) {
2476 int bits = (flags & kFlagsKindMask) >> kFlagsKindShift; 2525 int bits = (flags & kFlagsKindMask) >> kFlagsKindShift;
2477 return static_cast<Kind>(bits); 2526 return static_cast<Kind>(bits);
2478 } 2527 }
2479 2528
2480 2529
2481 InlineCacheState Code::ExtractICStateFromFlags(Flags flags) { 2530 InlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
2482 int bits = (flags & kFlagsICStateMask) >> kFlagsICStateShift; 2531 int bits = (flags & kFlagsICStateMask) >> kFlagsICStateShift;
2483 return static_cast<InlineCacheState>(bits); 2532 return static_cast<InlineCacheState>(bits);
2484 } 2533 }
2485 2534
2486 2535
2536 Code::ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
2537 int bits = (flags & kFlagsExtraICStateMask) >> kFlagsExtraICStateShift;
2538 return static_cast<ExtraICState>(bits);
2539 }
2540
2541
2487 InLoopFlag Code::ExtractICInLoopFromFlags(Flags flags) { 2542 InLoopFlag Code::ExtractICInLoopFromFlags(Flags flags) {
2488 int bits = (flags & kFlagsICInLoopMask); 2543 int bits = (flags & kFlagsICInLoopMask);
2489 return bits != 0 ? IN_LOOP : NOT_IN_LOOP; 2544 return bits != 0 ? IN_LOOP : NOT_IN_LOOP;
2490 } 2545 }
2491 2546
2492 2547
2493 PropertyType Code::ExtractTypeFromFlags(Flags flags) { 2548 PropertyType Code::ExtractTypeFromFlags(Flags flags) {
2494 int bits = (flags & kFlagsTypeMask) >> kFlagsTypeShift; 2549 int bits = (flags & kFlagsTypeMask) >> kFlagsTypeShift;
2495 return static_cast<PropertyType>(bits); 2550 return static_cast<PropertyType>(bits);
2496 } 2551 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2561 { MaybeObject* maybe_obj = CopyDropTransitions(); 2616 { MaybeObject* maybe_obj = CopyDropTransitions();
2562 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 2617 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
2563 } 2618 }
2564 Map* new_map = Map::cast(obj); 2619 Map* new_map = Map::cast(obj);
2565 new_map->set_has_fast_elements(false); 2620 new_map->set_has_fast_elements(false);
2566 Counters::map_fast_to_slow_elements.Increment(); 2621 Counters::map_fast_to_slow_elements.Increment();
2567 return new_map; 2622 return new_map;
2568 } 2623 }
2569 2624
2570 2625
2626 MaybeObject* Map::GetPixelArrayElementsMap() {
2627 if (has_pixel_array_elements()) return this;
2628 // TODO(danno): Special case empty object map (or most common case)
2629 // to return a pre-canned pixel array map.
2630 Object* obj;
2631 { MaybeObject* maybe_obj = CopyDropTransitions();
2632 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
2633 }
2634 Map* new_map = Map::cast(obj);
2635 new_map->set_has_fast_elements(false);
2636 new_map->set_has_pixel_array_elements(true);
2637 Counters::map_to_pixel_array_elements.Increment();
2638 return new_map;
2639 }
2640
2641
2571 ACCESSORS(Map, instance_descriptors, DescriptorArray, 2642 ACCESSORS(Map, instance_descriptors, DescriptorArray,
2572 kInstanceDescriptorsOffset) 2643 kInstanceDescriptorsOffset)
2573 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset) 2644 ACCESSORS(Map, code_cache, Object, kCodeCacheOffset)
2574 ACCESSORS(Map, constructor, Object, kConstructorOffset) 2645 ACCESSORS(Map, constructor, Object, kConstructorOffset)
2575 2646
2576 ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset) 2647 ACCESSORS(JSFunction, shared, SharedFunctionInfo, kSharedFunctionInfoOffset)
2577 ACCESSORS(JSFunction, literals, FixedArray, kLiteralsOffset) 2648 ACCESSORS(JSFunction, literals, FixedArray, kLiteralsOffset)
2578 ACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset) 2649 ACCESSORS(JSFunction, next_function_link, Object, kNextFunctionLinkOffset)
2579 2650
2580 ACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset) 2651 ACCESSORS(GlobalObject, builtins, JSBuiltinsObject, kBuiltinsOffset)
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
2807 kOptimizationDisabled, 2878 kOptimizationDisabled,
2808 disable)); 2879 disable));
2809 // If disabling optimizations we reflect that in the code object so 2880 // If disabling optimizations we reflect that in the code object so
2810 // it will not be counted as optimizable code. 2881 // it will not be counted as optimizable code.
2811 if ((code()->kind() == Code::FUNCTION) && disable) { 2882 if ((code()->kind() == Code::FUNCTION) && disable) {
2812 code()->set_optimizable(false); 2883 code()->set_optimizable(false);
2813 } 2884 }
2814 } 2885 }
2815 2886
2816 2887
2888 bool SharedFunctionInfo::strict_mode() {
2889 return BooleanBit::get(compiler_hints(), kStrictModeFunction);
2890 }
2891
2892
2893 void SharedFunctionInfo::set_strict_mode(bool value) {
2894 set_compiler_hints(BooleanBit::set(compiler_hints(),
2895 kStrictModeFunction,
2896 value));
2897 }
2898
2899
2817 ACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset) 2900 ACCESSORS(CodeCache, default_cache, FixedArray, kDefaultCacheOffset)
2818 ACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset) 2901 ACCESSORS(CodeCache, normal_type_cache, Object, kNormalTypeCacheOffset)
2819 2902
2820 bool Script::HasValidSource() { 2903 bool Script::HasValidSource() {
2821 Object* src = this->source(); 2904 Object* src = this->source();
2822 if (!src->IsString()) return true; 2905 if (!src->IsString()) return true;
2823 String* src_str = String::cast(src); 2906 String* src_str = String::cast(src);
2824 if (!StringShape(src_str).IsExternal()) return true; 2907 if (!StringShape(src_str).IsExternal()) return true;
2825 if (src_str->IsAsciiRepresentation()) { 2908 if (src_str->IsAsciiRepresentation()) {
2826 return ExternalAsciiString::cast(src)->resource() != NULL; 2909 return ExternalAsciiString::cast(src)->resource() != NULL;
(...skipping 25 matching lines...) Expand all
2852 return Code::cast(READ_FIELD(this, kCodeOffset)); 2935 return Code::cast(READ_FIELD(this, kCodeOffset));
2853 } 2936 }
2854 2937
2855 2938
2856 Code* SharedFunctionInfo::unchecked_code() { 2939 Code* SharedFunctionInfo::unchecked_code() {
2857 return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset)); 2940 return reinterpret_cast<Code*>(READ_FIELD(this, kCodeOffset));
2858 } 2941 }
2859 2942
2860 2943
2861 void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) { 2944 void SharedFunctionInfo::set_code(Code* value, WriteBarrierMode mode) {
2862 // If optimization has been disabled for the shared function info,
2863 // reflect that in the code object so it will not be counted as
2864 // optimizable code.
2865 ASSERT(value->kind() != Code::FUNCTION ||
2866 !value->optimizable() ||
2867 this->code() == Builtins::builtin(Builtins::Illegal) ||
2868 this->allows_lazy_compilation());
2869 WRITE_FIELD(this, kCodeOffset, value); 2945 WRITE_FIELD(this, kCodeOffset, value);
2870 CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, mode); 2946 CONDITIONAL_WRITE_BARRIER(this, kCodeOffset, mode);
2871 } 2947 }
2872 2948
2873 2949
2874 SerializedScopeInfo* SharedFunctionInfo::scope_info() { 2950 SerializedScopeInfo* SharedFunctionInfo::scope_info() {
2875 return reinterpret_cast<SerializedScopeInfo*>( 2951 return reinterpret_cast<SerializedScopeInfo*>(
2876 READ_FIELD(this, kScopeInfoOffset)); 2952 READ_FIELD(this, kScopeInfoOffset));
2877 } 2953 }
2878 2954
(...skipping 29 matching lines...) Expand all
2908 ASSERT(IsApiFunction()); 2984 ASSERT(IsApiFunction());
2909 return FunctionTemplateInfo::cast(function_data()); 2985 return FunctionTemplateInfo::cast(function_data());
2910 } 2986 }
2911 2987
2912 2988
2913 bool SharedFunctionInfo::HasBuiltinFunctionId() { 2989 bool SharedFunctionInfo::HasBuiltinFunctionId() {
2914 return function_data()->IsSmi(); 2990 return function_data()->IsSmi();
2915 } 2991 }
2916 2992
2917 2993
2918 bool SharedFunctionInfo::IsBuiltinMathFunction() {
2919 return HasBuiltinFunctionId() &&
2920 builtin_function_id() >= kFirstMathFunctionId;
2921 }
2922
2923
2924 BuiltinFunctionId SharedFunctionInfo::builtin_function_id() { 2994 BuiltinFunctionId SharedFunctionInfo::builtin_function_id() {
2925 ASSERT(HasBuiltinFunctionId()); 2995 ASSERT(HasBuiltinFunctionId());
2926 return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value()); 2996 return static_cast<BuiltinFunctionId>(Smi::cast(function_data())->value());
2927 } 2997 }
2928 2998
2929 2999
2930 int SharedFunctionInfo::code_age() { 3000 int SharedFunctionInfo::code_age() {
2931 return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask; 3001 return (compiler_hints() >> kCodeAgeShift) & kCodeAgeMask;
2932 } 3002 }
2933 3003
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
3078 return code() != Builtins::builtin(Builtins::LazyCompile); 3148 return code() != Builtins::builtin(Builtins::LazyCompile);
3079 } 3149 }
3080 3150
3081 3151
3082 int JSFunction::NumberOfLiterals() { 3152 int JSFunction::NumberOfLiterals() {
3083 return literals()->length(); 3153 return literals()->length();
3084 } 3154 }
3085 3155
3086 3156
3087 Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) { 3157 Object* JSBuiltinsObject::javascript_builtin(Builtins::JavaScript id) {
3088 ASSERT(0 <= id && id < kJSBuiltinsCount); 3158 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
3089 return READ_FIELD(this, OffsetOfFunctionWithId(id)); 3159 return READ_FIELD(this, OffsetOfFunctionWithId(id));
3090 } 3160 }
3091 3161
3092 3162
3093 void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id, 3163 void JSBuiltinsObject::set_javascript_builtin(Builtins::JavaScript id,
3094 Object* value) { 3164 Object* value) {
3095 ASSERT(0 <= id && id < kJSBuiltinsCount); 3165 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
3096 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value); 3166 WRITE_FIELD(this, OffsetOfFunctionWithId(id), value);
3097 WRITE_BARRIER(this, OffsetOfFunctionWithId(id)); 3167 WRITE_BARRIER(this, OffsetOfFunctionWithId(id));
3098 } 3168 }
3099 3169
3100 3170
3101 Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) { 3171 Code* JSBuiltinsObject::javascript_builtin_code(Builtins::JavaScript id) {
3102 ASSERT(0 <= id && id < kJSBuiltinsCount); 3172 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
3103 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id))); 3173 return Code::cast(READ_FIELD(this, OffsetOfCodeWithId(id)));
3104 } 3174 }
3105 3175
3106 3176
3107 void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id, 3177 void JSBuiltinsObject::set_javascript_builtin_code(Builtins::JavaScript id,
3108 Code* value) { 3178 Code* value) {
3109 ASSERT(0 <= id && id < kJSBuiltinsCount); 3179 ASSERT(id < kJSBuiltinsCount); // id is unsigned.
3110 WRITE_FIELD(this, OffsetOfCodeWithId(id), value); 3180 WRITE_FIELD(this, OffsetOfCodeWithId(id), value);
3111 ASSERT(!Heap::InNewSpace(value)); 3181 ASSERT(!Heap::InNewSpace(value));
3112 } 3182 }
3113 3183
3114 3184
3115 Address Proxy::proxy() { 3185 Address Proxy::proxy() {
3116 return AddressFrom<Address>(READ_INTPTR_FIELD(this, kProxyOffset)); 3186 return AddressFrom<Address>(READ_INTPTR_FIELD(this, kProxyOffset));
3117 } 3187 }
3118 3188
3119 3189
3120 void Proxy::set_proxy(Address value) { 3190 void Proxy::set_proxy(Address value) {
3121 WRITE_INTPTR_FIELD(this, kProxyOffset, OffsetFrom(value)); 3191 WRITE_INTPTR_FIELD(this, kProxyOffset, OffsetFrom(value));
3122 } 3192 }
3123 3193
3124 3194
3125 ACCESSORS(JSValue, value, Object, kValueOffset) 3195 ACCESSORS(JSValue, value, Object, kValueOffset)
3126 3196
3127 3197
3128 JSValue* JSValue::cast(Object* obj) { 3198 JSValue* JSValue::cast(Object* obj) {
3129 ASSERT(obj->IsJSValue()); 3199 ASSERT(obj->IsJSValue());
3130 ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize); 3200 ASSERT(HeapObject::cast(obj)->Size() == JSValue::kSize);
3131 return reinterpret_cast<JSValue*>(obj); 3201 return reinterpret_cast<JSValue*>(obj);
3132 } 3202 }
3133 3203
3134 3204
3205 ACCESSORS(JSMessageObject, type, String, kTypeOffset)
3206 ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
3207 ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
3208 ACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset)
3209 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
3210 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
3211 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
3212
3213
3214 JSMessageObject* JSMessageObject::cast(Object* obj) {
3215 ASSERT(obj->IsJSMessageObject());
3216 ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize);
3217 return reinterpret_cast<JSMessageObject*>(obj);
3218 }
3219
3220
3135 INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset) 3221 INT_ACCESSORS(Code, instruction_size, kInstructionSizeOffset)
3136 ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset) 3222 ACCESSORS(Code, relocation_info, ByteArray, kRelocationInfoOffset)
3137 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset) 3223 ACCESSORS(Code, deoptimization_data, FixedArray, kDeoptimizationDataOffset)
3138 3224
3139 3225
3140 byte* Code::instruction_start() { 3226 byte* Code::instruction_start() {
3141 return FIELD_ADDR(this, kHeaderSize); 3227 return FIELD_ADDR(this, kHeaderSize);
3142 } 3228 }
3143 3229
3144 3230
(...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after
3719 #undef WRITE_INT_FIELD 3805 #undef WRITE_INT_FIELD
3720 #undef READ_SHORT_FIELD 3806 #undef READ_SHORT_FIELD
3721 #undef WRITE_SHORT_FIELD 3807 #undef WRITE_SHORT_FIELD
3722 #undef READ_BYTE_FIELD 3808 #undef READ_BYTE_FIELD
3723 #undef WRITE_BYTE_FIELD 3809 #undef WRITE_BYTE_FIELD
3724 3810
3725 3811
3726 } } // namespace v8::internal 3812 } } // namespace v8::internal
3727 3813
3728 #endif // V8_OBJECTS_INL_H_ 3814 #endif // V8_OBJECTS_INL_H_
OLDNEW
« no previous file with comments | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698