From d550e818916e0c4f27062137e5202ac6bc98da01 Mon Sep 17 00:00:00 2001 From: verwaest Date: Thu, 2 Jul 2015 06:29:48 -0700 Subject: [PATCH] Cleanup API property handling BUG=v8:4137 LOG=n Review URL: https://codereview.chromium.org/1226473003 Cr-Commit-Position: refs/heads/master@{#29444} --- src/api.cc | 45 +++++++++---------------------------------- src/objects.cc | 7 +++++++ src/objects.h | 3 +++ src/runtime/runtime-object.cc | 3 ++- 4 files changed, 21 insertions(+), 37 deletions(-) diff --git a/src/api.cc b/src/api.cc index 62df2ca..2402725 100644 --- a/src/api.cc +++ b/src/api.cc @@ -3566,16 +3566,9 @@ static i::MaybeHandle DefineObjectProperty( } i::Handle name; - if (key->IsName()) { - name = i::Handle::cast(key); - } else { - // Call-back into JavaScript to convert the key to a string. - i::Handle converted; - ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, converted, - i::Execution::ToString(isolate, key), - i::MaybeHandle()); - name = i::Handle::cast(converted); - } + ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, name, + i::Runtime::ToName(isolate, key), + i::MaybeHandle()); return i::JSObject::DefinePropertyOrElementIgnoreAttributes(js_object, name, value, attrs); @@ -3614,44 +3607,24 @@ bool v8::Object::ForceSet(v8::Handle key, v8::Handle value, } -namespace { - -i::MaybeHandle DeleteObjectProperty( +MUST_USE_RESULT +static i::MaybeHandle DeleteObjectProperty( i::Isolate* isolate, i::Handle receiver, i::Handle key, i::LanguageMode language_mode) { // Check if the given key is an array index. uint32_t index = 0; if (key->ToArrayIndex(&index)) { - // In Firefox/SpiderMonkey, Safari and Opera you can access the - // characters of a string using [] notation. In the case of a - // String object we just need to redirect the deletion to the - // underlying string if the index is in range. Since the - // underlying string does nothing with the deletion, we can ignore - // such deletions. - if (receiver->IsStringObjectWithCharacterAt(index)) { - return isolate->factory()->false_value(); - } - return i::JSReceiver::DeleteElement(receiver, index, language_mode); } i::Handle name; - if (key->IsName()) { - name = i::Handle::cast(key); - } else { - // Call-back into JavaScript to convert the key to a string. - i::Handle converted; - if (!i::Execution::ToString(isolate, key).ToHandle(&converted)) { - return i::MaybeHandle(); - } - name = i::Handle::cast(converted); - } + ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, name, + i::Runtime::ToName(isolate, key), + i::MaybeHandle()); - return i::JSReceiver::DeleteProperty(receiver, name, language_mode); + return i::JSReceiver::DeletePropertyOrElement(receiver, name, language_mode); } -} // namespace - MaybeLocal v8::Object::Get(Local context, Local key) { diff --git a/src/objects.cc b/src/objects.cc index f272aa5..8e3522b 100644 --- a/src/objects.cc +++ b/src/objects.cc @@ -5288,6 +5288,13 @@ MaybeHandle JSReceiver::DeleteElement(Handle object, MaybeHandle JSReceiver::DeleteProperty(Handle object, Handle name, LanguageMode language_mode) { + LookupIterator it(object, name, LookupIterator::HIDDEN); + return JSObject::DeleteProperty(&it, language_mode); +} + + +MaybeHandle JSReceiver::DeletePropertyOrElement( + Handle object, Handle name, LanguageMode language_mode) { LookupIterator it = LookupIterator::PropertyOrElement( name->GetIsolate(), object, name, LookupIterator::HIDDEN); return JSObject::DeleteProperty(&it, language_mode); diff --git a/src/objects.h b/src/objects.h index 7150766..618d9ad 100644 --- a/src/objects.h +++ b/src/objects.h @@ -1687,6 +1687,9 @@ class JSReceiver: public HeapObject { Handle object, uint32_t index); // Implementation of [[Delete]], ECMA-262 5th edition, section 8.12.7. + MUST_USE_RESULT static MaybeHandle DeletePropertyOrElement( + Handle object, Handle name, + LanguageMode language_mode = SLOPPY); MUST_USE_RESULT static MaybeHandle DeleteProperty( Handle object, Handle name, LanguageMode language_mode = SLOPPY); diff --git a/src/runtime/runtime-object.cc b/src/runtime/runtime-object.cc index 8343958..55c6691 100644 --- a/src/runtime/runtime-object.cc +++ b/src/runtime/runtime-object.cc @@ -596,7 +596,8 @@ RUNTIME_FUNCTION(Runtime_DeleteProperty) { CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 2); Handle result; ASSIGN_RETURN_FAILURE_ON_EXCEPTION( - isolate, result, JSReceiver::DeleteProperty(object, key, language_mode)); + isolate, result, + JSReceiver::DeletePropertyOrElement(object, key, language_mode)); return *result; } -- 2.7.4