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); |
} |