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

Side by Side Diff: src/objects.cc

Issue 6461022: Merge a number of assertion failure fixes to the 3.0 branch. (Closed) Base URL: http://v8.googlecode.com/svn/branches/3.0/
Patch Set: '' Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1687 matching lines...) Expand 10 before | Expand all | Expand 10 after
1698 } 1698 }
1699 if (result->type() == CALLBACKS) { 1699 if (result->type() == CALLBACKS) {
1700 return; 1700 return;
1701 } 1701 }
1702 } 1702 }
1703 } 1703 }
1704 result->NotFound(); 1704 result->NotFound();
1705 } 1705 }
1706 1706
1707 1707
1708 bool JSObject::SetElementWithCallbackSetterInPrototypes(uint32_t index, 1708 MaybeObject* JSObject::SetElementWithCallbackSetterInPrototypes(uint32_t index,
1709 Object* value) { 1709 Object* value,
1710 bool* found) {
1710 for (Object* pt = GetPrototype(); 1711 for (Object* pt = GetPrototype();
1711 pt != Heap::null_value(); 1712 pt != Heap::null_value();
1712 pt = pt->GetPrototype()) { 1713 pt = pt->GetPrototype()) {
1713 if (!JSObject::cast(pt)->HasDictionaryElements()) { 1714 if (!JSObject::cast(pt)->HasDictionaryElements()) {
1714 continue; 1715 continue;
1715 } 1716 }
1716 NumberDictionary* dictionary = JSObject::cast(pt)->element_dictionary(); 1717 NumberDictionary* dictionary = JSObject::cast(pt)->element_dictionary();
1717 int entry = dictionary->FindEntry(index); 1718 int entry = dictionary->FindEntry(index);
1718 if (entry != NumberDictionary::kNotFound) { 1719 if (entry != NumberDictionary::kNotFound) {
1719 Object* element = dictionary->ValueAt(entry);
1720 PropertyDetails details = dictionary->DetailsAt(entry); 1720 PropertyDetails details = dictionary->DetailsAt(entry);
1721 if (details.type() == CALLBACKS) { 1721 if (details.type() == CALLBACKS) {
1722 SetElementWithCallback(element, index, value, JSObject::cast(pt)); 1722 *found = true;
1723 return true; 1723 return SetElementWithCallback(
1724 dictionary->ValueAt(entry), index, value, JSObject::cast(pt));
1724 } 1725 }
1725 } 1726 }
1726 } 1727 }
1727 return false; 1728 *found = false;
1729 return Heap::the_hole_value();
1728 } 1730 }
1729 1731
1730 1732
1731 void JSObject::LookupInDescriptor(String* name, LookupResult* result) { 1733 void JSObject::LookupInDescriptor(String* name, LookupResult* result) {
1732 DescriptorArray* descriptors = map()->instance_descriptors(); 1734 DescriptorArray* descriptors = map()->instance_descriptors();
1733 int number = descriptors->SearchWithCache(name); 1735 int number = descriptors->SearchWithCache(name);
1734 if (number != DescriptorArray::kNotFound) { 1736 if (number != DescriptorArray::kNotFound) {
1735 result->DescriptorResult(this, descriptors->GetDetails(number), number); 1737 result->DescriptorResult(this, descriptors->GetDetails(number), number);
1736 } else { 1738 } else {
1737 result->NotFound(); 1739 result->NotFound();
(...skipping 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after
2767 return context->extension()->ReferencesObject(obj); 2769 return context->extension()->ReferencesObject(obj);
2768 } 2770 }
2769 } 2771 }
2770 2772
2771 // No references to object. 2773 // No references to object.
2772 return false; 2774 return false;
2773 } 2775 }
2774 2776
2775 2777
2776 MaybeObject* JSObject::PreventExtensions() { 2778 MaybeObject* JSObject::PreventExtensions() {
2779 if (IsJSGlobalProxy()) {
2780 Object* proto = GetPrototype();
2781 if (proto->IsNull()) return this;
2782 ASSERT(proto->IsJSGlobalObject());
2783 return JSObject::cast(proto)->PreventExtensions();
2784 }
2785
2777 // If there are fast elements we normalize. 2786 // If there are fast elements we normalize.
2778 if (HasFastElements()) { 2787 if (HasFastElements()) {
2779 Object* ok; 2788 Object* ok;
2780 { MaybeObject* maybe_ok = NormalizeElements(); 2789 { MaybeObject* maybe_ok = NormalizeElements();
2781 if (!maybe_ok->ToObject(&ok)) return maybe_ok; 2790 if (!maybe_ok->ToObject(&ok)) return maybe_ok;
2782 } 2791 }
2783 } 2792 }
2784 // Make sure that we never go back to fast case. 2793 // Make sure that we never go back to fast case.
2785 element_dictionary()->set_requires_slow_elements(); 2794 element_dictionary()->set_requires_slow_elements();
2786 2795
(...skipping 4163 matching lines...) Expand 10 before | Expand all | Expand 10 after
6950 ASSERT(HasFastElements()); 6959 ASSERT(HasFastElements());
6951 6960
6952 Object* elms_obj; 6961 Object* elms_obj;
6953 { MaybeObject* maybe_elms_obj = EnsureWritableFastElements(); 6962 { MaybeObject* maybe_elms_obj = EnsureWritableFastElements();
6954 if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj; 6963 if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj;
6955 } 6964 }
6956 FixedArray* elms = FixedArray::cast(elms_obj); 6965 FixedArray* elms = FixedArray::cast(elms_obj);
6957 uint32_t elms_length = static_cast<uint32_t>(elms->length()); 6966 uint32_t elms_length = static_cast<uint32_t>(elms->length());
6958 6967
6959 if (check_prototype && 6968 if (check_prototype &&
6960 (index >= elms_length || elms->get(index)->IsTheHole()) && 6969 (index >= elms_length || elms->get(index)->IsTheHole())) {
6961 SetElementWithCallbackSetterInPrototypes(index, value)) { 6970 bool found;
6962 return value; 6971 MaybeObject* result =
6972 SetElementWithCallbackSetterInPrototypes(index, value, &found);
6973 if (found) return result;
6963 } 6974 }
6964 6975
6965 6976
6966 // Check whether there is extra space in fixed array.. 6977 // Check whether there is extra space in fixed array..
6967 if (index < elms_length) { 6978 if (index < elms_length) {
6968 elms->set(index, value); 6979 elms->set(index, value);
6969 if (IsJSArray()) { 6980 if (IsJSArray()) {
6970 // Update the length of the array if needed. 6981 // Update the length of the array if needed.
6971 uint32_t array_length = 0; 6982 uint32_t array_length = 0;
6972 CHECK(JSArray::cast(this)->length()->ToArrayIndex(&array_length)); 6983 CHECK(JSArray::cast(this)->length()->ToArrayIndex(&array_length));
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
7084 Object* element = dictionary->ValueAt(entry); 7095 Object* element = dictionary->ValueAt(entry);
7085 PropertyDetails details = dictionary->DetailsAt(entry); 7096 PropertyDetails details = dictionary->DetailsAt(entry);
7086 if (details.type() == CALLBACKS) { 7097 if (details.type() == CALLBACKS) {
7087 return SetElementWithCallback(element, index, value, this); 7098 return SetElementWithCallback(element, index, value, this);
7088 } else { 7099 } else {
7089 dictionary->UpdateMaxNumberKey(index); 7100 dictionary->UpdateMaxNumberKey(index);
7090 dictionary->ValueAtPut(entry, value); 7101 dictionary->ValueAtPut(entry, value);
7091 } 7102 }
7092 } else { 7103 } else {
7093 // Index not already used. Look for an accessor in the prototype chain. 7104 // Index not already used. Look for an accessor in the prototype chain.
7094 if (check_prototype && 7105 if (check_prototype) {
7095 SetElementWithCallbackSetterInPrototypes(index, value)) { 7106 bool found;
7096 return value; 7107 MaybeObject* result =
7108 SetElementWithCallbackSetterInPrototypes(index, value, &found);
7109 if (found) return result;
7097 } 7110 }
7098 // When we set the is_extensible flag to false we always force 7111 // When we set the is_extensible flag to false we always force
7099 // the element into dictionary mode (and force them to stay there). 7112 // the element into dictionary mode (and force them to stay there).
7100 if (!map()->is_extensible()) { 7113 if (!map()->is_extensible()) {
7101 Handle<Object> number(Factory::NewNumberFromUint(index)); 7114 Handle<Object> number(Factory::NewNumberFromUint(index));
7102 Handle<String> index_string(Factory::NumberToString(number)); 7115 Handle<String> index_string(Factory::NumberToString(number));
7103 Handle<Object> args[1] = { index_string }; 7116 Handle<Object> args[1] = { index_string };
7104 return Top::Throw(*Factory::NewTypeError("object_not_extensible", 7117 return Top::Throw(*Factory::NewTypeError("object_not_extensible",
7105 HandleVector(args, 1))); 7118 HandleVector(args, 1)));
7106 } 7119 }
(...skipping 2771 matching lines...) Expand 10 before | Expand all | Expand 10 after
9878 if (break_point_objects()->IsUndefined()) return 0; 9891 if (break_point_objects()->IsUndefined()) return 0;
9879 // Single beak point. 9892 // Single beak point.
9880 if (!break_point_objects()->IsFixedArray()) return 1; 9893 if (!break_point_objects()->IsFixedArray()) return 1;
9881 // Multiple break points. 9894 // Multiple break points.
9882 return FixedArray::cast(break_point_objects())->length(); 9895 return FixedArray::cast(break_point_objects())->length();
9883 } 9896 }
9884 #endif 9897 #endif
9885 9898
9886 9899
9887 } } // namespace v8::internal 9900 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698