Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(915)

Unified Diff: src/objects.cc

Issue 2620943002: [ESnext] Implement Object Rest (Closed)
Patch Set: fix nits Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/objects.h ('k') | src/parsing/parser.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 4ddbdd8a5f9ff91329614d660006beb861c5b18a..f8ecab355e082c2f38bf7f6ac9ac04b09e6c8220 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -2003,8 +2003,21 @@ Maybe<bool> JSReceiver::HasInPrototypeChain(Isolate* isolate,
namespace {
-MUST_USE_RESULT Maybe<bool> FastAssign(Handle<JSReceiver> target,
- Handle<Object> source, bool use_set) {
+bool HasExcludedProperty(const ScopedVector<Handle<Name>>* excluded_properties,
+ Handle<Object> search_element) {
+ // TODO(gsathya): Change this to be a hashtable.
+ for (int i = 0; i < excluded_properties->length(); i++) {
+ if (search_element->SameValue(*excluded_properties->at(i))) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+MUST_USE_RESULT Maybe<bool> FastAssign(
+ Handle<JSReceiver> target, Handle<Object> source,
+ const ScopedVector<Handle<Name>>* excluded_properties, bool use_set) {
// Non-empty strings are the only non-JSReceivers that need to be handled
// explicitly by Object.assign.
if (!source->IsJSReceiver()) {
@@ -2077,6 +2090,11 @@ MUST_USE_RESULT Maybe<bool> FastAssign(Handle<JSReceiver> target,
if (result.IsNothing()) return result;
if (stable && call_to_js) stable = from->map() == *map;
} else {
+ if (excluded_properties != nullptr &&
+ HasExcludedProperty(excluded_properties, next_key)) {
+ continue;
+ }
+
// 4a ii 2. Perform ? CreateDataProperty(target, nextKey, propValue).
bool success;
LookupIterator it = LookupIterator::PropertyOrElement(
@@ -2090,15 +2108,14 @@ MUST_USE_RESULT Maybe<bool> FastAssign(Handle<JSReceiver> target,
return Just(true);
}
-
} // namespace
// static
-Maybe<bool> JSReceiver::SetOrCopyDataProperties(Isolate* isolate,
- Handle<JSReceiver> target,
- Handle<Object> source,
- bool use_set) {
- Maybe<bool> fast_assign = FastAssign(target, source, use_set);
+Maybe<bool> JSReceiver::SetOrCopyDataProperties(
+ Isolate* isolate, Handle<JSReceiver> target, Handle<Object> source,
+ const ScopedVector<Handle<Name>>* excluded_properties, bool use_set) {
+ Maybe<bool> fast_assign =
+ FastAssign(target, source, excluded_properties, use_set);
if (fast_assign.IsNothing()) return Nothing<bool>();
if (fast_assign.FromJust()) return Just(true);
@@ -2108,7 +2125,7 @@ Maybe<bool> JSReceiver::SetOrCopyDataProperties(Isolate* isolate,
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, keys,
KeyAccumulator::GetKeys(from, KeyCollectionMode::kOwnOnly, ALL_PROPERTIES,
- GetKeysConversion::kKeepNumbers),
+ GetKeysConversion::kConvertToString),
Nothing<bool>());
// 4. Repeat for each element nextKey of keys in List order,
@@ -2135,6 +2152,11 @@ Maybe<bool> JSReceiver::SetOrCopyDataProperties(Isolate* isolate,
isolate, target, next_key, prop_value, STRICT),
Nothing<bool>());
} else {
+ if (excluded_properties != nullptr &&
+ HasExcludedProperty(excluded_properties, next_key)) {
+ continue;
+ }
+
// 4a ii 2. Perform ! CreateDataProperty(target, nextKey, propValue).
bool success;
LookupIterator it = LookupIterator::PropertyOrElement(
« no previous file with comments | « src/objects.h ('k') | src/parsing/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698