| 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(
 | 
| 
 |