Chromium Code Reviews| Index: src/api-natives.cc | 
| diff --git a/src/api-natives.cc b/src/api-natives.cc | 
| index 72c9208992c72662f38c7a4381153b8326eb2e12..e6fc28e9ef07912a16c1462568f6ba920c789547 100644 | 
| --- a/src/api-natives.cc | 
| +++ b/src/api-natives.cc | 
| @@ -37,11 +37,12 @@ MaybeHandle<Object> Instantiate(Isolate* isolate, Handle<Object> data, | 
| } | 
| -MaybeHandle<Object> DefineAccessorProperty( | 
| - Isolate* isolate, Handle<JSObject> object, Handle<Name> name, | 
| - Handle<Object> getter, Handle<Object> setter, Smi* attributes) { | 
| - DCHECK(PropertyDetails::AttributesField::is_valid( | 
| - static_cast<PropertyAttributes>(attributes->value()))); | 
| +MaybeHandle<Object> DefineAccessorProperty(Isolate* isolate, | 
| + Handle<JSObject> object, | 
| + Handle<Name> name, | 
| + Handle<Object> getter, | 
| + Handle<Object> setter, | 
| + PropertyAttributes attributes) { | 
| if (!getter->IsUndefined()) { | 
| ASSIGN_RETURN_ON_EXCEPTION( | 
| isolate, getter, | 
| @@ -56,10 +57,8 @@ MaybeHandle<Object> DefineAccessorProperty( | 
| Handle<FunctionTemplateInfo>::cast(setter)), | 
| Object); | 
| } | 
| - RETURN_ON_EXCEPTION(isolate, | 
| - JSObject::DefineAccessor( | 
| - object, name, getter, setter, | 
| - static_cast<PropertyAttributes>(attributes->value())), | 
| + RETURN_ON_EXCEPTION(isolate, JSObject::DefineAccessor(object, name, getter, | 
| + setter, attributes), | 
| Object); | 
| return object; | 
| } | 
| @@ -69,13 +68,7 @@ MaybeHandle<Object> DefineDataProperty(Isolate* isolate, | 
| Handle<JSObject> object, | 
| Handle<Name> name, | 
| Handle<Object> prop_data, | 
| - Smi* unchecked_attributes) { | 
| - DCHECK((unchecked_attributes->value() & | 
| - ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 
| - // Compute attributes. | 
| - PropertyAttributes attributes = | 
| - static_cast<PropertyAttributes>(unchecked_attributes->value()); | 
| - | 
| + PropertyAttributes attributes) { | 
| Handle<Object> value; | 
| ASSIGN_RETURN_ON_EXCEPTION(isolate, value, | 
| Instantiate(isolate, prop_data, name), Object); | 
| @@ -150,21 +143,36 @@ MaybeHandle<JSObject> ConfigureInstance(Isolate* isolate, Handle<JSObject> obj, | 
| HandleScope scope(isolate); | 
| // Disable access checks while instantiating the object. | 
| AccessCheckDisableScope access_check_scope(isolate, obj); | 
| - for (int i = 0; i < properties.length();) { | 
| + | 
| + int i = 0; | 
| + for (int c = 0; c < data->number_of_properties(); c++) { | 
| int length = Smi::cast(properties.get(i))->value(); | 
| - if (length == 3) { | 
| - auto name = handle(Name::cast(properties.get(i + 1)), isolate); | 
| - auto prop_data = handle(properties.get(i + 2), isolate); | 
| - auto attributes = Smi::cast(properties.get(i + 3)); | 
| + PropertyKind kind = length == 3 ? kData : kAccessor; | 
| 
 
Igor Sheludko
2015/07/03 13:56:40
Instead of writing a length we could pack kind and
 
 | 
| + auto name = handle(Name::cast(properties.get(i + 1)), isolate); | 
| + auto unchecked_attributes = Smi::cast(properties.get(i + 2)); | 
| + PropertyAttributes attributes = | 
| + static_cast<PropertyAttributes>(unchecked_attributes->value()); | 
| + DCHECK(PropertyDetails::AttributesField::is_valid(attributes)); | 
| + | 
| + if (TransitionArray::SearchTransition(obj->map(), kind, *name, | 
| 
 
Igor Sheludko
2015/07/03 13:56:40
Put this call after all the simple checks.
 
 | 
| + attributes) == NULL && | 
| + obj->map()->owns_descriptors() && | 
| + obj->map()->instance_descriptors()->length() != 0 && | 
| + obj->map()->instance_descriptors()->NumberOfSlackDescriptors() == 0) { | 
| + Map::EnsureDescriptorSlack(handle(obj->map()), | 
| + data->number_of_properties() - c); | 
| + } | 
| + | 
| + if (kind == kData) { | 
| + auto prop_data = handle(properties.get(i + 3), isolate); | 
| + | 
| RETURN_ON_EXCEPTION(isolate, DefineDataProperty(isolate, obj, name, | 
| prop_data, attributes), | 
| JSObject); | 
| } else { | 
| - DCHECK(length == 4); | 
| - auto name = handle(Name::cast(properties.get(i + 1)), isolate); | 
| - auto getter = handle(properties.get(i + 2), isolate); | 
| - auto setter = handle(properties.get(i + 3), isolate); | 
| - auto attributes = Smi::cast(properties.get(i + 4)); | 
| + DCHECK_EQ(4, length); | 
| + auto getter = handle(properties.get(i + 3), isolate); | 
| + auto setter = handle(properties.get(i + 4), isolate); | 
| RETURN_ON_EXCEPTION(isolate, | 
| DefineAccessorProperty(isolate, obj, name, getter, | 
| setter, attributes), | 
| @@ -311,6 +319,7 @@ void AddPropertyToPropertyList(Isolate* isolate, Handle<TemplateInfo> templ, | 
| list = NeanderArray(isolate).value(); | 
| templ->set_property_list(*list); | 
| } | 
| + templ->set_number_of_properties(templ->number_of_properties() + 1); | 
| NeanderArray array(list); | 
| array.add(isolate, isolate->factory()->NewNumberFromInt(length)); | 
| for (int i = 0; i < length; i++) { | 
| @@ -364,7 +373,7 @@ void ApiNatives::AddDataProperty(Isolate* isolate, Handle<TemplateInfo> info, | 
| DCHECK(Smi::IsValid(static_cast<int>(attributes))); | 
| auto attribute_handle = | 
| handle(Smi::FromInt(static_cast<int>(attributes)), isolate); | 
| - Handle<Object> data[kSize] = {name, value, attribute_handle}; | 
| + Handle<Object> data[kSize] = {name, attribute_handle, value}; | 
| AddPropertyToPropertyList(isolate, info, kSize, data); | 
| } | 
| @@ -379,7 +388,7 @@ void ApiNatives::AddAccessorProperty(Isolate* isolate, | 
| DCHECK(Smi::IsValid(static_cast<int>(attributes))); | 
| auto attribute_handle = | 
| handle(Smi::FromInt(static_cast<int>(attributes)), isolate); | 
| - Handle<Object> data[kSize] = {name, getter, setter, attribute_handle}; | 
| + Handle<Object> data[kSize] = {name, attribute_handle, getter, setter}; | 
| AddPropertyToPropertyList(isolate, info, kSize, data); | 
| } |