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

Side by Side Diff: src/objects.cc

Issue 10539131: Fix performance regression caused by r11202. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Added regression test. Created 8 years, 6 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.h ('k') | test/mjsunit/regress/regress-2156.js » ('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 1702 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 } 1713 }
1714 if (dict != result) set_properties(StringDictionary::cast(result)); 1714 if (dict != result) set_properties(StringDictionary::cast(result));
1715 return value; 1715 return value;
1716 } 1716 }
1717 1717
1718 1718
1719 MaybeObject* JSObject::AddProperty(String* name, 1719 MaybeObject* JSObject::AddProperty(String* name,
1720 Object* value, 1720 Object* value,
1721 PropertyAttributes attributes, 1721 PropertyAttributes attributes,
1722 StrictModeFlag strict_mode, 1722 StrictModeFlag strict_mode,
1723 JSReceiver::StoreFromKeyed store_mode) { 1723 JSReceiver::StoreFromKeyed store_mode,
1724 ExtensibilityCheck extensibility_check) {
1724 ASSERT(!IsJSGlobalProxy()); 1725 ASSERT(!IsJSGlobalProxy());
1725 Map* map_of_this = map(); 1726 Map* map_of_this = map();
1726 Heap* heap = GetHeap(); 1727 Heap* heap = GetHeap();
1727 if (!map_of_this->is_extensible()) { 1728 if (extensibility_check == PERFORM_EXTENSIBILITY_CHECK &&
1729 !map_of_this->is_extensible()) {
1728 if (strict_mode == kNonStrictMode) { 1730 if (strict_mode == kNonStrictMode) {
1729 return value; 1731 return value;
1730 } else { 1732 } else {
1731 Handle<Object> args[1] = {Handle<String>(name)}; 1733 Handle<Object> args[1] = {Handle<String>(name)};
1732 return heap->isolate()->Throw( 1734 return heap->isolate()->Throw(
1733 *FACTORY->NewTypeError("object_not_extensible", 1735 *FACTORY->NewTypeError("object_not_extensible",
1734 HandleVector(args, 1))); 1736 HandleVector(args, 1)));
1735 } 1737 }
1736 } 1738 }
1737 if (HasFastProperties()) { 1739 if (HasFastProperties()) {
(...skipping 18 matching lines...) Expand all
1756 } 1758 }
1757 } 1759 }
1758 return AddSlowProperty(name, value, attributes); 1760 return AddSlowProperty(name, value, attributes);
1759 } 1761 }
1760 1762
1761 1763
1762 MaybeObject* JSObject::SetPropertyPostInterceptor( 1764 MaybeObject* JSObject::SetPropertyPostInterceptor(
1763 String* name, 1765 String* name,
1764 Object* value, 1766 Object* value,
1765 PropertyAttributes attributes, 1767 PropertyAttributes attributes,
1766 StrictModeFlag strict_mode) { 1768 StrictModeFlag strict_mode,
1769 ExtensibilityCheck extensibility_check) {
1767 // Check local property, ignore interceptor. 1770 // Check local property, ignore interceptor.
1768 LookupResult result(GetIsolate()); 1771 LookupResult result(GetIsolate());
1769 LocalLookupRealNamedProperty(name, &result); 1772 LocalLookupRealNamedProperty(name, &result);
1770 if (result.IsFound()) { 1773 if (result.IsFound()) {
1771 // An existing property, a map transition or a null descriptor was 1774 // An existing property, a map transition or a null descriptor was
1772 // found. Use set property to handle all these cases. 1775 // found. Use set property to handle all these cases.
1773 return SetProperty(&result, name, value, attributes, strict_mode); 1776 return SetProperty(&result, name, value, attributes, strict_mode);
1774 } 1777 }
1775 bool done = false; 1778 bool done = false;
1776 MaybeObject* result_object; 1779 MaybeObject* result_object;
1777 result_object = 1780 result_object =
1778 SetPropertyViaPrototypes(name, value, attributes, strict_mode, &done); 1781 SetPropertyViaPrototypes(name, value, attributes, strict_mode, &done);
1779 if (done) return result_object; 1782 if (done) return result_object;
1780 // Add a new real property. 1783 // Add a new real property.
1781 return AddProperty(name, value, attributes, strict_mode); 1784 return AddProperty(name, value, attributes, strict_mode,
1785 MAY_BE_STORE_FROM_KEYED, extensibility_check);
1782 } 1786 }
1783 1787
1784 1788
1785 MaybeObject* JSObject::ReplaceSlowProperty(String* name, 1789 MaybeObject* JSObject::ReplaceSlowProperty(String* name,
1786 Object* value, 1790 Object* value,
1787 PropertyAttributes attributes) { 1791 PropertyAttributes attributes) {
1788 StringDictionary* dictionary = property_dictionary(); 1792 StringDictionary* dictionary = property_dictionary();
1789 int old_index = dictionary->FindEntry(name); 1793 int old_index = dictionary->FindEntry(name);
1790 int new_enumeration_index = 0; // 0 means "Use the next available index." 1794 int new_enumeration_index = 0; // 0 means "Use the next available index."
1791 if (old_index != -1) { 1795 if (old_index != -1) {
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1928 v8::Utils::ToLocal(value_unhole), 1932 v8::Utils::ToLocal(value_unhole),
1929 info); 1933 info);
1930 } 1934 }
1931 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 1935 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
1932 if (!result.IsEmpty()) return *value_handle; 1936 if (!result.IsEmpty()) return *value_handle;
1933 } 1937 }
1934 MaybeObject* raw_result = 1938 MaybeObject* raw_result =
1935 this_handle->SetPropertyPostInterceptor(*name_handle, 1939 this_handle->SetPropertyPostInterceptor(*name_handle,
1936 *value_handle, 1940 *value_handle,
1937 attributes, 1941 attributes,
1938 strict_mode); 1942 strict_mode,
1943 PERFORM_EXTENSIBILITY_CHECK);
1939 RETURN_IF_SCHEDULED_EXCEPTION(isolate); 1944 RETURN_IF_SCHEDULED_EXCEPTION(isolate);
1940 return raw_result; 1945 return raw_result;
1941 } 1946 }
1942 1947
1943 1948
1944 Handle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object, 1949 Handle<Object> JSReceiver::SetProperty(Handle<JSReceiver> object,
1945 Handle<String> key, 1950 Handle<String> key,
1946 Handle<Object> value, 1951 Handle<Object> value,
1947 PropertyAttributes attributes, 1952 PropertyAttributes attributes,
1948 StrictModeFlag strict_mode) { 1953 StrictModeFlag strict_mode) {
(...skipping 1708 matching lines...) Expand 10 before | Expand all | Expand 10 after
3657 &attributes)->ToObjectUnchecked(); 3662 &attributes)->ToObjectUnchecked();
3658 if (!lookup->IsUndefined()) { 3663 if (!lookup->IsUndefined()) {
3659 return StringDictionary::cast(lookup); 3664 return StringDictionary::cast(lookup);
3660 } 3665 }
3661 } 3666 }
3662 if (!create_if_absent) return GetHeap()->undefined_value(); 3667 if (!create_if_absent) return GetHeap()->undefined_value();
3663 const int kInitialSize = 5; 3668 const int kInitialSize = 5;
3664 MaybeObject* dict_alloc = StringDictionary::Allocate(kInitialSize); 3669 MaybeObject* dict_alloc = StringDictionary::Allocate(kInitialSize);
3665 StringDictionary* dictionary; 3670 StringDictionary* dictionary;
3666 if (!dict_alloc->To<StringDictionary>(&dictionary)) return dict_alloc; 3671 if (!dict_alloc->To<StringDictionary>(&dictionary)) return dict_alloc;
3667 // Using AddProperty or SetPropertyPostInterceptor here could fail, because 3672 MaybeObject* store_result =
3668 // object might be non-extensible. 3673 SetPropertyPostInterceptor(GetHeap()->hidden_symbol(),
3669 return HasFastProperties() 3674 dictionary,
3670 ? AddFastProperty(GetHeap()->hidden_symbol(), dictionary, DONT_ENUM) 3675 DONT_ENUM,
3671 : AddSlowProperty(GetHeap()->hidden_symbol(), dictionary, DONT_ENUM); 3676 kNonStrictMode,
3677 OMIT_EXTENSIBILITY_CHECK);
3678 if (store_result->IsFailure()) return store_result;
3679 return dictionary;
3672 } 3680 }
3673 3681
3674 3682
3675 MaybeObject* JSObject::SetHiddenPropertiesDictionary( 3683 MaybeObject* JSObject::SetHiddenPropertiesDictionary(
3676 StringDictionary* dictionary) { 3684 StringDictionary* dictionary) {
3677 ASSERT(!IsJSGlobalProxy()); 3685 ASSERT(!IsJSGlobalProxy());
3678 ASSERT(HasHiddenProperties()); 3686 ASSERT(HasHiddenProperties());
3679 if (HasFastProperties()) { 3687 if (HasFastProperties()) {
3680 // If the object has fast properties, check whether the first slot 3688 // If the object has fast properties, check whether the first slot
3681 // in the descriptor array matches the hidden symbol. Since the 3689 // in the descriptor array matches the hidden symbol. Since the
3682 // hidden symbols hash code is zero (and no other string has hash 3690 // hidden symbols hash code is zero (and no other string has hash
3683 // code zero) it will always occupy the first entry if present. 3691 // code zero) it will always occupy the first entry if present.
3684 DescriptorArray* descriptors = this->map()->instance_descriptors(); 3692 DescriptorArray* descriptors = this->map()->instance_descriptors();
3685 if ((descriptors->number_of_descriptors() > 0) && 3693 if ((descriptors->number_of_descriptors() > 0) &&
3686 (descriptors->GetKey(0) == GetHeap()->hidden_symbol())) { 3694 (descriptors->GetKey(0) == GetHeap()->hidden_symbol())) {
3687 if (descriptors->GetType(0) == FIELD) { 3695 if (descriptors->GetType(0) == FIELD) {
3688 this->FastPropertyAtPut(descriptors->GetFieldIndex(0), dictionary); 3696 this->FastPropertyAtPut(descriptors->GetFieldIndex(0), dictionary);
3689 return this; 3697 return this;
3690 } else { 3698 } else {
3691 ASSERT(descriptors->GetType(0) == NULL_DESCRIPTOR || 3699 ASSERT(descriptors->GetType(0) == NULL_DESCRIPTOR ||
3692 descriptors->GetType(0) == MAP_TRANSITION); 3700 descriptors->GetType(0) == MAP_TRANSITION);
3693 } 3701 }
3694 } 3702 }
3695 } 3703 }
3696 MaybeObject* store_result = 3704 MaybeObject* store_result =
3697 SetPropertyPostInterceptor(GetHeap()->hidden_symbol(), 3705 SetPropertyPostInterceptor(GetHeap()->hidden_symbol(),
3698 dictionary, 3706 dictionary,
3699 DONT_ENUM, 3707 DONT_ENUM,
3700 kNonStrictMode); 3708 kNonStrictMode,
3709 OMIT_EXTENSIBILITY_CHECK);
3701 if (store_result->IsFailure()) return store_result; 3710 if (store_result->IsFailure()) return store_result;
3702 return this; 3711 return this;
3703 } 3712 }
3704 3713
3705 3714
3706 MaybeObject* JSObject::DeletePropertyPostInterceptor(String* name, 3715 MaybeObject* JSObject::DeletePropertyPostInterceptor(String* name,
3707 DeleteMode mode) { 3716 DeleteMode mode) {
3708 // Check local property, ignore interceptor. 3717 // Check local property, ignore interceptor.
3709 LookupResult result(GetIsolate()); 3718 LookupResult result(GetIsolate());
3710 LocalLookupRealNamedProperty(name, &result); 3719 LocalLookupRealNamedProperty(name, &result);
(...skipping 9487 matching lines...) Expand 10 before | Expand all | Expand 10 after
13198 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); 13207 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER);
13199 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); 13208 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER);
13200 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); 13209 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER);
13201 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); 13210 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER);
13202 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); 13211 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER);
13203 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); 13212 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER);
13204 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); 13213 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER);
13205 } 13214 }
13206 13215
13207 } } // namespace v8::internal 13216 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | test/mjsunit/regress/regress-2156.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698