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

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

Issue 185653004: Experimental parser: merge to r19637 (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/parser
Patch Set: Created 6 years, 9 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 #include "objects-visiting.h" 52 #include "objects-visiting.h"
53 53
54 namespace v8 { 54 namespace v8 {
55 namespace internal { 55 namespace internal {
56 56
57 PropertyDetails::PropertyDetails(Smi* smi) { 57 PropertyDetails::PropertyDetails(Smi* smi) {
58 value_ = smi->value(); 58 value_ = smi->value();
59 } 59 }
60 60
61 61
62 Smi* PropertyDetails::AsSmi() { 62 Smi* PropertyDetails::AsSmi() const {
63 // Ensure the upper 2 bits have the same value by sign extending it. This is 63 // Ensure the upper 2 bits have the same value by sign extending it. This is
64 // necessary to be able to use the 31st bit of the property details. 64 // necessary to be able to use the 31st bit of the property details.
65 int value = value_ << 1; 65 int value = value_ << 1;
66 return Smi::FromInt(value >> 1); 66 return Smi::FromInt(value >> 1);
67 } 67 }
68 68
69 69
70 PropertyDetails PropertyDetails::AsDeleted() { 70 PropertyDetails PropertyDetails::AsDeleted() const {
71 Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1)); 71 Smi* smi = Smi::FromInt(value_ | DeletedField::encode(1));
72 return PropertyDetails(smi); 72 return PropertyDetails(smi);
73 } 73 }
74 74
75 75
76 #define TYPE_CHECKER(type, instancetype) \ 76 #define TYPE_CHECKER(type, instancetype) \
77 bool Object::Is##type() { \ 77 bool Object::Is##type() { \
78 return Object::IsHeapObject() && \ 78 return Object::IsHeapObject() && \
79 HeapObject::cast(this)->map()->instance_type() == instancetype; \ 79 HeapObject::cast(this)->map()->instance_type() == instancetype; \
80 } 80 }
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
604 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE) 604 TYPE_CHECKER(FreeSpace, FREE_SPACE_TYPE)
605 605
606 606
607 bool Object::IsFiller() { 607 bool Object::IsFiller() {
608 if (!Object::IsHeapObject()) return false; 608 if (!Object::IsHeapObject()) return false;
609 InstanceType instance_type = HeapObject::cast(this)->map()->instance_type(); 609 InstanceType instance_type = HeapObject::cast(this)->map()->instance_type();
610 return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE; 610 return instance_type == FREE_SPACE_TYPE || instance_type == FILLER_TYPE;
611 } 611 }
612 612
613 613
614 TYPE_CHECKER(ExternalPixelArray, EXTERNAL_PIXEL_ARRAY_TYPE)
615
616
617 bool Object::IsExternalArray() { 614 bool Object::IsExternalArray() {
618 if (!Object::IsHeapObject()) 615 if (!Object::IsHeapObject())
619 return false; 616 return false;
620 InstanceType instance_type = 617 InstanceType instance_type =
621 HeapObject::cast(this)->map()->instance_type(); 618 HeapObject::cast(this)->map()->instance_type();
622 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE && 619 return (instance_type >= FIRST_EXTERNAL_ARRAY_TYPE &&
623 instance_type <= LAST_EXTERNAL_ARRAY_TYPE); 620 instance_type <= LAST_EXTERNAL_ARRAY_TYPE);
624 } 621 }
625 622
626 623
627 TYPE_CHECKER(ExternalByteArray, EXTERNAL_BYTE_ARRAY_TYPE) 624 #define TYPED_ARRAY_TYPE_CHECKER(Type, type, TYPE, ctype, size) \
628 TYPE_CHECKER(ExternalUnsignedByteArray, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE) 625 TYPE_CHECKER(External##Type##Array, EXTERNAL_##TYPE##_ARRAY_TYPE) \
629 TYPE_CHECKER(ExternalShortArray, EXTERNAL_SHORT_ARRAY_TYPE) 626 TYPE_CHECKER(Fixed##Type##Array, FIXED_##TYPE##_ARRAY_TYPE)
630 TYPE_CHECKER(ExternalUnsignedShortArray, EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE) 627
631 TYPE_CHECKER(ExternalIntArray, EXTERNAL_INT_ARRAY_TYPE) 628 TYPED_ARRAYS(TYPED_ARRAY_TYPE_CHECKER)
632 TYPE_CHECKER(ExternalUnsignedIntArray, EXTERNAL_UNSIGNED_INT_ARRAY_TYPE) 629 #undef TYPED_ARRAY_TYPE_CHECKER
633 TYPE_CHECKER(ExternalFloatArray, EXTERNAL_FLOAT_ARRAY_TYPE)
634 TYPE_CHECKER(ExternalDoubleArray, EXTERNAL_DOUBLE_ARRAY_TYPE)
635 630
636 631
637 bool Object::IsFixedTypedArrayBase() { 632 bool Object::IsFixedTypedArrayBase() {
638 if (!Object::IsHeapObject()) return false; 633 if (!Object::IsHeapObject()) return false;
639 634
640 InstanceType instance_type = 635 InstanceType instance_type =
641 HeapObject::cast(this)->map()->instance_type(); 636 HeapObject::cast(this)->map()->instance_type();
642 return (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE && 637 return (instance_type >= FIRST_FIXED_TYPED_ARRAY_TYPE &&
643 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE); 638 instance_type <= LAST_FIXED_TYPED_ARRAY_TYPE);
644 } 639 }
645 640
646 641
647 TYPE_CHECKER(FixedUint8Array, FIXED_UINT8_ARRAY_TYPE)
648 TYPE_CHECKER(FixedInt8Array, FIXED_INT8_ARRAY_TYPE)
649 TYPE_CHECKER(FixedUint16Array, FIXED_UINT16_ARRAY_TYPE)
650 TYPE_CHECKER(FixedInt16Array, FIXED_INT16_ARRAY_TYPE)
651 TYPE_CHECKER(FixedUint32Array, FIXED_UINT32_ARRAY_TYPE)
652 TYPE_CHECKER(FixedInt32Array, FIXED_INT32_ARRAY_TYPE)
653 TYPE_CHECKER(FixedFloat32Array, FIXED_FLOAT32_ARRAY_TYPE)
654 TYPE_CHECKER(FixedFloat64Array, FIXED_FLOAT64_ARRAY_TYPE)
655 TYPE_CHECKER(FixedUint8ClampedArray, FIXED_UINT8_CLAMPED_ARRAY_TYPE)
656
657
658 bool MaybeObject::IsFailure() { 642 bool MaybeObject::IsFailure() {
659 return HAS_FAILURE_TAG(this); 643 return HAS_FAILURE_TAG(this);
660 } 644 }
661 645
662 646
663 bool MaybeObject::IsRetryAfterGC() { 647 bool MaybeObject::IsRetryAfterGC() {
664 return HAS_FAILURE_TAG(this) 648 return HAS_FAILURE_TAG(this)
665 && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC; 649 && Failure::cast(this)->type() == Failure::RETRY_AFTER_GC;
666 } 650 }
667 651
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 753
770 754
771 bool Object::IsDependentCode() { 755 bool Object::IsDependentCode() {
772 if (!IsFixedArray()) return false; 756 if (!IsFixedArray()) return false;
773 // There's actually no way to see the difference between a fixed array and 757 // There's actually no way to see the difference between a fixed array and
774 // a dependent codes array. 758 // a dependent codes array.
775 return true; 759 return true;
776 } 760 }
777 761
778 762
779 bool Object::IsTypeFeedbackCells() {
780 if (!IsFixedArray()) return false;
781 // There's actually no way to see the difference between a fixed array and
782 // a cache cells array. Since this is used for asserts we can check that
783 // the length is plausible though.
784 if (FixedArray::cast(this)->length() % 2 != 0) return false;
785 return true;
786 }
787
788
789 bool Object::IsContext() { 763 bool Object::IsContext() {
790 if (!Object::IsHeapObject()) return false; 764 if (!Object::IsHeapObject()) return false;
791 Map* map = HeapObject::cast(this)->map(); 765 Map* map = HeapObject::cast(this)->map();
792 Heap* heap = map->GetHeap(); 766 Heap* heap = map->GetHeap();
793 return (map == heap->function_context_map() || 767 return (map == heap->function_context_map() ||
794 map == heap->catch_context_map() || 768 map == heap->catch_context_map() ||
795 map == heap->with_context_map() || 769 map == heap->with_context_map() ||
796 map == heap->native_context_map() || 770 map == heap->native_context_map() ||
797 map == heap->block_context_map() || 771 map == heap->block_context_map() ||
798 map == heap->module_context_map() || 772 map == heap->module_context_map() ||
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after
1559 inline void AllocationSite::IncrementMementoCreateCount() { 1533 inline void AllocationSite::IncrementMementoCreateCount() {
1560 ASSERT(FLAG_allocation_site_pretenuring); 1534 ASSERT(FLAG_allocation_site_pretenuring);
1561 int value = memento_create_count(); 1535 int value = memento_create_count();
1562 set_memento_create_count(value + 1); 1536 set_memento_create_count(value + 1);
1563 } 1537 }
1564 1538
1565 1539
1566 inline bool AllocationSite::DigestPretenuringFeedback() { 1540 inline bool AllocationSite::DigestPretenuringFeedback() {
1567 bool decision_changed = false; 1541 bool decision_changed = false;
1568 int create_count = memento_create_count(); 1542 int create_count = memento_create_count();
1569 if (create_count >= kPretenureMinimumCreated) { 1543 int found_count = memento_found_count();
1570 int found_count = memento_found_count(); 1544 bool minimum_mementos_created = create_count >= kPretenureMinimumCreated;
1571 double ratio = static_cast<double>(found_count) / create_count; 1545 double ratio =
1572 if (FLAG_trace_track_allocation_sites) { 1546 minimum_mementos_created || FLAG_trace_pretenuring_statistics ?
1573 PrintF("AllocationSite: %p (created, found, ratio) (%d, %d, %f)\n", 1547 static_cast<double>(found_count) / create_count : 0.0;
1574 static_cast<void*>(this), create_count, found_count, ratio); 1548 PretenureFlag current_mode = GetPretenureMode();
1575 } 1549
1576 int current_mode = GetPretenureMode(); 1550 if (minimum_mementos_created) {
1577 PretenureDecision result = ratio >= kPretenureRatio 1551 PretenureDecision result = ratio >= kPretenureRatio
1578 ? kTenure 1552 ? kTenure
1579 : kDontTenure; 1553 : kDontTenure;
1580 set_pretenure_decision(result); 1554 set_pretenure_decision(result);
1581 if (current_mode != GetPretenureMode()) { 1555 if (current_mode != GetPretenureMode()) {
1582 decision_changed = true; 1556 decision_changed = true;
1583 dependent_code()->MarkCodeForDeoptimization( 1557 set_deopt_dependent_code(true);
1584 GetIsolate(),
1585 DependentCode::kAllocationSiteTenuringChangedGroup);
1586 } 1558 }
1587 } 1559 }
1588 1560
1561 if (FLAG_trace_pretenuring_statistics) {
1562 PrintF(
1563 "AllocationSite(%p): (created, found, ratio) (%d, %d, %f) %s => %s\n",
1564 static_cast<void*>(this), create_count, found_count, ratio,
1565 current_mode == TENURED ? "tenured" : "not tenured",
1566 GetPretenureMode() == TENURED ? "tenured" : "not tenured");
1567 }
1568
1589 // Clear feedback calculation fields until the next gc. 1569 // Clear feedback calculation fields until the next gc.
1590 set_memento_found_count(0); 1570 set_memento_found_count(0);
1591 set_memento_create_count(0); 1571 set_memento_create_count(0);
1592 return decision_changed; 1572 return decision_changed;
1593 } 1573 }
1594 1574
1595 1575
1596 void JSObject::EnsureCanContainHeapObjectElements(Handle<JSObject> object) { 1576 void JSObject::EnsureCanContainHeapObjectElements(Handle<JSObject> object) {
1597 object->ValidateElements(); 1577 object->ValidateElements();
1598 ElementsKind elements_kind = object->map()->elements_kind(); 1578 ElementsKind elements_kind = object->map()->elements_kind();
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1977 WRITE_FIELD(this, offset, value); 1957 WRITE_FIELD(this, offset, value);
1978 WRITE_BARRIER(GetHeap(), this, offset, value); 1958 WRITE_BARRIER(GetHeap(), this, offset, value);
1979 } else { 1959 } else {
1980 ASSERT(index < properties()->length()); 1960 ASSERT(index < properties()->length());
1981 properties()->set(index, value); 1961 properties()->set(index, value);
1982 } 1962 }
1983 } 1963 }
1984 1964
1985 1965
1986 int JSObject::GetInObjectPropertyOffset(int index) { 1966 int JSObject::GetInObjectPropertyOffset(int index) {
1987 // Adjust for the number of properties stored in the object. 1967 return map()->GetInObjectPropertyOffset(index);
1988 index -= map()->inobject_properties();
1989 ASSERT(index < 0);
1990 return map()->instance_size() + (index * kPointerSize);
1991 } 1968 }
1992 1969
1993 1970
1994 Object* JSObject::InObjectPropertyAt(int index) { 1971 Object* JSObject::InObjectPropertyAt(int index) {
1995 // Adjust for the number of properties stored in the object. 1972 int offset = GetInObjectPropertyOffset(index);
1996 index -= map()->inobject_properties();
1997 ASSERT(index < 0);
1998 int offset = map()->instance_size() + (index * kPointerSize);
1999 return READ_FIELD(this, offset); 1973 return READ_FIELD(this, offset);
2000 } 1974 }
2001 1975
2002 1976
2003 Object* JSObject::InObjectPropertyAtPut(int index, 1977 Object* JSObject::InObjectPropertyAtPut(int index,
2004 Object* value, 1978 Object* value,
2005 WriteBarrierMode mode) { 1979 WriteBarrierMode mode) {
2006 // Adjust for the number of properties stored in the object. 1980 // Adjust for the number of properties stored in the object.
2007 index -= map()->inobject_properties(); 1981 int offset = GetInObjectPropertyOffset(index);
2008 ASSERT(index < 0);
2009 int offset = map()->instance_size() + (index * kPointerSize);
2010 WRITE_FIELD(this, offset, value); 1982 WRITE_FIELD(this, offset, value);
2011 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode); 1983 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, offset, value, mode);
2012 return value; 1984 return value;
2013 } 1985 }
2014 1986
2015 1987
2016 1988
2017 void JSObject::InitializeBody(Map* map, 1989 void JSObject::InitializeBody(Map* map,
2018 Object* pre_allocated_value, 1990 Object* pre_allocated_value,
2019 Object* filler_value) { 1991 Object* filler_value) {
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
2511 2483
2512 if (number == DescriptorLookupCache::kAbsent) { 2484 if (number == DescriptorLookupCache::kAbsent) {
2513 number = Search(name, number_of_own_descriptors); 2485 number = Search(name, number_of_own_descriptors);
2514 cache->Update(map, name, number); 2486 cache->Update(map, name, number);
2515 } 2487 }
2516 2488
2517 return number; 2489 return number;
2518 } 2490 }
2519 2491
2520 2492
2493 PropertyDetails Map::GetLastDescriptorDetails() {
2494 return instance_descriptors()->GetDetails(LastAdded());
2495 }
2496
2497
2521 void Map::LookupDescriptor(JSObject* holder, 2498 void Map::LookupDescriptor(JSObject* holder,
2522 Name* name, 2499 Name* name,
2523 LookupResult* result) { 2500 LookupResult* result) {
2524 DescriptorArray* descriptors = this->instance_descriptors(); 2501 DescriptorArray* descriptors = this->instance_descriptors();
2525 int number = descriptors->SearchWithCache(name, this); 2502 int number = descriptors->SearchWithCache(name, this);
2526 if (number == DescriptorArray::kNotFound) return result->NotFound(); 2503 if (number == DescriptorArray::kNotFound) return result->NotFound();
2527 result->DescriptorResult(holder, descriptors->GetDetails(number), number); 2504 result->DescriptorResult(holder, descriptors->GetDetails(number), number);
2528 } 2505 }
2529 2506
2530 2507
2531 void Map::LookupTransition(JSObject* holder, 2508 void Map::LookupTransition(JSObject* holder,
2532 Name* name, 2509 Name* name,
2533 LookupResult* result) { 2510 LookupResult* result) {
2534 if (HasTransitionArray()) { 2511 if (HasTransitionArray()) {
2535 TransitionArray* transition_array = transitions(); 2512 TransitionArray* transition_array = transitions();
2536 int number = transition_array->Search(name); 2513 int number = transition_array->Search(name);
2537 if (number != TransitionArray::kNotFound) { 2514 if (number != TransitionArray::kNotFound) {
2538 return result->TransitionResult(holder, number); 2515 return result->TransitionResult(
2516 holder, transition_array->GetTarget(number));
2539 } 2517 }
2540 } 2518 }
2541 result->NotFound(); 2519 result->NotFound();
2542 } 2520 }
2543 2521
2544 2522
2545 Object** DescriptorArray::GetKeySlot(int descriptor_number) { 2523 Object** DescriptorArray::GetKeySlot(int descriptor_number) {
2546 ASSERT(descriptor_number < number_of_descriptors()); 2524 ASSERT(descriptor_number < number_of_descriptors());
2547 return RawFieldOfElementAt(ToKeyIndex(descriptor_number)); 2525 return RawFieldOfElementAt(ToKeyIndex(descriptor_number));
2548 } 2526 }
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
2800 2778
2801 2779
2802 CAST_ACCESSOR(FixedArray) 2780 CAST_ACCESSOR(FixedArray)
2803 CAST_ACCESSOR(FixedDoubleArray) 2781 CAST_ACCESSOR(FixedDoubleArray)
2804 CAST_ACCESSOR(FixedTypedArrayBase) 2782 CAST_ACCESSOR(FixedTypedArrayBase)
2805 CAST_ACCESSOR(ConstantPoolArray) 2783 CAST_ACCESSOR(ConstantPoolArray)
2806 CAST_ACCESSOR(DescriptorArray) 2784 CAST_ACCESSOR(DescriptorArray)
2807 CAST_ACCESSOR(DeoptimizationInputData) 2785 CAST_ACCESSOR(DeoptimizationInputData)
2808 CAST_ACCESSOR(DeoptimizationOutputData) 2786 CAST_ACCESSOR(DeoptimizationOutputData)
2809 CAST_ACCESSOR(DependentCode) 2787 CAST_ACCESSOR(DependentCode)
2810 CAST_ACCESSOR(TypeFeedbackCells)
2811 CAST_ACCESSOR(StringTable) 2788 CAST_ACCESSOR(StringTable)
2812 CAST_ACCESSOR(JSFunctionResultCache) 2789 CAST_ACCESSOR(JSFunctionResultCache)
2813 CAST_ACCESSOR(NormalizedMapCache) 2790 CAST_ACCESSOR(NormalizedMapCache)
2814 CAST_ACCESSOR(ScopeInfo) 2791 CAST_ACCESSOR(ScopeInfo)
2815 CAST_ACCESSOR(CompilationCacheTable) 2792 CAST_ACCESSOR(CompilationCacheTable)
2816 CAST_ACCESSOR(CodeCacheHashTable) 2793 CAST_ACCESSOR(CodeCacheHashTable)
2817 CAST_ACCESSOR(PolymorphicCodeCacheHashTable) 2794 CAST_ACCESSOR(PolymorphicCodeCacheHashTable)
2818 CAST_ACCESSOR(MapCache) 2795 CAST_ACCESSOR(MapCache)
2819 CAST_ACCESSOR(String) 2796 CAST_ACCESSOR(String)
2820 CAST_ACCESSOR(SeqString) 2797 CAST_ACCESSOR(SeqString)
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2852 CAST_ACCESSOR(JSProxy) 2829 CAST_ACCESSOR(JSProxy)
2853 CAST_ACCESSOR(JSFunctionProxy) 2830 CAST_ACCESSOR(JSFunctionProxy)
2854 CAST_ACCESSOR(JSSet) 2831 CAST_ACCESSOR(JSSet)
2855 CAST_ACCESSOR(JSMap) 2832 CAST_ACCESSOR(JSMap)
2856 CAST_ACCESSOR(JSWeakMap) 2833 CAST_ACCESSOR(JSWeakMap)
2857 CAST_ACCESSOR(JSWeakSet) 2834 CAST_ACCESSOR(JSWeakSet)
2858 CAST_ACCESSOR(Foreign) 2835 CAST_ACCESSOR(Foreign)
2859 CAST_ACCESSOR(ByteArray) 2836 CAST_ACCESSOR(ByteArray)
2860 CAST_ACCESSOR(FreeSpace) 2837 CAST_ACCESSOR(FreeSpace)
2861 CAST_ACCESSOR(ExternalArray) 2838 CAST_ACCESSOR(ExternalArray)
2862 CAST_ACCESSOR(ExternalByteArray) 2839 CAST_ACCESSOR(ExternalInt8Array)
2863 CAST_ACCESSOR(ExternalUnsignedByteArray) 2840 CAST_ACCESSOR(ExternalUint8Array)
2864 CAST_ACCESSOR(ExternalShortArray) 2841 CAST_ACCESSOR(ExternalInt16Array)
2865 CAST_ACCESSOR(ExternalUnsignedShortArray) 2842 CAST_ACCESSOR(ExternalUint16Array)
2866 CAST_ACCESSOR(ExternalIntArray) 2843 CAST_ACCESSOR(ExternalInt32Array)
2867 CAST_ACCESSOR(ExternalUnsignedIntArray) 2844 CAST_ACCESSOR(ExternalUint32Array)
2868 CAST_ACCESSOR(ExternalFloatArray) 2845 CAST_ACCESSOR(ExternalFloat32Array)
2869 CAST_ACCESSOR(ExternalDoubleArray) 2846 CAST_ACCESSOR(ExternalFloat64Array)
2870 CAST_ACCESSOR(ExternalPixelArray) 2847 CAST_ACCESSOR(ExternalUint8ClampedArray)
2871 CAST_ACCESSOR(Struct) 2848 CAST_ACCESSOR(Struct)
2872 CAST_ACCESSOR(AccessorInfo) 2849 CAST_ACCESSOR(AccessorInfo)
2873 2850
2874 template <class Traits> 2851 template <class Traits>
2875 FixedTypedArray<Traits>* FixedTypedArray<Traits>::cast(Object* object) { 2852 FixedTypedArray<Traits>* FixedTypedArray<Traits>::cast(Object* object) {
2876 SLOW_ASSERT(object->IsHeapObject() && 2853 SLOW_ASSERT(object->IsHeapObject() &&
2877 HeapObject::cast(object)->map()->instance_type() == 2854 HeapObject::cast(object)->map()->instance_type() ==
2878 Traits::kInstanceType); 2855 Traits::kInstanceType);
2879 return reinterpret_cast<FixedTypedArray<Traits>*>(object); 2856 return reinterpret_cast<FixedTypedArray<Traits>*>(object);
2880 } 2857 }
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
3210 void ExternalAsciiString::update_data_cache() { 3187 void ExternalAsciiString::update_data_cache() {
3211 if (is_short()) return; 3188 if (is_short()) return;
3212 const char** data_field = 3189 const char** data_field =
3213 reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset)); 3190 reinterpret_cast<const char**>(FIELD_ADDR(this, kResourceDataOffset));
3214 *data_field = resource()->data(); 3191 *data_field = resource()->data();
3215 } 3192 }
3216 3193
3217 3194
3218 void ExternalAsciiString::set_resource( 3195 void ExternalAsciiString::set_resource(
3219 const ExternalAsciiString::Resource* resource) { 3196 const ExternalAsciiString::Resource* resource) {
3197 ASSERT(IsAligned(reinterpret_cast<intptr_t>(resource), kPointerSize));
3220 *reinterpret_cast<const Resource**>( 3198 *reinterpret_cast<const Resource**>(
3221 FIELD_ADDR(this, kResourceOffset)) = resource; 3199 FIELD_ADDR(this, kResourceOffset)) = resource;
3222 if (resource != NULL) update_data_cache(); 3200 if (resource != NULL) update_data_cache();
3223 } 3201 }
3224 3202
3225 3203
3226 const uint8_t* ExternalAsciiString::GetChars() { 3204 const uint8_t* ExternalAsciiString::GetChars() {
3227 return reinterpret_cast<const uint8_t*>(resource()->data()); 3205 return reinterpret_cast<const uint8_t*>(resource()->data());
3228 } 3206 }
3229 3207
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
3459 ASSERT_TAG_ALIGNED(address); 3437 ASSERT_TAG_ALIGNED(address);
3460 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag); 3438 return reinterpret_cast<ByteArray*>(address - kHeaderSize + kHeapObjectTag);
3461 } 3439 }
3462 3440
3463 3441
3464 Address ByteArray::GetDataStartAddress() { 3442 Address ByteArray::GetDataStartAddress() {
3465 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize; 3443 return reinterpret_cast<Address>(this) - kHeapObjectTag + kHeaderSize;
3466 } 3444 }
3467 3445
3468 3446
3469 uint8_t* ExternalPixelArray::external_pixel_pointer() { 3447 uint8_t* ExternalUint8ClampedArray::external_uint8_clamped_pointer() {
3470 return reinterpret_cast<uint8_t*>(external_pointer()); 3448 return reinterpret_cast<uint8_t*>(external_pointer());
3471 } 3449 }
3472 3450
3473 3451
3474 uint8_t ExternalPixelArray::get_scalar(int index) { 3452 uint8_t ExternalUint8ClampedArray::get_scalar(int index) {
3475 ASSERT((index >= 0) && (index < this->length())); 3453 ASSERT((index >= 0) && (index < this->length()));
3476 uint8_t* ptr = external_pixel_pointer(); 3454 uint8_t* ptr = external_uint8_clamped_pointer();
3477 return ptr[index]; 3455 return ptr[index];
3478 } 3456 }
3479 3457
3480 3458
3481 MaybeObject* ExternalPixelArray::get(int index) { 3459 MaybeObject* ExternalUint8ClampedArray::get(int index) {
3482 return Smi::FromInt(static_cast<int>(get_scalar(index))); 3460 return Smi::FromInt(static_cast<int>(get_scalar(index)));
3483 } 3461 }
3484 3462
3485 3463
3486 void ExternalPixelArray::set(int index, uint8_t value) { 3464 void ExternalUint8ClampedArray::set(int index, uint8_t value) {
3487 ASSERT((index >= 0) && (index < this->length())); 3465 ASSERT((index >= 0) && (index < this->length()));
3488 uint8_t* ptr = external_pixel_pointer(); 3466 uint8_t* ptr = external_uint8_clamped_pointer();
3489 ptr[index] = value; 3467 ptr[index] = value;
3490 } 3468 }
3491 3469
3492 3470
3493 void* ExternalArray::external_pointer() { 3471 void* ExternalArray::external_pointer() {
3494 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset); 3472 intptr_t ptr = READ_INTPTR_FIELD(this, kExternalPointerOffset);
3495 return reinterpret_cast<void*>(ptr); 3473 return reinterpret_cast<void*>(ptr);
3496 } 3474 }
3497 3475
3498 3476
3499 void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) { 3477 void ExternalArray::set_external_pointer(void* value, WriteBarrierMode mode) {
3500 intptr_t ptr = reinterpret_cast<intptr_t>(value); 3478 intptr_t ptr = reinterpret_cast<intptr_t>(value);
3501 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr); 3479 WRITE_INTPTR_FIELD(this, kExternalPointerOffset, ptr);
3502 } 3480 }
3503 3481
3504 3482
3505 int8_t ExternalByteArray::get_scalar(int index) { 3483 int8_t ExternalInt8Array::get_scalar(int index) {
3506 ASSERT((index >= 0) && (index < this->length())); 3484 ASSERT((index >= 0) && (index < this->length()));
3507 int8_t* ptr = static_cast<int8_t*>(external_pointer()); 3485 int8_t* ptr = static_cast<int8_t*>(external_pointer());
3508 return ptr[index]; 3486 return ptr[index];
3509 } 3487 }
3510 3488
3511 3489
3512 MaybeObject* ExternalByteArray::get(int index) { 3490 MaybeObject* ExternalInt8Array::get(int index) {
3513 return Smi::FromInt(static_cast<int>(get_scalar(index))); 3491 return Smi::FromInt(static_cast<int>(get_scalar(index)));
3514 } 3492 }
3515 3493
3516 3494
3517 void ExternalByteArray::set(int index, int8_t value) { 3495 void ExternalInt8Array::set(int index, int8_t value) {
3518 ASSERT((index >= 0) && (index < this->length())); 3496 ASSERT((index >= 0) && (index < this->length()));
3519 int8_t* ptr = static_cast<int8_t*>(external_pointer()); 3497 int8_t* ptr = static_cast<int8_t*>(external_pointer());
3520 ptr[index] = value; 3498 ptr[index] = value;
3521 } 3499 }
3522 3500
3523 3501
3524 uint8_t ExternalUnsignedByteArray::get_scalar(int index) { 3502 uint8_t ExternalUint8Array::get_scalar(int index) {
3525 ASSERT((index >= 0) && (index < this->length())); 3503 ASSERT((index >= 0) && (index < this->length()));
3526 uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); 3504 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
3527 return ptr[index]; 3505 return ptr[index];
3528 } 3506 }
3529 3507
3530 3508
3531 MaybeObject* ExternalUnsignedByteArray::get(int index) { 3509 MaybeObject* ExternalUint8Array::get(int index) {
3532 return Smi::FromInt(static_cast<int>(get_scalar(index))); 3510 return Smi::FromInt(static_cast<int>(get_scalar(index)));
3533 } 3511 }
3534 3512
3535 3513
3536 void ExternalUnsignedByteArray::set(int index, uint8_t value) { 3514 void ExternalUint8Array::set(int index, uint8_t value) {
3537 ASSERT((index >= 0) && (index < this->length())); 3515 ASSERT((index >= 0) && (index < this->length()));
3538 uint8_t* ptr = static_cast<uint8_t*>(external_pointer()); 3516 uint8_t* ptr = static_cast<uint8_t*>(external_pointer());
3539 ptr[index] = value; 3517 ptr[index] = value;
3540 } 3518 }
3541 3519
3542 3520
3543 int16_t ExternalShortArray::get_scalar(int index) { 3521 int16_t ExternalInt16Array::get_scalar(int index) {
3544 ASSERT((index >= 0) && (index < this->length())); 3522 ASSERT((index >= 0) && (index < this->length()));
3545 int16_t* ptr = static_cast<int16_t*>(external_pointer()); 3523 int16_t* ptr = static_cast<int16_t*>(external_pointer());
3546 return ptr[index]; 3524 return ptr[index];
3547 } 3525 }
3548 3526
3549 3527
3550 MaybeObject* ExternalShortArray::get(int index) { 3528 MaybeObject* ExternalInt16Array::get(int index) {
3551 return Smi::FromInt(static_cast<int>(get_scalar(index))); 3529 return Smi::FromInt(static_cast<int>(get_scalar(index)));
3552 } 3530 }
3553 3531
3554 3532
3555 void ExternalShortArray::set(int index, int16_t value) { 3533 void ExternalInt16Array::set(int index, int16_t value) {
3556 ASSERT((index >= 0) && (index < this->length())); 3534 ASSERT((index >= 0) && (index < this->length()));
3557 int16_t* ptr = static_cast<int16_t*>(external_pointer()); 3535 int16_t* ptr = static_cast<int16_t*>(external_pointer());
3558 ptr[index] = value; 3536 ptr[index] = value;
3559 } 3537 }
3560 3538
3561 3539
3562 uint16_t ExternalUnsignedShortArray::get_scalar(int index) { 3540 uint16_t ExternalUint16Array::get_scalar(int index) {
3563 ASSERT((index >= 0) && (index < this->length())); 3541 ASSERT((index >= 0) && (index < this->length()));
3564 uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); 3542 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
3565 return ptr[index]; 3543 return ptr[index];
3566 } 3544 }
3567 3545
3568 3546
3569 MaybeObject* ExternalUnsignedShortArray::get(int index) { 3547 MaybeObject* ExternalUint16Array::get(int index) {
3570 return Smi::FromInt(static_cast<int>(get_scalar(index))); 3548 return Smi::FromInt(static_cast<int>(get_scalar(index)));
3571 } 3549 }
3572 3550
3573 3551
3574 void ExternalUnsignedShortArray::set(int index, uint16_t value) { 3552 void ExternalUint16Array::set(int index, uint16_t value) {
3575 ASSERT((index >= 0) && (index < this->length())); 3553 ASSERT((index >= 0) && (index < this->length()));
3576 uint16_t* ptr = static_cast<uint16_t*>(external_pointer()); 3554 uint16_t* ptr = static_cast<uint16_t*>(external_pointer());
3577 ptr[index] = value; 3555 ptr[index] = value;
3578 } 3556 }
3579 3557
3580 3558
3581 int32_t ExternalIntArray::get_scalar(int index) { 3559 int32_t ExternalInt32Array::get_scalar(int index) {
3582 ASSERT((index >= 0) && (index < this->length())); 3560 ASSERT((index >= 0) && (index < this->length()));
3583 int32_t* ptr = static_cast<int32_t*>(external_pointer()); 3561 int32_t* ptr = static_cast<int32_t*>(external_pointer());
3584 return ptr[index]; 3562 return ptr[index];
3585 } 3563 }
3586 3564
3587 3565
3588 MaybeObject* ExternalIntArray::get(int index) { 3566 MaybeObject* ExternalInt32Array::get(int index) {
3589 return GetHeap()->NumberFromInt32(get_scalar(index)); 3567 return GetHeap()->NumberFromInt32(get_scalar(index));
3590 } 3568 }
3591 3569
3592 3570
3593 void ExternalIntArray::set(int index, int32_t value) { 3571 void ExternalInt32Array::set(int index, int32_t value) {
3594 ASSERT((index >= 0) && (index < this->length())); 3572 ASSERT((index >= 0) && (index < this->length()));
3595 int32_t* ptr = static_cast<int32_t*>(external_pointer()); 3573 int32_t* ptr = static_cast<int32_t*>(external_pointer());
3596 ptr[index] = value; 3574 ptr[index] = value;
3597 } 3575 }
3598 3576
3599 3577
3600 uint32_t ExternalUnsignedIntArray::get_scalar(int index) { 3578 uint32_t ExternalUint32Array::get_scalar(int index) {
3601 ASSERT((index >= 0) && (index < this->length())); 3579 ASSERT((index >= 0) && (index < this->length()));
3602 uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); 3580 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
3603 return ptr[index]; 3581 return ptr[index];
3604 } 3582 }
3605 3583
3606 3584
3607 MaybeObject* ExternalUnsignedIntArray::get(int index) { 3585 MaybeObject* ExternalUint32Array::get(int index) {
3608 return GetHeap()->NumberFromUint32(get_scalar(index)); 3586 return GetHeap()->NumberFromUint32(get_scalar(index));
3609 } 3587 }
3610 3588
3611 3589
3612 void ExternalUnsignedIntArray::set(int index, uint32_t value) { 3590 void ExternalUint32Array::set(int index, uint32_t value) {
3613 ASSERT((index >= 0) && (index < this->length())); 3591 ASSERT((index >= 0) && (index < this->length()));
3614 uint32_t* ptr = static_cast<uint32_t*>(external_pointer()); 3592 uint32_t* ptr = static_cast<uint32_t*>(external_pointer());
3615 ptr[index] = value; 3593 ptr[index] = value;
3616 } 3594 }
3617 3595
3618 3596
3619 float ExternalFloatArray::get_scalar(int index) { 3597 float ExternalFloat32Array::get_scalar(int index) {
3620 ASSERT((index >= 0) && (index < this->length())); 3598 ASSERT((index >= 0) && (index < this->length()));
3621 float* ptr = static_cast<float*>(external_pointer()); 3599 float* ptr = static_cast<float*>(external_pointer());
3622 return ptr[index]; 3600 return ptr[index];
3623 } 3601 }
3624 3602
3625 3603
3626 MaybeObject* ExternalFloatArray::get(int index) { 3604 MaybeObject* ExternalFloat32Array::get(int index) {
3627 return GetHeap()->NumberFromDouble(get_scalar(index)); 3605 return GetHeap()->NumberFromDouble(get_scalar(index));
3628 } 3606 }
3629 3607
3630 3608
3631 void ExternalFloatArray::set(int index, float value) { 3609 void ExternalFloat32Array::set(int index, float value) {
3632 ASSERT((index >= 0) && (index < this->length())); 3610 ASSERT((index >= 0) && (index < this->length()));
3633 float* ptr = static_cast<float*>(external_pointer()); 3611 float* ptr = static_cast<float*>(external_pointer());
3634 ptr[index] = value; 3612 ptr[index] = value;
3635 } 3613 }
3636 3614
3637 3615
3638 double ExternalDoubleArray::get_scalar(int index) { 3616 double ExternalFloat64Array::get_scalar(int index) {
3639 ASSERT((index >= 0) && (index < this->length())); 3617 ASSERT((index >= 0) && (index < this->length()));
3640 double* ptr = static_cast<double*>(external_pointer()); 3618 double* ptr = static_cast<double*>(external_pointer());
3641 return ptr[index]; 3619 return ptr[index];
3642 } 3620 }
3643 3621
3644 3622
3645 MaybeObject* ExternalDoubleArray::get(int index) { 3623 MaybeObject* ExternalFloat64Array::get(int index) {
3646 return GetHeap()->NumberFromDouble(get_scalar(index)); 3624 return GetHeap()->NumberFromDouble(get_scalar(index));
3647 } 3625 }
3648 3626
3649 3627
3650 void ExternalDoubleArray::set(int index, double value) { 3628 void ExternalFloat64Array::set(int index, double value) {
3651 ASSERT((index >= 0) && (index < this->length())); 3629 ASSERT((index >= 0) && (index < this->length()));
3652 double* ptr = static_cast<double*>(external_pointer()); 3630 double* ptr = static_cast<double*>(external_pointer());
3653 ptr[index] = value; 3631 ptr[index] = value;
3654 } 3632 }
3655 3633
3656 3634
3657 int FixedTypedArrayBase::size() { 3635 int FixedTypedArrayBase::size() {
3658 InstanceType instance_type = map()->instance_type(); 3636 InstanceType instance_type = map()->instance_type();
3659 int element_size; 3637 int element_size;
3660 switch (instance_type) { 3638 switch (instance_type) {
(...skipping 23 matching lines...) Expand all
3684 3662
3685 3663
3686 template <class Traits> 3664 template <class Traits>
3687 typename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) { 3665 typename Traits::ElementType FixedTypedArray<Traits>::get_scalar(int index) {
3688 ASSERT((index >= 0) && (index < this->length())); 3666 ASSERT((index >= 0) && (index < this->length()));
3689 ElementType* ptr = reinterpret_cast<ElementType*>( 3667 ElementType* ptr = reinterpret_cast<ElementType*>(
3690 FIELD_ADDR(this, kDataOffset)); 3668 FIELD_ADDR(this, kDataOffset));
3691 return ptr[index]; 3669 return ptr[index];
3692 } 3670 }
3693 3671
3672
3673 template<> inline
3674 FixedTypedArray<Float64ArrayTraits>::ElementType
3675 FixedTypedArray<Float64ArrayTraits>::get_scalar(int index) {
3676 ASSERT((index >= 0) && (index < this->length()));
3677 return READ_DOUBLE_FIELD(this, ElementOffset(index));
3678 }
3679
3680
3694 template <class Traits> 3681 template <class Traits>
3695 void FixedTypedArray<Traits>::set(int index, ElementType value) { 3682 void FixedTypedArray<Traits>::set(int index, ElementType value) {
3696 ASSERT((index >= 0) && (index < this->length())); 3683 ASSERT((index >= 0) && (index < this->length()));
3697 ElementType* ptr = reinterpret_cast<ElementType*>( 3684 ElementType* ptr = reinterpret_cast<ElementType*>(
3698 FIELD_ADDR(this, kDataOffset)); 3685 FIELD_ADDR(this, kDataOffset));
3699 ptr[index] = value; 3686 ptr[index] = value;
3700 } 3687 }
3701 3688
3702 3689
3690 template<> inline
3691 void FixedTypedArray<Float64ArrayTraits>::set(
3692 int index, Float64ArrayTraits::ElementType value) {
3693 ASSERT((index >= 0) && (index < this->length()));
3694 WRITE_DOUBLE_FIELD(this, ElementOffset(index), value);
3695 }
3696
3697
3703 template <class Traits> 3698 template <class Traits>
3704 MaybeObject* FixedTypedArray<Traits>::get(int index) { 3699 MaybeObject* FixedTypedArray<Traits>::get(int index) {
3705 return Traits::ToObject(GetHeap(), get_scalar(index)); 3700 return Traits::ToObject(GetHeap(), get_scalar(index));
3706 } 3701 }
3707 3702
3708 template <class Traits> 3703 template <class Traits>
3709 MaybeObject* FixedTypedArray<Traits>::SetValue(uint32_t index, Object* value) { 3704 MaybeObject* FixedTypedArray<Traits>::SetValue(uint32_t index, Object* value) {
3710 ElementType cast_value = Traits::defaultValue(); 3705 ElementType cast_value = Traits::defaultValue();
3711 if (index < static_cast<uint32_t>(length())) { 3706 if (index < static_cast<uint32_t>(length())) {
3712 if (value->IsSmi()) { 3707 if (value->IsSmi()) {
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
3800 int Map::inobject_properties() { 3795 int Map::inobject_properties() {
3801 return READ_BYTE_FIELD(this, kInObjectPropertiesOffset); 3796 return READ_BYTE_FIELD(this, kInObjectPropertiesOffset);
3802 } 3797 }
3803 3798
3804 3799
3805 int Map::pre_allocated_property_fields() { 3800 int Map::pre_allocated_property_fields() {
3806 return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset); 3801 return READ_BYTE_FIELD(this, kPreAllocatedPropertyFieldsOffset);
3807 } 3802 }
3808 3803
3809 3804
3805 int Map::GetInObjectPropertyOffset(int index) {
3806 // Adjust for the number of properties stored in the object.
3807 index -= inobject_properties();
3808 ASSERT(index < 0);
3809 return instance_size() + (index * kPointerSize);
3810 }
3811
3812
3810 int HeapObject::SizeFromMap(Map* map) { 3813 int HeapObject::SizeFromMap(Map* map) {
3811 int instance_size = map->instance_size(); 3814 int instance_size = map->instance_size();
3812 if (instance_size != kVariableSizeSentinel) return instance_size; 3815 if (instance_size != kVariableSizeSentinel) return instance_size;
3813 // Only inline the most frequent cases. 3816 // Only inline the most frequent cases.
3814 int instance_type = static_cast<int>(map->instance_type()); 3817 int instance_type = static_cast<int>(map->instance_type());
3815 if (instance_type == FIXED_ARRAY_TYPE) { 3818 if (instance_type == FIXED_ARRAY_TYPE) {
3816 return FixedArray::BodyDescriptor::SizeOf(map, this); 3819 return FixedArray::BodyDescriptor::SizeOf(map, this);
3817 } 3820 }
3818 if (instance_type == ASCII_STRING_TYPE || 3821 if (instance_type == ASCII_STRING_TYPE ||
3819 instance_type == ASCII_INTERNALIZED_STRING_TYPE) { 3822 instance_type == ASCII_INTERNALIZED_STRING_TYPE) {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
3980 set_bit_field3(IsShared::update(bit_field3(), value)); 3983 set_bit_field3(IsShared::update(bit_field3(), value));
3981 } 3984 }
3982 3985
3983 3986
3984 bool Map::is_shared() { 3987 bool Map::is_shared() {
3985 return IsShared::decode(bit_field3()); 3988 return IsShared::decode(bit_field3());
3986 } 3989 }
3987 3990
3988 3991
3989 void Map::set_dictionary_map(bool value) { 3992 void Map::set_dictionary_map(bool value) {
3990 if (value) mark_unstable(); 3993 uint32_t new_bit_field3 = DictionaryMap::update(bit_field3(), value);
3991 set_bit_field3(DictionaryMap::update(bit_field3(), value)); 3994 new_bit_field3 = IsUnstable::update(new_bit_field3, value);
3995 set_bit_field3(new_bit_field3);
3992 } 3996 }
3993 3997
3994 3998
3995 bool Map::is_dictionary_map() { 3999 bool Map::is_dictionary_map() {
3996 return DictionaryMap::decode(bit_field3()); 4000 return DictionaryMap::decode(bit_field3());
3997 } 4001 }
3998 4002
3999 4003
4000 Code::Flags Code::flags() { 4004 Code::Flags Code::flags() {
4001 return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset)); 4005 return static_cast<Flags>(READ_INT_FIELD(this, kFlagsOffset));
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
4165 for (int g = kGroupCount - 1; g > group; g--) { 4169 for (int g = kGroupCount - 1; g > group; g--) {
4166 if (starts.at(g) < starts.at(g + 1)) { 4170 if (starts.at(g) < starts.at(g + 1)) {
4167 copy(starts.at(g), starts.at(g + 1)); 4171 copy(starts.at(g), starts.at(g + 1));
4168 } 4172 }
4169 } 4173 }
4170 } 4174 }
4171 4175
4172 4176
4173 void Code::set_flags(Code::Flags flags) { 4177 void Code::set_flags(Code::Flags flags) {
4174 STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1); 4178 STATIC_ASSERT(Code::NUMBER_OF_KINDS <= KindField::kMax + 1);
4175 // Make sure that all call stubs have an arguments count.
4176 ASSERT((ExtractKindFromFlags(flags) != CALL_IC &&
4177 ExtractKindFromFlags(flags) != KEYED_CALL_IC) ||
4178 ExtractArgumentsCountFromFlags(flags) >= 0);
4179 WRITE_INT_FIELD(this, kFlagsOffset, flags); 4179 WRITE_INT_FIELD(this, kFlagsOffset, flags);
4180 } 4180 }
4181 4181
4182 4182
4183 Code::Kind Code::kind() { 4183 Code::Kind Code::kind() {
4184 return ExtractKindFromFlags(flags()); 4184 return ExtractKindFromFlags(flags());
4185 } 4185 }
4186 4186
4187 4187
4188 InlineCacheState Code::ic_state() { 4188 InlineCacheState Code::ic_state() {
4189 InlineCacheState result = ExtractICStateFromFlags(flags()); 4189 InlineCacheState result = ExtractICStateFromFlags(flags());
4190 // Only allow uninitialized or debugger states for non-IC code 4190 // Only allow uninitialized or debugger states for non-IC code
4191 // objects. This is used in the debugger to determine whether or not 4191 // objects. This is used in the debugger to determine whether or not
4192 // a call to code object has been replaced with a debug break call. 4192 // a call to code object has been replaced with a debug break call.
4193 ASSERT(is_inline_cache_stub() || 4193 ASSERT(is_inline_cache_stub() ||
4194 result == UNINITIALIZED || 4194 result == UNINITIALIZED ||
4195 result == DEBUG_STUB); 4195 result == DEBUG_STUB);
4196 return result; 4196 return result;
4197 } 4197 }
4198 4198
4199 4199
4200 ExtraICState Code::extra_ic_state() { 4200 ExtraICState Code::extra_ic_state() {
4201 ASSERT((is_inline_cache_stub() && !needs_extended_extra_ic_state(kind())) 4201 ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB);
4202 || ic_state() == DEBUG_STUB);
4203 return ExtractExtraICStateFromFlags(flags()); 4202 return ExtractExtraICStateFromFlags(flags());
4204 } 4203 }
4205 4204
4206 4205
4207 ExtraICState Code::extended_extra_ic_state() {
4208 ASSERT(is_inline_cache_stub() || ic_state() == DEBUG_STUB);
4209 ASSERT(needs_extended_extra_ic_state(kind()));
4210 return ExtractExtendedExtraICStateFromFlags(flags());
4211 }
4212
4213
4214 Code::StubType Code::type() { 4206 Code::StubType Code::type() {
4215 return ExtractTypeFromFlags(flags()); 4207 return ExtractTypeFromFlags(flags());
4216 } 4208 }
4217 4209
4218 4210
4219 int Code::arguments_count() {
4220 ASSERT(is_call_stub() || is_keyed_call_stub() ||
4221 kind() == STUB || is_handler());
4222 return ExtractArgumentsCountFromFlags(flags());
4223 }
4224
4225
4226 // For initialization. 4211 // For initialization.
4227 void Code::set_raw_kind_specific_flags1(int value) { 4212 void Code::set_raw_kind_specific_flags1(int value) {
4228 WRITE_INT_FIELD(this, kKindSpecificFlags1Offset, value); 4213 WRITE_INT_FIELD(this, kKindSpecificFlags1Offset, value);
4229 } 4214 }
4230 4215
4231 4216
4232 void Code::set_raw_kind_specific_flags2(int value) { 4217 void Code::set_raw_kind_specific_flags2(int value) {
4233 WRITE_INT_FIELD(this, kKindSpecificFlags2Offset, value); 4218 WRITE_INT_FIELD(this, kKindSpecificFlags2Offset, value);
4234 } 4219 }
4235 4220
(...skipping 30 matching lines...) Expand all
4266 bool Code::has_major_key() { 4251 bool Code::has_major_key() {
4267 return kind() == STUB || 4252 return kind() == STUB ||
4268 kind() == HANDLER || 4253 kind() == HANDLER ||
4269 kind() == BINARY_OP_IC || 4254 kind() == BINARY_OP_IC ||
4270 kind() == COMPARE_IC || 4255 kind() == COMPARE_IC ||
4271 kind() == COMPARE_NIL_IC || 4256 kind() == COMPARE_NIL_IC ||
4272 kind() == LOAD_IC || 4257 kind() == LOAD_IC ||
4273 kind() == KEYED_LOAD_IC || 4258 kind() == KEYED_LOAD_IC ||
4274 kind() == STORE_IC || 4259 kind() == STORE_IC ||
4275 kind() == KEYED_STORE_IC || 4260 kind() == KEYED_STORE_IC ||
4276 kind() == KEYED_CALL_IC ||
4277 kind() == TO_BOOLEAN_IC; 4261 kind() == TO_BOOLEAN_IC;
4278 } 4262 }
4279 4263
4280 4264
4281 bool Code::optimizable() { 4265 bool Code::optimizable() {
4282 ASSERT_EQ(FUNCTION, kind()); 4266 ASSERT_EQ(FUNCTION, kind());
4283 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1; 4267 return READ_BYTE_FIELD(this, kOptimizableOffset) == 1;
4284 } 4268 }
4285 4269
4286 4270
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
4419 4403
4420 void Code::set_back_edges_patched_for_osr(bool value) { 4404 void Code::set_back_edges_patched_for_osr(bool value) {
4421 ASSERT_EQ(FUNCTION, kind()); 4405 ASSERT_EQ(FUNCTION, kind());
4422 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset); 4406 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags2Offset);
4423 int updated = BackEdgesPatchedForOSRField::update(previous, value); 4407 int updated = BackEdgesPatchedForOSRField::update(previous, value);
4424 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated); 4408 WRITE_UINT32_FIELD(this, kKindSpecificFlags2Offset, updated);
4425 } 4409 }
4426 4410
4427 4411
4428 4412
4429 CheckType Code::check_type() { 4413 byte Code::to_boolean_state() {
4430 ASSERT(is_call_stub() || is_keyed_call_stub()); 4414 return extra_ic_state();
4431 byte type = READ_BYTE_FIELD(this, kCheckTypeOffset);
4432 return static_cast<CheckType>(type);
4433 } 4415 }
4434 4416
4435 4417
4436 void Code::set_check_type(CheckType value) {
4437 ASSERT(is_call_stub() || is_keyed_call_stub());
4438 WRITE_BYTE_FIELD(this, kCheckTypeOffset, value);
4439 }
4440
4441
4442 byte Code::to_boolean_state() {
4443 return extended_extra_ic_state();
4444 }
4445
4446
4447 bool Code::has_function_cache() { 4418 bool Code::has_function_cache() {
4448 ASSERT(kind() == STUB); 4419 ASSERT(kind() == STUB);
4449 return HasFunctionCacheField::decode( 4420 return HasFunctionCacheField::decode(
4450 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset)); 4421 READ_UINT32_FIELD(this, kKindSpecificFlags1Offset));
4451 } 4422 }
4452 4423
4453 4424
4454 void Code::set_has_function_cache(bool flag) { 4425 void Code::set_has_function_cache(bool flag) {
4455 ASSERT(kind() == STUB); 4426 ASSERT(kind() == STUB);
4456 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset); 4427 int previous = READ_UINT32_FIELD(this, kKindSpecificFlags1Offset);
(...skipping 22 matching lines...) Expand all
4479 switch (kind) { 4450 switch (kind) {
4480 #define CASE(name) case name: return true; 4451 #define CASE(name) case name: return true;
4481 IC_KIND_LIST(CASE) 4452 IC_KIND_LIST(CASE)
4482 #undef CASE 4453 #undef CASE
4483 default: return false; 4454 default: return false;
4484 } 4455 }
4485 } 4456 }
4486 4457
4487 4458
4488 bool Code::is_keyed_stub() { 4459 bool Code::is_keyed_stub() {
4489 return is_keyed_load_stub() || is_keyed_store_stub() || is_keyed_call_stub(); 4460 return is_keyed_load_stub() || is_keyed_store_stub();
4490 } 4461 }
4491 4462
4492 4463
4493 bool Code::is_debug_stub() { 4464 bool Code::is_debug_stub() {
4494 return ic_state() == DEBUG_STUB; 4465 return ic_state() == DEBUG_STUB;
4495 } 4466 }
4496 4467
4497 4468
4498 ConstantPoolArray* Code::constant_pool() { 4469 ConstantPoolArray* Code::constant_pool() {
4499 return ConstantPoolArray::cast(READ_FIELD(this, kConstantPoolOffset)); 4470 return ConstantPoolArray::cast(READ_FIELD(this, kConstantPoolOffset));
4500 } 4471 }
4501 4472
4502 4473
4503 void Code::set_constant_pool(Object* value) { 4474 void Code::set_constant_pool(Object* value) {
4504 ASSERT(value->IsConstantPoolArray()); 4475 ASSERT(value->IsConstantPoolArray());
4505 WRITE_FIELD(this, kConstantPoolOffset, value); 4476 WRITE_FIELD(this, kConstantPoolOffset, value);
4506 WRITE_BARRIER(GetHeap(), this, kConstantPoolOffset, value); 4477 WRITE_BARRIER(GetHeap(), this, kConstantPoolOffset, value);
4507 } 4478 }
4508 4479
4509 4480
4510 Code::Flags Code::ComputeFlags(Kind kind, 4481 Code::Flags Code::ComputeFlags(Kind kind,
4511 InlineCacheState ic_state, 4482 InlineCacheState ic_state,
4512 ExtraICState extra_ic_state, 4483 ExtraICState extra_ic_state,
4513 StubType type, 4484 StubType type,
4514 int argc,
4515 InlineCacheHolderFlag holder) { 4485 InlineCacheHolderFlag holder) {
4516 ASSERT(argc <= Code::kMaxArguments);
4517 // Since the extended extra ic state overlaps with the argument count
4518 // for CALL_ICs, do so checks to make sure that they don't interfere.
4519 ASSERT((kind != Code::CALL_IC &&
4520 kind != Code::KEYED_CALL_IC) ||
4521 (ExtraICStateField::encode(extra_ic_state) | true));
4522 // Compute the bit mask. 4486 // Compute the bit mask.
4523 unsigned int bits = KindField::encode(kind) 4487 unsigned int bits = KindField::encode(kind)
4524 | ICStateField::encode(ic_state) 4488 | ICStateField::encode(ic_state)
4525 | TypeField::encode(type) 4489 | TypeField::encode(type)
4526 | ExtendedExtraICStateField::encode(extra_ic_state) 4490 | ExtraICStateField::encode(extra_ic_state)
4527 | CacheHolderField::encode(holder); 4491 | CacheHolderField::encode(holder);
4528 if (!Code::needs_extended_extra_ic_state(kind)) {
4529 bits |= (argc << kArgumentsCountShift);
4530 }
4531 return static_cast<Flags>(bits); 4492 return static_cast<Flags>(bits);
4532 } 4493 }
4533 4494
4534 4495
4535 Code::Flags Code::ComputeMonomorphicFlags(Kind kind, 4496 Code::Flags Code::ComputeMonomorphicFlags(Kind kind,
4536 ExtraICState extra_ic_state, 4497 ExtraICState extra_ic_state,
4537 InlineCacheHolderFlag holder, 4498 InlineCacheHolderFlag holder,
4538 StubType type, 4499 StubType type) {
4539 int argc) { 4500 return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, holder);
4540 return ComputeFlags(kind, MONOMORPHIC, extra_ic_state, type, argc, holder);
4541 } 4501 }
4542 4502
4543 4503
4504 Code::Flags Code::ComputeHandlerFlags(Kind handler_kind,
4505 StubType type,
4506 InlineCacheHolderFlag holder) {
4507 return ComputeFlags(Code::HANDLER, MONOMORPHIC, handler_kind, type, holder);
4508 }
4509
4510
4544 Code::Kind Code::ExtractKindFromFlags(Flags flags) { 4511 Code::Kind Code::ExtractKindFromFlags(Flags flags) {
4545 return KindField::decode(flags); 4512 return KindField::decode(flags);
4546 } 4513 }
4547 4514
4548 4515
4549 InlineCacheState Code::ExtractICStateFromFlags(Flags flags) { 4516 InlineCacheState Code::ExtractICStateFromFlags(Flags flags) {
4550 return ICStateField::decode(flags); 4517 return ICStateField::decode(flags);
4551 } 4518 }
4552 4519
4553 4520
4554 ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) { 4521 ExtraICState Code::ExtractExtraICStateFromFlags(Flags flags) {
4555 return ExtraICStateField::decode(flags); 4522 return ExtraICStateField::decode(flags);
4556 } 4523 }
4557 4524
4558 4525
4559 ExtraICState Code::ExtractExtendedExtraICStateFromFlags(
4560 Flags flags) {
4561 return ExtendedExtraICStateField::decode(flags);
4562 }
4563
4564
4565 Code::StubType Code::ExtractTypeFromFlags(Flags flags) { 4526 Code::StubType Code::ExtractTypeFromFlags(Flags flags) {
4566 return TypeField::decode(flags); 4527 return TypeField::decode(flags);
4567 } 4528 }
4568 4529
4569 4530
4570 int Code::ExtractArgumentsCountFromFlags(Flags flags) {
4571 return (flags & kArgumentsCountMask) >> kArgumentsCountShift;
4572 }
4573
4574
4575 InlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) { 4531 InlineCacheHolderFlag Code::ExtractCacheHolderFromFlags(Flags flags) {
4576 return CacheHolderField::decode(flags); 4532 return CacheHolderField::decode(flags);
4577 } 4533 }
4578 4534
4579 4535
4580 Code::Flags Code::RemoveTypeFromFlags(Flags flags) { 4536 Code::Flags Code::RemoveTypeFromFlags(Flags flags) {
4581 int bits = flags & ~TypeField::kMask; 4537 int bits = flags & ~TypeField::kMask;
4582 return static_cast<Flags>(bits); 4538 return static_cast<Flags>(bits);
4583 } 4539 }
4584 4540
4585 4541
4586 Code* Code::GetCodeFromTargetAddress(Address address) { 4542 Code* Code::GetCodeFromTargetAddress(Address address) {
4587 HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize); 4543 HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize);
4588 // GetCodeFromTargetAddress might be called when marking objects during mark 4544 // GetCodeFromTargetAddress might be called when marking objects during mark
4589 // sweep. reinterpret_cast is therefore used instead of the more appropriate 4545 // sweep. reinterpret_cast is therefore used instead of the more appropriate
4590 // Code::cast. Code::cast does not work when the object's map is 4546 // Code::cast. Code::cast does not work when the object's map is
4591 // marked. 4547 // marked.
4592 Code* result = reinterpret_cast<Code*>(code); 4548 Code* result = reinterpret_cast<Code*>(code);
4593 return result; 4549 return result;
4594 } 4550 }
4595 4551
4596 4552
4597 Object* Code::GetObjectFromEntryAddress(Address location_of_address) { 4553 Object* Code::GetObjectFromEntryAddress(Address location_of_address) {
4598 return HeapObject:: 4554 return HeapObject::
4599 FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize); 4555 FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize);
4600 } 4556 }
4601 4557
4602 4558
4559 bool Code::IsWeakObjectInOptimizedCode(Object* object) {
4560 ASSERT(is_optimized_code());
4561 if (object->IsMap()) {
4562 return Map::cast(object)->CanTransition() &&
4563 FLAG_collect_maps &&
4564 FLAG_weak_embedded_maps_in_optimized_code;
4565 }
4566 if (object->IsJSObject() ||
4567 (object->IsCell() && Cell::cast(object)->value()->IsJSObject())) {
4568 return FLAG_weak_embedded_objects_in_optimized_code;
4569 }
4570 return false;
4571 }
4572
4573
4603 Object* Map::prototype() { 4574 Object* Map::prototype() {
4604 return READ_FIELD(this, kPrototypeOffset); 4575 return READ_FIELD(this, kPrototypeOffset);
4605 } 4576 }
4606 4577
4607 4578
4608 void Map::set_prototype(Object* value, WriteBarrierMode mode) { 4579 void Map::set_prototype(Object* value, WriteBarrierMode mode) {
4609 ASSERT(value->IsNull() || value->IsJSReceiver()); 4580 ASSERT(value->IsNull() || value->IsJSReceiver());
4610 WRITE_FIELD(this, kPrototypeOffset, value); 4581 WRITE_FIELD(this, kPrototypeOffset, value);
4611 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode); 4582 CONDITIONAL_WRITE_BARRIER(GetHeap(), this, kPrototypeOffset, value, mode);
4612 } 4583 }
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
4704 Map* Map::elements_transition_map() { 4675 Map* Map::elements_transition_map() {
4705 int index = transitions()->Search(GetHeap()->elements_transition_symbol()); 4676 int index = transitions()->Search(GetHeap()->elements_transition_symbol());
4706 return transitions()->GetTarget(index); 4677 return transitions()->GetTarget(index);
4707 } 4678 }
4708 4679
4709 4680
4710 bool Map::CanHaveMoreTransitions() { 4681 bool Map::CanHaveMoreTransitions() {
4711 if (!HasTransitionArray()) return true; 4682 if (!HasTransitionArray()) return true;
4712 return FixedArray::SizeFor(transitions()->length() + 4683 return FixedArray::SizeFor(transitions()->length() +
4713 TransitionArray::kTransitionSize) 4684 TransitionArray::kTransitionSize)
4714 <= Page::kMaxNonCodeHeapObjectSize; 4685 <= Page::kMaxRegularHeapObjectSize;
4715 } 4686 }
4716 4687
4717 4688
4718 MaybeObject* Map::AddTransition(Name* key, 4689 MaybeObject* Map::AddTransition(Name* key,
4719 Map* target, 4690 Map* target,
4720 SimpleTransitionFlag flag) { 4691 SimpleTransitionFlag flag) {
4721 if (HasTransitionArray()) return transitions()->CopyInsert(key, target); 4692 if (HasTransitionArray()) return transitions()->CopyInsert(key, target);
4722 return TransitionArray::NewWith(flag, key, target, GetBackPointer()); 4693 return TransitionArray::NewWith(flag, key, target, GetBackPointer());
4723 } 4694 }
4724 4695
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
4782 } 4753 }
4783 4754
4784 4755
4785 void Map::set_transitions(TransitionArray* transition_array, 4756 void Map::set_transitions(TransitionArray* transition_array,
4786 WriteBarrierMode mode) { 4757 WriteBarrierMode mode) {
4787 // Transition arrays are not shared. When one is replaced, it should not 4758 // Transition arrays are not shared. When one is replaced, it should not
4788 // keep referenced objects alive, so we zap it. 4759 // keep referenced objects alive, so we zap it.
4789 // When there is another reference to the array somewhere (e.g. a handle), 4760 // When there is another reference to the array somewhere (e.g. a handle),
4790 // not zapping turns from a waste of memory into a source of crashes. 4761 // not zapping turns from a waste of memory into a source of crashes.
4791 if (HasTransitionArray()) { 4762 if (HasTransitionArray()) {
4763 #ifdef DEBUG
4764 for (int i = 0; i < transitions()->number_of_transitions(); i++) {
4765 Map* target = transitions()->GetTarget(i);
4766 if (target->instance_descriptors() == instance_descriptors()) {
4767 Name* key = transitions()->GetKey(i);
4768 int new_target_index = transition_array->Search(key);
4769 ASSERT(new_target_index != TransitionArray::kNotFound);
4770 ASSERT(transition_array->GetTarget(new_target_index) == target);
4771 }
4772 }
4773 #endif
4792 ASSERT(transitions() != transition_array); 4774 ASSERT(transitions() != transition_array);
4793 ZapTransitions(); 4775 ZapTransitions();
4794 } 4776 }
4795 4777
4796 WRITE_FIELD(this, kTransitionsOrBackPointerOffset, transition_array); 4778 WRITE_FIELD(this, kTransitionsOrBackPointerOffset, transition_array);
4797 CONDITIONAL_WRITE_BARRIER( 4779 CONDITIONAL_WRITE_BARRIER(
4798 GetHeap(), this, kTransitionsOrBackPointerOffset, transition_array, mode); 4780 GetHeap(), this, kTransitionsOrBackPointerOffset, transition_array, mode);
4799 } 4781 }
4800 4782
4801 4783
(...skipping 636 matching lines...) Expand 10 before | Expand all | Expand 10 after
5438 ASSERT(!GetHeap()->InNewSpace(value)); 5420 ASSERT(!GetHeap()->InNewSpace(value));
5439 Address entry = value->entry(); 5421 Address entry = value->entry();
5440 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry)); 5422 WRITE_INTPTR_FIELD(this, kCodeEntryOffset, reinterpret_cast<intptr_t>(entry));
5441 } 5423 }
5442 5424
5443 5425
5444 void JSFunction::ReplaceCode(Code* code) { 5426 void JSFunction::ReplaceCode(Code* code) {
5445 bool was_optimized = IsOptimized(); 5427 bool was_optimized = IsOptimized();
5446 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION; 5428 bool is_optimized = code->kind() == Code::OPTIMIZED_FUNCTION;
5447 5429
5448 if (was_optimized && is_optimized) {
5449 shared()->EvictFromOptimizedCodeMap(
5450 this->code(), "Replacing with another optimized code");
5451 }
5452
5453 set_code(code); 5430 set_code(code);
5454 5431
5455 // Add/remove the function from the list of optimized functions for this 5432 // Add/remove the function from the list of optimized functions for this
5456 // context based on the state change. 5433 // context based on the state change.
5457 if (!was_optimized && is_optimized) { 5434 if (!was_optimized && is_optimized) {
5458 context()->native_context()->AddOptimizedFunction(this); 5435 context()->native_context()->AddOptimizedFunction(this);
5459 } 5436 }
5460 if (was_optimized && !is_optimized) { 5437 if (was_optimized && !is_optimized) {
5461 // TODO(titzer): linear in the number of optimized functions; fix! 5438 // TODO(titzer): linear in the number of optimized functions; fix!
5462 context()->native_context()->RemoveOptimizedFunction(this); 5439 context()->native_context()->RemoveOptimizedFunction(this);
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
5675 JSDate* JSDate::cast(Object* obj) { 5652 JSDate* JSDate::cast(Object* obj) {
5676 ASSERT(obj->IsJSDate()); 5653 ASSERT(obj->IsJSDate());
5677 ASSERT(HeapObject::cast(obj)->Size() == JSDate::kSize); 5654 ASSERT(HeapObject::cast(obj)->Size() == JSDate::kSize);
5678 return reinterpret_cast<JSDate*>(obj); 5655 return reinterpret_cast<JSDate*>(obj);
5679 } 5656 }
5680 5657
5681 5658
5682 ACCESSORS(JSMessageObject, type, String, kTypeOffset) 5659 ACCESSORS(JSMessageObject, type, String, kTypeOffset)
5683 ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset) 5660 ACCESSORS(JSMessageObject, arguments, JSArray, kArgumentsOffset)
5684 ACCESSORS(JSMessageObject, script, Object, kScriptOffset) 5661 ACCESSORS(JSMessageObject, script, Object, kScriptOffset)
5685 ACCESSORS(JSMessageObject, stack_trace, Object, kStackTraceOffset)
5686 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset) 5662 ACCESSORS(JSMessageObject, stack_frames, Object, kStackFramesOffset)
5687 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset) 5663 SMI_ACCESSORS(JSMessageObject, start_position, kStartPositionOffset)
5688 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset) 5664 SMI_ACCESSORS(JSMessageObject, end_position, kEndPositionOffset)
5689 5665
5690 5666
5691 JSMessageObject* JSMessageObject::cast(Object* obj) { 5667 JSMessageObject* JSMessageObject::cast(Object* obj) {
5692 ASSERT(obj->IsJSMessageObject()); 5668 ASSERT(obj->IsJSMessageObject());
5693 ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize); 5669 ASSERT(HeapObject::cast(obj)->Size() == JSMessageObject::kSize);
5694 return reinterpret_cast<JSMessageObject*>(obj); 5670 return reinterpret_cast<JSMessageObject*>(obj);
5695 } 5671 }
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
5981 } 5957 }
5982 5958
5983 5959
5984 bool JSObject::HasExternalArrayElements() { 5960 bool JSObject::HasExternalArrayElements() {
5985 HeapObject* array = elements(); 5961 HeapObject* array = elements();
5986 ASSERT(array != NULL); 5962 ASSERT(array != NULL);
5987 return array->IsExternalArray(); 5963 return array->IsExternalArray();
5988 } 5964 }
5989 5965
5990 5966
5991 #define EXTERNAL_ELEMENTS_CHECK(name, type) \ 5967 #define EXTERNAL_ELEMENTS_CHECK(Type, type, TYPE, ctype, size) \
5992 bool JSObject::HasExternal##name##Elements() { \ 5968 bool JSObject::HasExternal##Type##Elements() { \
5993 HeapObject* array = elements(); \ 5969 HeapObject* array = elements(); \
5994 ASSERT(array != NULL); \ 5970 ASSERT(array != NULL); \
5995 if (!array->IsHeapObject()) \ 5971 if (!array->IsHeapObject()) \
5996 return false; \ 5972 return false; \
5997 return array->map()->instance_type() == type; \ 5973 return array->map()->instance_type() == EXTERNAL_##TYPE##_ARRAY_TYPE; \
5998 } 5974 }
5999 5975
5976 TYPED_ARRAYS(EXTERNAL_ELEMENTS_CHECK)
6000 5977
6001 EXTERNAL_ELEMENTS_CHECK(Byte, EXTERNAL_BYTE_ARRAY_TYPE) 5978 #undef EXTERNAL_ELEMENTS_CHECK
6002 EXTERNAL_ELEMENTS_CHECK(UnsignedByte, EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE)
6003 EXTERNAL_ELEMENTS_CHECK(Short, EXTERNAL_SHORT_ARRAY_TYPE)
6004 EXTERNAL_ELEMENTS_CHECK(UnsignedShort,
6005 EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE)
6006 EXTERNAL_ELEMENTS_CHECK(Int, EXTERNAL_INT_ARRAY_TYPE)
6007 EXTERNAL_ELEMENTS_CHECK(UnsignedInt,
6008 EXTERNAL_UNSIGNED_INT_ARRAY_TYPE)
6009 EXTERNAL_ELEMENTS_CHECK(Float,
6010 EXTERNAL_FLOAT_ARRAY_TYPE)
6011 EXTERNAL_ELEMENTS_CHECK(Double,
6012 EXTERNAL_DOUBLE_ARRAY_TYPE)
6013 EXTERNAL_ELEMENTS_CHECK(Pixel, EXTERNAL_PIXEL_ARRAY_TYPE)
6014 5979
6015 5980
6016 bool JSObject::HasFixedTypedArrayElements() { 5981 bool JSObject::HasFixedTypedArrayElements() {
6017 HeapObject* array = elements(); 5982 HeapObject* array = elements();
6018 ASSERT(array != NULL); 5983 ASSERT(array != NULL);
6019 return array->IsFixedTypedArrayBase(); 5984 return array->IsFixedTypedArrayBase();
6020 } 5985 }
6021 5986
6022 5987
6023 bool JSObject::HasNamedInterceptor() { 5988 bool JSObject::HasNamedInterceptor() {
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
6569 return GetHeap()->CopyFixedDoubleArray(this); 6534 return GetHeap()->CopyFixedDoubleArray(this);
6570 } 6535 }
6571 6536
6572 6537
6573 MaybeObject* ConstantPoolArray::Copy() { 6538 MaybeObject* ConstantPoolArray::Copy() {
6574 if (length() == 0) return this; 6539 if (length() == 0) return this;
6575 return GetHeap()->CopyConstantPoolArray(this); 6540 return GetHeap()->CopyConstantPoolArray(this);
6576 } 6541 }
6577 6542
6578 6543
6579 void TypeFeedbackCells::SetAstId(int index, TypeFeedbackId id) { 6544 Handle<Object> TypeFeedbackInfo::UninitializedSentinel(Isolate* isolate) {
6580 set(1 + index * 2, Smi::FromInt(id.ToInt()));
6581 }
6582
6583
6584 TypeFeedbackId TypeFeedbackCells::AstId(int index) {
6585 return TypeFeedbackId(Smi::cast(get(1 + index * 2))->value());
6586 }
6587
6588
6589 void TypeFeedbackCells::SetCell(int index, Cell* cell) {
6590 set(index * 2, cell);
6591 }
6592
6593
6594 Cell* TypeFeedbackCells::GetCell(int index) {
6595 return Cell::cast(get(index * 2));
6596 }
6597
6598
6599 Handle<Object> TypeFeedbackCells::UninitializedSentinel(Isolate* isolate) {
6600 return isolate->factory()->the_hole_value(); 6545 return isolate->factory()->the_hole_value();
6601 } 6546 }
6602 6547
6603 6548
6604 Handle<Object> TypeFeedbackCells::MegamorphicSentinel(Isolate* isolate) { 6549 Handle<Object> TypeFeedbackInfo::MegamorphicSentinel(Isolate* isolate) {
6605 return isolate->factory()->undefined_value(); 6550 return isolate->factory()->undefined_value();
6606 } 6551 }
6607 6552
6608 6553
6609 Handle<Object> TypeFeedbackCells::MonomorphicArraySentinel(Isolate* isolate, 6554 Handle<Object> TypeFeedbackInfo::MonomorphicArraySentinel(Isolate* isolate,
6610 ElementsKind elements_kind) { 6555 ElementsKind elements_kind) {
6611 return Handle<Object>(Smi::FromInt(static_cast<int>(elements_kind)), isolate); 6556 return Handle<Object>(Smi::FromInt(static_cast<int>(elements_kind)), isolate);
6612 } 6557 }
6613 6558
6614 6559
6615 Object* TypeFeedbackCells::RawUninitializedSentinel(Heap* heap) { 6560 Object* TypeFeedbackInfo::RawUninitializedSentinel(Heap* heap) {
6616 return heap->the_hole_value(); 6561 return heap->the_hole_value();
6617 } 6562 }
6618 6563
6619 6564
6620 int TypeFeedbackInfo::ic_total_count() { 6565 int TypeFeedbackInfo::ic_total_count() {
6621 int current = Smi::cast(READ_FIELD(this, kStorage1Offset))->value(); 6566 int current = Smi::cast(READ_FIELD(this, kStorage1Offset))->value();
6622 return ICTotalCountField::decode(current); 6567 return ICTotalCountField::decode(current);
6623 } 6568 }
6624 6569
6625 6570
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
6688 } 6633 }
6689 6634
6690 6635
6691 bool TypeFeedbackInfo::matches_inlined_type_change_checksum(int checksum) { 6636 bool TypeFeedbackInfo::matches_inlined_type_change_checksum(int checksum) {
6692 int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value(); 6637 int value = Smi::cast(READ_FIELD(this, kStorage2Offset))->value();
6693 int mask = (1 << kTypeChangeChecksumBits) - 1; 6638 int mask = (1 << kTypeChangeChecksumBits) - 1;
6694 return InlinedTypeChangeChecksum::decode(value) == (checksum & mask); 6639 return InlinedTypeChangeChecksum::decode(value) == (checksum & mask);
6695 } 6640 }
6696 6641
6697 6642
6698 ACCESSORS(TypeFeedbackInfo, type_feedback_cells, TypeFeedbackCells, 6643 ACCESSORS(TypeFeedbackInfo, feedback_vector, FixedArray,
6699 kTypeFeedbackCellsOffset) 6644 kFeedbackVectorOffset)
6700 6645
6701 6646
6702 SMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot) 6647 SMI_ACCESSORS(AliasedArgumentsEntry, aliased_context_slot, kAliasedContextSlot)
6703 6648
6704 6649
6705 Relocatable::Relocatable(Isolate* isolate) { 6650 Relocatable::Relocatable(Isolate* isolate) {
6706 isolate_ = isolate; 6651 isolate_ = isolate;
6707 prev_ = isolate->relocatable_top(); 6652 prev_ = isolate->relocatable_top();
6708 isolate->set_relocatable_top(this); 6653 isolate->set_relocatable_top(this);
6709 } 6654 }
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
6803 #undef READ_UINT32_FIELD 6748 #undef READ_UINT32_FIELD
6804 #undef WRITE_UINT32_FIELD 6749 #undef WRITE_UINT32_FIELD
6805 #undef READ_SHORT_FIELD 6750 #undef READ_SHORT_FIELD
6806 #undef WRITE_SHORT_FIELD 6751 #undef WRITE_SHORT_FIELD
6807 #undef READ_BYTE_FIELD 6752 #undef READ_BYTE_FIELD
6808 #undef WRITE_BYTE_FIELD 6753 #undef WRITE_BYTE_FIELD
6809 6754
6810 } } // namespace v8::internal 6755 } } // namespace v8::internal
6811 6756
6812 #endif // V8_OBJECTS_INL_H_ 6757 #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