Chromium Code Reviews| Index: src/objects.cc |
| =================================================================== |
| --- src/objects.cc (revision 3879) |
| +++ src/objects.cc (working copy) |
| @@ -4820,6 +4820,46 @@ |
| } |
| +bool SharedFunctionInfo::CanGenerateInlineConstructor(Object* prototype) { |
| + // Check the basic conditions for generating inline constructor code. |
| + if (!FLAG_inline_new |
| + || !has_only_simple_this_property_assignments() |
| + || !this_property_assignments_count() > 0) { |
| + return false; |
| + } |
| + |
| + // If the prototype is null inline constructors cause no problems. |
| + if (!prototype->IsJSObject()) { |
| + ASSERT(prototype->IsNull()); |
| + return true; |
| + } |
| + |
| + // Traverse the proposed prototype chain looking for setters for properties of |
| + // the same names as are set by the inline constructor.. |
|
Mads Ager (chromium)
2010/02/18 09:19:35
.. -> .
Søren Thygesen Gjesse
2010/02/18 09:42:52
http://codereview.chromium.org/647007
|
| + for (Object* obj = prototype; |
| + obj != Heap::null_value(); |
| + obj = obj->GetPrototype()) { |
| + JSObject* js_object = JSObject::cast(obj); |
| + if (!js_object->HasFastProperties()) { |
| + // Only allow fast case objects, as the map check in the inline |
| + // constructor which check for changes to the prototype chain cannot |
| + // handle dictionary case objects. |
| + return false; |
| + } |
| + for (int i = 0; i < this_property_assignments_count(); i++) { |
| + LookupResult result; |
| + String* name = GetThisPropertyAssignmentName(i); |
| + js_object->LocalLookupRealNamedProperty(name, &result); |
| + if (result.IsValid() && result.type() == CALLBACKS) { |
| + return false; |
| + } |
| + } |
| + } |
| + |
| + return true; |
| +} |
| + |
| + |
| void SharedFunctionInfo::SetThisPropertyAssignmentsInfo( |
| bool only_simple_this_property_assignments, |
| FixedArray* assignments) { |
| @@ -4875,7 +4915,6 @@ |
| } |
| - |
| // Support function for printing the source code to a StringStream |
| // without any allocation in the heap. |
| void SharedFunctionInfo::SourceCodePrint(StringStream* accumulator, |
| @@ -7230,61 +7269,6 @@ |
| } |
| -static bool CallbacksObjectHasSetter(Object* callbacks) { |
| - if (!callbacks->IsFixedArray()) { |
| - ASSERT(callbacks->IsAccessorInfo() || callbacks->IsProxy()); |
| - return true; |
| - } else { |
| - Object* setter = (FixedArray::cast(callbacks))->get(kSetterIndex); |
| - if (setter->IsJSFunction()) { |
| - return true; |
| - } |
| - } |
| - |
| - return false; |
| -} |
| - |
| - |
| -bool JSObject::HasSetter() { |
| - for (Object* obj = this; |
| - obj != Heap::null_value(); |
| - obj = JSObject::cast(obj)->GetPrototype()) { |
| - JSObject* js_object = JSObject::cast(obj); |
| - if (js_object->HasFastProperties()) { |
| - DescriptorArray* descs = js_object->map()->instance_descriptors(); |
| - for (int i = 0; i < descs->number_of_descriptors(); i++) { |
| - PropertyDetails details = descs->GetDetails(i); |
| - if (details.type() == CALLBACKS) { |
| - Object* callbacks = descs->GetCallbacksObject(i); |
| - if (CallbacksObjectHasSetter(callbacks)) { |
| - return true; |
| - } |
| - } |
| - } |
| - } else { |
| - StringDictionary* dict = js_object->property_dictionary(); |
| - int capacity = dict->Capacity(); |
| - for (int i = 0; i < capacity; i++) { |
| - Object* k = dict->KeyAt(i); |
| - if (dict->IsKey(k)) { |
| - PropertyType type = dict->DetailsAt(i).type(); |
| - ASSERT(type != FIELD); |
| - if (type == CALLBACKS) { |
| - Object* callbacks = dict->ValueAt(i); |
| - if (CallbacksObjectHasSetter(callbacks)) { |
| - return true; |
| - } |
| - } |
| - } |
| - } |
| - } |
| - } |
| - |
| - return false; |
| -} |
| - |
| - |
| - |
| Object* PixelArray::SetValue(uint32_t index, Object* value) { |
| uint8_t clamped_value = 0; |
| if (index < static_cast<uint32_t>(length())) { |