Reviewers: Jakob,
Message:
ptal
Description:
Cleanup API property handling
BUG=v8:4137
LOG=n
Please review this at https://codereview.chromium.org/1226473003/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+21, -37 lines):
M src/api.cc
M src/objects.h
M src/objects.cc
M src/runtime/runtime-object.cc
Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index
0dbebc14e564aa93c441a0eb7d38bacea217de02..be8c200cac35788638863bdcf1c1346d49fdd767
100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -3568,16 +3568,9 @@ static i::MaybeHandle<i::Object>
DefineObjectProperty(
}
i::Handle<i::Name> name;
- if (key->IsName()) {
- name = i::Handle<i::Name>::cast(key);
- } else {
- // Call-back into JavaScript to convert the key to a string.
- i::Handle<i::Object> converted;
- ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, converted,
- i::Execution::ToString(isolate, key),
- i::MaybeHandle<i::Object>());
- name = i::Handle<i::String>::cast(converted);
- }
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, name,
+ i::Runtime::ToName(isolate, key),
+ i::MaybeHandle<i::Object>());
return i::JSObject::DefinePropertyOrElementIgnoreAttributes(js_object,
name,
value,
attrs);
@@ -3616,44 +3609,24 @@ bool v8::Object::ForceSet(v8::Handle<Value> key,
v8::Handle<Value> value,
}
-namespace {
-
-i::MaybeHandle<i::Object> DeleteObjectProperty(
+MUST_USE_RESULT
+static i::MaybeHandle<i::Object> DeleteObjectProperty(
i::Isolate* isolate, i::Handle<i::JSReceiver> receiver,
i::Handle<i::Object> 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<i::Name> name;
- if (key->IsName()) {
- name = i::Handle<i::Name>::cast(key);
- } else {
- // Call-back into JavaScript to convert the key to a string.
- i::Handle<i::Object> converted;
- if (!i::Execution::ToString(isolate, key).ToHandle(&converted)) {
- return i::MaybeHandle<i::Object>();
- }
- name = i::Handle<i::String>::cast(converted);
- }
+ ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, name,
+ i::Runtime::ToName(isolate, key),
+ i::MaybeHandle<i::Object>());
- return i::JSReceiver::DeleteProperty(receiver, name, language_mode);
+ return i::JSReceiver::DeletePropertyOrElement(receiver, name,
language_mode);
}
-} // namespace
-
MaybeLocal<Value> v8::Object::Get(Local<v8::Context> context,
Local<Value> key) {
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index
4eeb51d67c58d1a066dbd66d4abaf0eba8ea9dab..5941186dbdf9fed6a48669ae377c38e1ce7f5fcd
100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -5238,6 +5238,13 @@ MaybeHandle<Object>
JSReceiver::DeleteElement(Handle<JSReceiver> object,
MaybeHandle<Object> JSReceiver::DeleteProperty(Handle<JSReceiver> object,
Handle<Name> name,
LanguageMode language_mode)
{
+ LookupIterator it(object, name, LookupIterator::HIDDEN);
+ return JSObject::DeleteProperty(&it, language_mode);
+}
+
+
+MaybeHandle<Object> JSReceiver::DeletePropertyOrElement(
+ Handle<JSReceiver> object, Handle<Name> name, LanguageMode
language_mode) {
LookupIterator it = LookupIterator::PropertyOrElement(
name->GetIsolate(), object, name, LookupIterator::HIDDEN);
return JSObject::DeleteProperty(&it, language_mode);
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index
72d9265b485f090124dd9628f9fbd49a89a48f5e..b3c32ff870d711fc873de82be3b46c87ec0fe0e0
100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -1681,6 +1681,9 @@ class JSReceiver: public HeapObject {
Handle<JSReceiver> object, uint32_t index);
// Implementation of [[Delete]], ECMA-262 5th edition, section 8.12.7.
+ MUST_USE_RESULT static MaybeHandle<Object> DeletePropertyOrElement(
+ Handle<JSReceiver> object, Handle<Name> name,
+ LanguageMode language_mode = SLOPPY);
MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty(
Handle<JSReceiver> object, Handle<Name> name,
LanguageMode language_mode = SLOPPY);
Index: src/runtime/runtime-object.cc
diff --git a/src/runtime/runtime-object.cc b/src/runtime/runtime-object.cc
index
4f94f24a7ac0c2d0d0d9b6e66f5fa442dfa01c28..556f9745dafae7df16d031e936ff0ceba8ac3417
100644
--- a/src/runtime/runtime-object.cc
+++ b/src/runtime/runtime-object.cc
@@ -585,7 +585,8 @@ RUNTIME_FUNCTION(Runtime_DeleteProperty) {
CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 2);
Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, result, JSReceiver::DeleteProperty(object, key,
language_mode));
+ isolate, result,
+ JSReceiver::DeletePropertyOrElement(object, key, language_mode));
return *result;
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.