Chromium Code Reviews| Index: src/api.cc |
| diff --git a/src/api.cc b/src/api.cc |
| index 808def3b0fad215568c02b494e8faac6b5249c5b..ab5d388745109bf0fa11b4c60ec842d6c2b9e169 100644 |
| --- a/src/api.cc |
| +++ b/src/api.cc |
| @@ -3461,6 +3461,99 @@ bool v8::Object::Set(uint32_t index, v8::Handle<Value> value) { |
| } |
| +Maybe<bool> v8::Object::CreateDataProperty(v8::Local<v8::Context> context, |
| + v8::Local<Name> key, |
| + v8::Local<Value> value) { |
| + PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::CreateDataProperty()", |
| + bool); |
| + auto self = Utils::OpenHandle(this); |
| + auto key_obj = Utils::OpenHandle(*key); |
| + auto value_obj = Utils::OpenHandle(*value); |
| + if (!self->IsExtensible()) return Just(false); |
| + |
| + uint32_t index = 0; |
| + if (key_obj->AsArrayIndex(&index)) { |
| + return CreateDataProperty(context, index, value); |
| + } |
| + |
| + // Special case for Array.length. |
| + if (self->IsJSArray() && |
| + key->StrictEquals(Utils::ToLocal( |
| + isolate->factory()->NewStringFromStaticChars("length")))) { |
|
Toon Verwaest
2015/05/27 09:50:06
isolate->factory()->length_string()
|
| + // Length is not configurable, however, CreateDataProperty always attempts |
| + // to create a configurable property, so we just fail here. |
| + return Just(false); |
| + } |
| + |
| + i::LookupIterator it(self, key_obj, i::LookupIterator::OWN_SKIP_INTERCEPTOR); |
| + if (it.IsFound() && it.state() == i::LookupIterator::ACCESS_CHECK) { |
| + if (!isolate->MayAccess(self)) return Just(false); |
| + it.Next(); |
| + } |
| + |
| + if (it.state() == i::LookupIterator::DATA || |
| + it.state() == i::LookupIterator::ACCESSOR) { |
| + if (it.property_details().attributes() & DONT_DELETE) return Just(false); |
|
Toon Verwaest
2015/05/27 09:50:06
!it.IsConfigurable()
|
| + |
| + if (it.state() == i::LookupIterator::ACCESSOR) { |
| + has_pending_exception = i::JSObject::SetOwnPropertyIgnoreAttributes( |
| + self, key_obj, value_obj, NONE, |
| + i::JSObject::DONT_FORCE_FIELD).is_null(); |
| + RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); |
| + return Just(true); |
| + } |
| + } |
| + |
| + has_pending_exception = i::Runtime::DefineObjectProperty( |
| + self, key_obj, value_obj, NONE).is_null(); |
| + RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); |
| + return Just(true); |
| +} |
| + |
| + |
| +Maybe<bool> v8::Object::CreateDataProperty(v8::Local<v8::Context> context, |
| + uint32_t index, |
| + v8::Local<Value> value) { |
| + PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Object::CreateDataProperty()", |
| + bool); |
| + auto self = Utils::OpenHandle(this); |
| + auto value_obj = Utils::OpenHandle(*value); |
| + if (!self->IsExtensible()) return Just(false); |
| + |
| + if (self->IsJSArray()) { |
| + size_t length = |
| + i::NumberToSize(isolate, i::Handle<i::JSArray>::cast(self)->length()); |
| + if (index >= length) { |
| + i::Handle<i::Object> args[] = { |
| + self, isolate->factory()->Uint32ToString(index), value_obj}; |
| + i::Handle<i::Object> result; |
| + has_pending_exception = |
| + !CallV8HeapFunction(isolate, "$objectDefineArrayProperty", |
| + isolate->factory()->undefined_value(), |
| + arraysize(args), args).ToHandle(&result); |
| + RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); |
| + return Just(result->BooleanValue()); |
| + } |
| + } |
| + |
| + if (self->IsAccessCheckNeeded() && !isolate->MayAccess(self)) { |
|
Toon Verwaest
2015/05/27 09:50:06
According to https://etherpad.mozilla.org/html5-c
|
| + return Just(false); |
| + } |
| + |
| + Maybe<PropertyAttributes> attributes = |
| + i::JSReceiver::GetOwnElementAttribute(self, index); |
| + if (attributes.IsJust() && attributes.FromJust() & DONT_DELETE) { |
| + return Just(false); |
| + } |
| + |
| + has_pending_exception = i::Runtime::DefineObjectProperty( |
| + self, isolate->factory()->Uint32ToString(index), |
| + value_obj, NONE).is_null(); |
| + RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); |
| + return Just(true); |
| +} |
| + |
| + |
| Maybe<bool> v8::Object::ForceSet(v8::Local<v8::Context> context, |
| v8::Local<Value> key, v8::Local<Value> value, |
| v8::PropertyAttribute attribs) { |