| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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_ |
| OLD | NEW |