LCOV - code coverage report
Current view: top level - src/builtins - builtins-object.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 155 157 98.7 %
Date: 2017-10-20 Functions: 48 71 67.6 %

          Line data    Source code
       1             : // Copyright 2016 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "src/builtins/builtins-utils.h"
       6             : #include "src/builtins/builtins.h"
       7             : #include "src/code-factory.h"
       8             : #include "src/code-stub-assembler.h"
       9             : #include "src/counters.h"
      10             : #include "src/keys.h"
      11             : #include "src/lookup.h"
      12             : #include "src/objects-inl.h"
      13             : #include "src/property-descriptor.h"
      14             : 
      15             : namespace v8 {
      16             : namespace internal {
      17             : 
      18             : // -----------------------------------------------------------------------------
      19             : // ES6 section 19.1 Object Objects
      20             : 
      21             : // ES6 19.1.2.1 Object.assign
      22         795 : BUILTIN(ObjectAssign) {
      23             :   HandleScope scope(isolate);
      24             :   Handle<Object> target = args.atOrUndefined(isolate, 1);
      25             : 
      26             :   // 1. Let to be ? ToObject(target).
      27         530 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, target,
      28             :                                      Object::ToObject(isolate, target));
      29             :   Handle<JSReceiver> to = Handle<JSReceiver>::cast(target);
      30             :   // 2. If only one argument was passed, return to.
      31         229 :   if (args.length() == 2) return *to;
      32             :   // 3. Let sources be the List of argument values starting with the
      33             :   //    second argument.
      34             :   // 4. For each element nextSource of sources, in ascending index order,
      35         673 :   for (int i = 2; i < args.length(); ++i) {
      36         258 :     Handle<Object> next_source = args.at(i);
      37         258 :     MAYBE_RETURN(JSReceiver::SetOrCopyDataProperties(isolate, to, next_source),
      38             :                  isolate->heap()->exception());
      39             :   }
      40             :   // 5. Return to.
      41         193 :   return *to;
      42             : }
      43             : 
      44             : // ES6 section 19.1.3.4 Object.prototype.propertyIsEnumerable ( V )
      45       17025 : BUILTIN(ObjectPrototypePropertyIsEnumerable) {
      46             :   HandleScope scope(isolate);
      47             :   Handle<JSReceiver> object;
      48             :   Handle<Name> name;
      49       11350 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
      50             :       isolate, name, Object::ToName(isolate, args.atOrUndefined(isolate, 1)));
      51       11340 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
      52             :       isolate, object, JSReceiver::ToObject(isolate, args.receiver()));
      53             :   Maybe<PropertyAttributes> maybe =
      54        5481 :       JSReceiver::GetOwnPropertyAttributes(object, name);
      55        5481 :   if (!maybe.IsJust()) return isolate->heap()->exception();
      56        5285 :   if (maybe.FromJust() == ABSENT) return isolate->heap()->false_value();
      57       10094 :   return isolate->heap()->ToBoolean((maybe.FromJust() & DONT_ENUM) == 0);
      58             : }
      59             : 
      60             : // ES6 section 19.1.2.3 Object.defineProperties
      61       36201 : BUILTIN(ObjectDefineProperties) {
      62             :   HandleScope scope(isolate);
      63             :   DCHECK_EQ(3, args.length());
      64       12067 :   Handle<Object> target = args.at(1);
      65       12067 :   Handle<Object> properties = args.at(2);
      66             : 
      67       36027 :   RETURN_RESULT_OR_FAILURE(
      68             :       isolate, JSReceiver::DefineProperties(isolate, target, properties));
      69             : }
      70             : 
      71             : // ES6 section 19.1.2.4 Object.defineProperty
      72      573702 : BUILTIN(ObjectDefineProperty) {
      73             :   HandleScope scope(isolate);
      74             :   DCHECK_EQ(4, args.length());
      75      191234 :   Handle<Object> target = args.at(1);
      76      191234 :   Handle<Object> key = args.at(2);
      77      191234 :   Handle<Object> attributes = args.at(3);
      78             : 
      79      382468 :   return JSReceiver::DefineProperty(isolate, target, key, attributes);
      80             : }
      81             : 
      82             : namespace {
      83             : 
      84             : template <AccessorComponent which_accessor>
      85      161398 : Object* ObjectDefineAccessor(Isolate* isolate, Handle<Object> object,
      86             :                              Handle<Object> name, Handle<Object> accessor) {
      87             :   // 1. Let O be ? ToObject(this value).
      88             :   Handle<JSReceiver> receiver;
      89      322796 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
      90             :       isolate, receiver,
      91             :       FLAG_harmony_strict_legacy_accessor_builtins
      92             :           ? Object::ToObject(isolate, object)
      93             :           : Object::ConvertReceiver(isolate, object));
      94             :   // 2. If IsCallable(getter) is false, throw a TypeError exception.
      95      161388 :   if (!accessor->IsCallable()) {
      96             :     MessageTemplate::Template message =
      97             :         which_accessor == ACCESSOR_GETTER
      98             :             ? MessageTemplate::kObjectGetterExpectingFunction
      99             :             : MessageTemplate::kObjectSetterExpectingFunction;
     100         112 :     THROW_NEW_ERROR_RETURN_FAILURE(isolate, NewTypeError(message));
     101             :   }
     102             :   // 3. Let desc be PropertyDescriptor{[[Get]]: getter, [[Enumerable]]: true,
     103             :   //                                   [[Configurable]]: true}.
     104             :   PropertyDescriptor desc;
     105             :   if (which_accessor == ACCESSOR_GETTER) {
     106             :     desc.set_get(accessor);
     107             :   } else {
     108             :     DCHECK(which_accessor == ACCESSOR_SETTER);
     109             :     desc.set_set(accessor);
     110             :   }
     111             :   desc.set_enumerable(true);
     112             :   desc.set_configurable(true);
     113             :   // 4. Let key be ? ToPropertyKey(P).
     114      322664 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name,
     115             :                                      Object::ToPropertyKey(isolate, name));
     116             :   // 5. Perform ? DefinePropertyOrThrow(O, key, desc).
     117             :   // To preserve legacy behavior, we ignore errors silently rather than
     118             :   // throwing an exception.
     119             :   Maybe<bool> success = JSReceiver::DefineOwnProperty(
     120             :       isolate, receiver, name, &desc,
     121             :       FLAG_harmony_strict_legacy_accessor_builtins ? Object::THROW_ON_ERROR
     122      161332 :                                                    : Object::DONT_THROW);
     123      161332 :   MAYBE_RETURN(success, isolate->heap()->exception());
     124      161138 :   if (!success.FromJust()) {
     125          12 :     isolate->CountUsage(v8::Isolate::kDefineGetterOrSetterWouldThrow);
     126             :   }
     127             :   // 6. Return undefined.
     128      161138 :   return isolate->heap()->undefined_value();
     129             : }
     130             : 
     131         659 : Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object,
     132             :                              Handle<Object> key, AccessorComponent component) {
     133        1318 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
     134             :       isolate, object,
     135             :       FLAG_harmony_strict_legacy_accessor_builtins
     136             :           ? Object::ToObject(isolate, object)
     137             :           : Object::ConvertReceiver(isolate, object));
     138        1318 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key,
     139             :                                      Object::ToPropertyKey(isolate, key));
     140         659 :   bool success = false;
     141             :   LookupIterator it = LookupIterator::PropertyOrElement(
     142             :       isolate, object, key, &success,
     143         659 :       LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR);
     144             :   DCHECK(success);
     145             : 
     146         659 :   for (; it.IsFound(); it.Next()) {
     147         587 :     switch (it.state()) {
     148             :       case LookupIterator::INTERCEPTOR:
     149             :       case LookupIterator::NOT_FOUND:
     150             :       case LookupIterator::TRANSITION:
     151           0 :         UNREACHABLE();
     152             : 
     153             :       case LookupIterator::ACCESS_CHECK:
     154           5 :         if (it.HasAccess()) continue;
     155           5 :         isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>());
     156           5 :         RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
     157           0 :         return isolate->heap()->undefined_value();
     158             : 
     159             :       case LookupIterator::JSPROXY: {
     160             :         PropertyDescriptor desc;
     161             :         Maybe<bool> found = JSProxy::GetOwnPropertyDescriptor(
     162         288 :             isolate, it.GetHolder<JSProxy>(), it.GetName(), &desc);
     163         288 :         MAYBE_RETURN(found, isolate->heap()->exception());
     164         288 :         if (found.FromJust()) {
     165         243 :           if (component == ACCESSOR_GETTER && desc.has_get()) {
     166             :             return *desc.get();
     167             :           }
     168         189 :           if (component == ACCESSOR_SETTER && desc.has_set()) {
     169             :             return *desc.set();
     170             :           }
     171          54 :           return isolate->heap()->undefined_value();
     172             :         }
     173             :         Handle<Object> prototype;
     174         252 :         ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
     175             :             isolate, prototype, JSProxy::GetPrototype(it.GetHolder<JSProxy>()));
     176         126 :         if (prototype->IsNull(isolate)) {
     177          18 :           return isolate->heap()->undefined_value();
     178             :         }
     179         108 :         return ObjectLookupAccessor(isolate, prototype, key, component);
     180             :       }
     181             : 
     182             :       case LookupIterator::INTEGER_INDEXED_EXOTIC:
     183             :       case LookupIterator::DATA:
     184          72 :         return isolate->heap()->undefined_value();
     185             : 
     186             :       case LookupIterator::ACCESSOR: {
     187         222 :         Handle<Object> maybe_pair = it.GetAccessors();
     188         222 :         if (maybe_pair->IsAccessorPair()) {
     189             :           return *AccessorPair::GetComponent(
     190         444 :               Handle<AccessorPair>::cast(maybe_pair), component);
     191             :         }
     192             :       }
     193             :     }
     194             :   }
     195             : 
     196          72 :   return isolate->heap()->undefined_value();
     197             : }
     198             : 
     199             : }  // namespace
     200             : 
     201             : // ES6 B.2.2.2 a.k.a.
     202             : // https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__
     203      449292 : BUILTIN(ObjectDefineGetter) {
     204             :   HandleScope scope(isolate);
     205      149764 :   Handle<Object> object = args.at(0);  // Receiver.
     206      149764 :   Handle<Object> name = args.at(1);
     207      149764 :   Handle<Object> getter = args.at(2);
     208      299528 :   return ObjectDefineAccessor<ACCESSOR_GETTER>(isolate, object, name, getter);
     209             : }
     210             : 
     211             : // ES6 B.2.2.3 a.k.a.
     212             : // https://tc39.github.io/ecma262/#sec-object.prototype.__defineSetter__
     213       34902 : BUILTIN(ObjectDefineSetter) {
     214             :   HandleScope scope(isolate);
     215       11634 :   Handle<Object> object = args.at(0);  // Receiver.
     216       11634 :   Handle<Object> name = args.at(1);
     217       11634 :   Handle<Object> setter = args.at(2);
     218       23268 :   return ObjectDefineAccessor<ACCESSOR_SETTER>(isolate, object, name, setter);
     219             : }
     220             : 
     221             : // ES6 B.2.2.4 a.k.a.
     222             : // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupGetter__
     223         864 : BUILTIN(ObjectLookupGetter) {
     224             :   HandleScope scope(isolate);
     225         288 :   Handle<Object> object = args.at(0);
     226         288 :   Handle<Object> name = args.at(1);
     227         576 :   return ObjectLookupAccessor(isolate, object, name, ACCESSOR_GETTER);
     228             : }
     229             : 
     230             : // ES6 B.2.2.5 a.k.a.
     231             : // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupSetter__
     232         789 : BUILTIN(ObjectLookupSetter) {
     233             :   HandleScope scope(isolate);
     234         263 :   Handle<Object> object = args.at(0);
     235         263 :   Handle<Object> name = args.at(1);
     236         526 :   return ObjectLookupAccessor(isolate, object, name, ACCESSOR_SETTER);
     237             : }
     238             : 
     239             : // ES6 section 19.1.2.5 Object.freeze ( O )
     240      320721 : BUILTIN(ObjectFreeze) {
     241             :   HandleScope scope(isolate);
     242             :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     243      106907 :   if (object->IsJSReceiver()) {
     244      106831 :     MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object),
     245             :                                                FROZEN, Object::THROW_ON_ERROR),
     246             :                  isolate->heap()->exception());
     247             :   }
     248      106873 :   return *object;
     249             : }
     250             : 
     251             : // ES section 19.1.2.9 Object.getPrototypeOf ( O )
     252     1297425 : BUILTIN(ObjectGetPrototypeOf) {
     253             :   HandleScope scope(isolate);
     254      432475 :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     255             : 
     256             :   Handle<JSReceiver> receiver;
     257      864950 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
     258             :                                      Object::ToObject(isolate, object));
     259             : 
     260     1297356 :   RETURN_RESULT_OR_FAILURE(isolate,
     261             :                            JSReceiver::GetPrototype(isolate, receiver));
     262             : }
     263             : 
     264             : // ES6 section 19.1.2.21 Object.setPrototypeOf ( O, proto )
     265      175953 : BUILTIN(ObjectSetPrototypeOf) {
     266             :   HandleScope scope(isolate);
     267             : 
     268             :   // 1. Let O be ? RequireObjectCoercible(O).
     269             :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     270       58651 :   if (object->IsNullOrUndefined(isolate)) {
     271          54 :     THROW_NEW_ERROR_RETURN_FAILURE(
     272             :         isolate, NewTypeError(MessageTemplate::kCalledOnNullOrUndefined,
     273             :                               isolate->factory()->NewStringFromAsciiChecked(
     274             :                                   "Object.setPrototypeOf")));
     275             :   }
     276             : 
     277             :   // 2. If Type(proto) is neither Object nor Null, throw a TypeError exception.
     278             :   Handle<Object> proto = args.atOrUndefined(isolate, 2);
     279      117129 :   if (!proto->IsNull(isolate) && !proto->IsJSReceiver()) {
     280         956 :     THROW_NEW_ERROR_RETURN_FAILURE(
     281             :         isolate, NewTypeError(MessageTemplate::kProtoObjectOrNull, proto));
     282             :   }
     283             : 
     284             :   // 3. If Type(O) is not Object, return O.
     285       58191 :   if (!object->IsJSReceiver()) return *object;
     286             :   Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
     287             : 
     288             :   // 4. Let status be ? O.[[SetPrototypeOf]](proto).
     289             :   // 5. If status is false, throw a TypeError exception.
     290       58119 :   MAYBE_RETURN(
     291             :       JSReceiver::SetPrototype(receiver, proto, true, Object::THROW_ON_ERROR),
     292             :       isolate->heap()->exception());
     293             : 
     294             :   // 6. Return O.
     295       57938 :   return *receiver;
     296             : }
     297             : 
     298             : // ES6 section B.2.2.1.1 get Object.prototype.__proto__
     299      392274 : BUILTIN(ObjectPrototypeGetProto) {
     300             :   HandleScope scope(isolate);
     301             :   // 1. Let O be ? ToObject(this value).
     302             :   Handle<JSReceiver> receiver;
     303      261516 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
     304             :       isolate, receiver, Object::ToObject(isolate, args.receiver()));
     305             : 
     306             :   // 2. Return ? O.[[GetPrototypeOf]]().
     307      392214 :   RETURN_RESULT_OR_FAILURE(isolate,
     308             :                            JSReceiver::GetPrototype(isolate, receiver));
     309             : }
     310             : 
     311             : // ES6 section B.2.2.1.2 set Object.prototype.__proto__
     312      521523 : BUILTIN(ObjectPrototypeSetProto) {
     313             :   HandleScope scope(isolate);
     314             :   // 1. Let O be ? RequireObjectCoercible(this value).
     315             :   Handle<Object> object = args.receiver();
     316      173841 :   if (object->IsNullOrUndefined(isolate)) {
     317          60 :     THROW_NEW_ERROR_RETURN_FAILURE(
     318             :         isolate, NewTypeError(MessageTemplate::kCalledOnNullOrUndefined,
     319             :                               isolate->factory()->NewStringFromAsciiChecked(
     320             :                                   "set Object.prototype.__proto__")));
     321             :   }
     322             : 
     323             :   // 2. If Type(proto) is neither Object nor Null, return undefined.
     324             :   Handle<Object> proto = args.at(1);
     325      347327 :   if (!proto->IsNull(isolate) && !proto->IsJSReceiver()) {
     326       28414 :     return isolate->heap()->undefined_value();
     327             :   }
     328             : 
     329             :   // 3. If Type(O) is not Object, return undefined.
     330      145407 :   if (!object->IsJSReceiver()) return isolate->heap()->undefined_value();
     331      145357 :   Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
     332             : 
     333             :   // 4. Let status be ? O.[[SetPrototypeOf]](proto).
     334             :   // 5. If status is false, throw a TypeError exception.
     335      145357 :   MAYBE_RETURN(
     336             :       JSReceiver::SetPrototype(receiver, proto, true, Object::THROW_ON_ERROR),
     337             :       isolate->heap()->exception());
     338             : 
     339             :   // Return undefined.
     340      145254 :   return isolate->heap()->undefined_value();
     341             : }
     342             : 
     343             : namespace {
     344             : 
     345      162679 : Object* GetOwnPropertyKeys(Isolate* isolate, BuiltinArguments args,
     346             :                            PropertyFilter filter) {
     347             :   HandleScope scope(isolate);
     348      162679 :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     349             :   Handle<JSReceiver> receiver;
     350      325358 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
     351             :                                      Object::ToObject(isolate, object));
     352             :   Handle<FixedArray> keys;
     353      325318 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
     354             :       isolate, keys,
     355             :       KeyAccumulator::GetKeys(receiver, KeyCollectionMode::kOwnOnly, filter,
     356             :                               GetKeysConversion::kConvertToString));
     357             :   return *isolate->factory()->NewJSArrayWithElements(keys);
     358             : }
     359             : 
     360             : }  // namespace
     361             : 
     362             : // ES6 section 19.1.2.7 Object.getOwnPropertyNames ( O )
     363      187288 : BUILTIN(ObjectGetOwnPropertyNames) {
     364       93644 :   return GetOwnPropertyKeys(isolate, args, SKIP_SYMBOLS);
     365             : }
     366             : 
     367             : // ES6 section 19.1.2.8 Object.getOwnPropertySymbols ( O )
     368      138070 : BUILTIN(ObjectGetOwnPropertySymbols) {
     369       69035 :   return GetOwnPropertyKeys(isolate, args, SKIP_STRINGS);
     370             : }
     371             : 
     372             : // ES6 section 19.1.2.11 Object.isExtensible ( O )
     373        1386 : BUILTIN(ObjectIsExtensible) {
     374             :   HandleScope scope(isolate);
     375             :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     376             :   Maybe<bool> result =
     377             :       object->IsJSReceiver()
     378             :           ? JSReceiver::IsExtensible(Handle<JSReceiver>::cast(object))
     379         462 :           : Just(false);
     380         462 :   MAYBE_RETURN(result, isolate->heap()->exception());
     381         462 :   return isolate->heap()->ToBoolean(result.FromJust());
     382             : }
     383             : 
     384             : // ES6 section 19.1.2.12 Object.isFrozen ( O )
     385       27198 : BUILTIN(ObjectIsFrozen) {
     386             :   HandleScope scope(isolate);
     387             :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     388             :   Maybe<bool> result = object->IsJSReceiver()
     389             :                            ? JSReceiver::TestIntegrityLevel(
     390             :                                  Handle<JSReceiver>::cast(object), FROZEN)
     391        9066 :                            : Just(true);
     392        9066 :   MAYBE_RETURN(result, isolate->heap()->exception());
     393        9066 :   return isolate->heap()->ToBoolean(result.FromJust());
     394             : }
     395             : 
     396             : // ES6 section 19.1.2.13 Object.isSealed ( O )
     397        7050 : BUILTIN(ObjectIsSealed) {
     398             :   HandleScope scope(isolate);
     399             :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     400             :   Maybe<bool> result = object->IsJSReceiver()
     401             :                            ? JSReceiver::TestIntegrityLevel(
     402             :                                  Handle<JSReceiver>::cast(object), SEALED)
     403        2350 :                            : Just(true);
     404        2350 :   MAYBE_RETURN(result, isolate->heap()->exception());
     405        2350 :   return isolate->heap()->ToBoolean(result.FromJust());
     406             : }
     407             : 
     408        2028 : BUILTIN(ObjectValues) {
     409             :   HandleScope scope(isolate);
     410         676 :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     411             :   Handle<JSReceiver> receiver;
     412        1352 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
     413             :                                      Object::ToObject(isolate, object));
     414             :   Handle<FixedArray> values;
     415        1298 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
     416             :       isolate, values, JSReceiver::GetOwnValues(receiver, ENUMERABLE_STRINGS));
     417             :   return *isolate->factory()->NewJSArrayWithElements(values);
     418             : }
     419             : 
     420        1296 : BUILTIN(ObjectEntries) {
     421             :   HandleScope scope(isolate);
     422         432 :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     423             :   Handle<JSReceiver> receiver;
     424         864 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
     425             :                                      Object::ToObject(isolate, object));
     426             :   Handle<FixedArray> entries;
     427         810 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
     428             :       isolate, entries,
     429             :       JSReceiver::GetOwnEntries(receiver, ENUMERABLE_STRINGS));
     430             :   return *isolate->factory()->NewJSArrayWithElements(entries);
     431             : }
     432             : 
     433         270 : BUILTIN(ObjectGetOwnPropertyDescriptors) {
     434             :   HandleScope scope(isolate);
     435          90 :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     436             : 
     437             :   Handle<JSReceiver> receiver;
     438         180 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
     439             :                                      Object::ToObject(isolate, object));
     440             : 
     441             :   Handle<FixedArray> keys;
     442         126 :   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
     443             :       isolate, keys, KeyAccumulator::GetKeys(
     444             :                          receiver, KeyCollectionMode::kOwnOnly, ALL_PROPERTIES,
     445             :                          GetKeysConversion::kConvertToString));
     446             : 
     447             :   Handle<JSObject> descriptors =
     448          63 :       isolate->factory()->NewJSObject(isolate->object_function());
     449             : 
     450         414 :   for (int i = 0; i < keys->length(); ++i) {
     451         144 :     Handle<Name> key = Handle<Name>::cast(FixedArray::get(*keys, i, isolate));
     452             :     PropertyDescriptor descriptor;
     453             :     Maybe<bool> did_get_descriptor = JSReceiver::GetOwnPropertyDescriptor(
     454         144 :         isolate, receiver, key, &descriptor);
     455         144 :     MAYBE_RETURN(did_get_descriptor, isolate->heap()->exception());
     456             : 
     457         162 :     if (!did_get_descriptor.FromJust()) continue;
     458         126 :     Handle<Object> from_descriptor = descriptor.ToObject(isolate);
     459             : 
     460             :     LookupIterator it = LookupIterator::PropertyOrElement(
     461         126 :         isolate, descriptors, key, descriptors, LookupIterator::OWN);
     462             :     Maybe<bool> success = JSReceiver::CreateDataProperty(&it, from_descriptor,
     463         126 :                                                          Object::DONT_THROW);
     464         126 :     CHECK(success.FromJust());
     465             :   }
     466             : 
     467          63 :   return *descriptors;
     468             : }
     469             : 
     470             : // ES6 section 19.1.2.15 Object.preventExtensions ( O )
     471       10053 : BUILTIN(ObjectPreventExtensions) {
     472             :   HandleScope scope(isolate);
     473             :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     474        3351 :   if (object->IsJSReceiver()) {
     475        3351 :     MAYBE_RETURN(JSReceiver::PreventExtensions(Handle<JSReceiver>::cast(object),
     476             :                                                Object::THROW_ON_ERROR),
     477             :                  isolate->heap()->exception());
     478             :   }
     479        3341 :   return *object;
     480             : }
     481             : 
     482             : // ES6 section 19.1.2.17 Object.seal ( O )
     483        2163 : BUILTIN(ObjectSeal) {
     484             :   HandleScope scope(isolate);
     485             :   Handle<Object> object = args.atOrUndefined(isolate, 1);
     486         721 :   if (object->IsJSReceiver()) {
     487         679 :     MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object),
     488             :                                                SEALED, Object::THROW_ON_ERROR),
     489             :                  isolate->heap()->exception());
     490             :   }
     491         716 :   return *object;
     492             : }
     493             : 
     494             : }  // namespace internal
     495             : }  // namespace v8

Generated by: LCOV version 1.10