1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file.
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/runtime/runtime-utils.h"
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/arguments.h"
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/bootstrapper.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/debug/debug.h"
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/isolate-inl.h"
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/messages.h"
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/property-descriptor.h"
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/runtime/runtime.h"
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 {
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace internal {
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierMaybeHandle<Object> Runtime::GetObjectProperty(Isolate* isolate,
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                               Handle<Object> object,
2013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                               Handle<Object> key,
2113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                               bool* is_found_out) {
2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (object->IsNullOrUndefined(isolate)) {
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    THROW_NEW_ERROR(
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate,
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        NewTypeError(MessageTemplate::kNonObjectPropertyLoad, key, object),
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Object);
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool success = false;
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it =
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LookupIterator::PropertyOrElement(isolate, object, key, &success);
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!success) return MaybeHandle<Object>();
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
3413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  MaybeHandle<Object> result = Object::GetProperty(&it);
3513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (is_found_out) *is_found_out = it.IsFound();
3613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return result;
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochstatic MaybeHandle<Object> KeyedGetObjectProperty(Isolate* isolate,
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                                  Handle<Object> receiver_obj,
41109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                                  Handle<Object> key_obj) {
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Fast cases for getting named properties of the receiver JSObject
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // itself.
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  //
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // The global proxy objects has to be excluded since LookupOwn on
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // the global proxy object can return a valid result even though the
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // global proxy object never has properties.  This is the case
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // because the global proxy object forwards everything to its hidden
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // prototype including own lookups.
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  //
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Additionally, we need to make sure that we do not cache results
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // for objects that require access checks.
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (receiver_obj->IsJSObject()) {
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (!receiver_obj->IsJSGlobalProxy() &&
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        !receiver_obj->IsAccessCheckNeeded() && key_obj->IsName()) {
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DisallowHeapAllocation no_allocation;
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject> receiver = Handle<JSObject>::cast(receiver_obj);
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<Name> key = Handle<Name>::cast(key_obj);
5962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // Get to a ThinString's referenced internalized string, but don't
6062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // otherwise force internalization. We assume that internalization
6162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // (which is a dictionary lookup with a non-internalized key) is
6262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // about as expensive as doing the property dictionary lookup with
6362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      // the non-internalized key directly.
6462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      if (key->IsThinString()) {
6562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        key = handle(Handle<ThinString>::cast(key)->actual(), isolate);
6662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      }
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (receiver->IsJSGlobalObject()) {
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        // Attempt dictionary lookup.
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        GlobalDictionary* dictionary = receiver->global_dictionary();
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int entry = dictionary->FindEntry(key);
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (entry != GlobalDictionary::kNotFound) {
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          DCHECK(dictionary->ValueAt(entry)->IsPropertyCell());
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          PropertyCell* cell = PropertyCell::cast(dictionary->ValueAt(entry));
7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          if (cell->property_details().kind() == kData) {
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            Object* value = cell->value();
7613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch            if (!value->IsTheHole(isolate)) {
7713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch              return Handle<Object>(value, isolate);
7813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch            }
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            // If value is the hole (meaning, absent) do the general lookup.
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          }
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else if (!receiver->HasFastProperties()) {
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        // Attempt dictionary lookup.
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        NameDictionary* dictionary = receiver->property_dictionary();
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        int entry = dictionary->FindEntry(key);
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if ((entry != NameDictionary::kNotFound) &&
8762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            (dictionary->DetailsAt(entry).kind() == kData)) {
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Object* value = dictionary->ValueAt(entry);
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          return Handle<Object>(value, isolate);
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    } else if (key_obj->IsSmi()) {
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // JSObject without a name key. If the key is a Smi, check for a
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // definite out-of-bounds access to elements, which is a strong indicator
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // that subsequent accesses will also call the runtime. Proactively
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // transition elements to FAST_*_ELEMENTS to avoid excessive boxing of
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // doubles for those future calls in the case that the elements would
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      // become FAST_DOUBLE_ELEMENTS.
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Handle<JSObject> js_object = Handle<JSObject>::cast(receiver_obj);
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      ElementsKind elements_kind = js_object->GetElementsKind();
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (IsFastDoubleElementsKind(elements_kind)) {
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (Smi::cast(*key_obj)->value() >= js_object->elements()->length()) {
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          elements_kind = IsFastHoleyElementsKind(elements_kind)
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              ? FAST_HOLEY_ELEMENTS
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                              : FAST_ELEMENTS;
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          JSObject::TransitionElementsKind(js_object, elements_kind);
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      } else {
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) ||
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch               !IsFastElementsKind(elements_kind));
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  } else if (receiver_obj->IsString() && key_obj->IsSmi()) {
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    // Fast case for string indexing using [] with a smi index.
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<String> str = Handle<String>::cast(receiver_obj);
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    int index = Handle<Smi>::cast(key_obj)->value();
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (index >= 0 && index < str->length()) {
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Factory* factory = isolate->factory();
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return factory->LookupSingleCharacterStringFromCode(
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          String::Flatten(str)->Get(index));
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Fall back to GetObjectProperty.
125109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return Runtime::GetObjectProperty(isolate, receiver_obj, key_obj);
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybe<bool> Runtime::DeleteObjectProperty(Isolate* isolate,
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                          Handle<JSReceiver> receiver,
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                          Handle<Object> key,
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                          LanguageMode language_mode) {
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool success = false;
134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it = LookupIterator::PropertyOrElement(
135bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      isolate, receiver, key, &success, LookupIterator::OWN);
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!success) return Nothing<bool>();
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return JSReceiver::DeleteProperty(&it, language_mode);
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// ES6 19.1.3.2
1423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochRUNTIME_FUNCTION(Runtime_ObjectHasOwnProperty) {
1433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  HandleScope scope(isolate);
14462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Object> property = args.at(1);
1453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Handle<Name> key;
1473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  uint32_t index;
1483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool key_is_array_index = property->ToArrayIndex(&index);
1493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!key_is_array_index) {
1513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key,
1523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                       Object::ToName(isolate, property));
1533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    key_is_array_index = key->AsArrayIndex(&index);
1543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Object> object = args.at(0);
1573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (object->IsJSObject()) {
1593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Handle<JSObject> js_obj = Handle<JSObject>::cast(object);
1603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // Fast case: either the key is a real named property or it is not
1613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // an array index and there are no interceptors or hidden
1623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // prototypes.
1633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // TODO(jkummerow): Make JSReceiver::HasOwnProperty fast enough to
1643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // handle all cases directly (without this custom fast path).
1653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    {
1663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      LookupIterator::Configuration c = LookupIterator::OWN_SKIP_INTERCEPTOR;
1673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      LookupIterator it =
1683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch          key_is_array_index ? LookupIterator(isolate, js_obj, index, js_obj, c)
1693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                             : LookupIterator(js_obj, key, js_obj, c);
1703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Maybe<bool> maybe = JSReceiver::HasProperty(&it);
1713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if (maybe.IsNothing()) return isolate->heap()->exception();
1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      DCHECK(!isolate->has_pending_exception());
1733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if (maybe.FromJust()) return isolate->heap()->true_value();
1743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
1753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Map* map = js_obj->map();
1773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (!map->has_hidden_prototype() &&
1783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        (key_is_array_index ? !map->has_indexed_interceptor()
1793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                            : !map->has_named_interceptor())) {
1803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return isolate->heap()->false_value();
1813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
1823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // Slow case.
184bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch    LookupIterator::Configuration c = LookupIterator::OWN;
1853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    LookupIterator it = key_is_array_index
1863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                            ? LookupIterator(isolate, js_obj, index, js_obj, c)
1873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                            : LookupIterator(js_obj, key, js_obj, c);
1883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Maybe<bool> maybe = JSReceiver::HasProperty(&it);
1903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (maybe.IsNothing()) return isolate->heap()->exception();
1913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    DCHECK(!isolate->has_pending_exception());
1923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return isolate->heap()->ToBoolean(maybe.FromJust());
1933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (object->IsJSProxy()) {
1953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (key.is_null()) {
1963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      DCHECK(key_is_array_index);
1973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      key = isolate->factory()->Uint32ToString(index);
1983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
1993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Maybe<bool> result =
2013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        JSReceiver::HasOwnProperty(Handle<JSProxy>::cast(object), key);
2023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (!result.IsJust()) return isolate->heap()->exception();
2033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return isolate->heap()->ToBoolean(result.FromJust());
2043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (object->IsString()) {
2063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return isolate->heap()->ToBoolean(
2073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        key_is_array_index
2083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            ? index < static_cast<uint32_t>(String::cast(*object)->length())
2093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            : key->Equals(isolate->heap()->length_string()));
21062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else if (object->IsNullOrUndefined(isolate)) {
2113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    THROW_NEW_ERROR_RETURN_FAILURE(
2123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        isolate, NewTypeError(MessageTemplate::kUndefinedOrNullToObject));
2133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return isolate->heap()->false_value();
2163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
218c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// ES6 section 19.1.2.2 Object.create ( O [ , Properties ] )
219c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// TODO(verwaest): Support the common cases with precached map directly in
220c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// an Object.create stub.
221c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochRUNTIME_FUNCTION(Runtime_ObjectCreate) {
222c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  HandleScope scope(isolate);
22362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Object> prototype = args.at(0);
224c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!prototype->IsNull(isolate) && !prototype->IsJSReceiver()) {
225c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    THROW_NEW_ERROR_RETURN_FAILURE(
226c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        isolate, NewTypeError(MessageTemplate::kProtoObjectOrNull, prototype));
227c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
228c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
229c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Generate the map with the specified {prototype} based on the Object
230c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // function's initial map from the current native context.
231c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // TODO(bmeurer): Use a dedicated cache for Object.create; think about
232c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // slack tracking for Object.create.
23362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Map> map =
23462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Map::GetObjectCreateMap(Handle<HeapObject>::cast(prototype));
235c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
236c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  bool is_dictionary_map = map->is_dictionary_map();
237c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<FixedArray> object_properties;
238c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (is_dictionary_map) {
239c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // Allocate the actual properties dictionay up front to avoid invalid object
240c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    // state.
241c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    object_properties =
242c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        NameDictionary::New(isolate, NameDictionary::kInitialCapacity);
243c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
244c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Actually allocate the object.
245c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<JSObject> object = isolate->factory()->NewJSObjectFromMap(map);
246c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (is_dictionary_map) {
247c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    object->set_properties(*object_properties);
248c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
249c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
250c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Define the properties if properties was specified and is not undefined.
25162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<Object> properties = args.at(1);
252c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!properties->IsUndefined(isolate)) {
253c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    RETURN_FAILURE_ON_EXCEPTION(
254c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        isolate, JSReceiver::DefineProperties(isolate, object, properties));
255c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
256c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
257c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return *object;
258c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
259c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate,
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               Handle<Object> object,
262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               Handle<Object> key,
263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               Handle<Object> value,
264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                               LanguageMode language_mode) {
26562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (object->IsNullOrUndefined(isolate)) {
266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    THROW_NEW_ERROR(
267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate,
268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        NewTypeError(MessageTemplate::kNonObjectPropertyStore, key, object),
269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        Object);
270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Check if the given key is an array index.
273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  bool success = false;
274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  LookupIterator it =
275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      LookupIterator::PropertyOrElement(isolate, object, key, &success);
276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!success) return MaybeHandle<Object>();
277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MAYBE_RETURN_NULL(Object::SetProperty(&it, value, language_mode,
279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                        Object::MAY_BE_STORE_FROM_KEYED));
280014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return value;
281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_GetPrototype) {
285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
28662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
287109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0);
28813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, JSReceiver::GetPrototype(isolate, obj));
289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_InternalSetPrototype) {
293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
29462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0);
296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1);
297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MAYBE_RETURN(
298014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSReceiver::SetPrototype(obj, prototype, false, Object::THROW_ON_ERROR),
299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate->heap()->exception());
300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *obj;
301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_OptimizeObjectForAddingMultipleProperties) {
304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
30562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_SMI_ARG_CHECKED(properties, 1);
308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Conservative upper limit to prevent fuzz tests from going OOM.
309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  if (properties > 100000) return isolate->ThrowIllegalOperation();
310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (object->HasFastProperties() && !object->IsJSGlobalProxy()) {
311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties,
312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                  "OptimizeForAdding");
313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *object;
315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_GetProperty) {
319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
32062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
324014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate,
32613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                           Runtime::GetObjectProperty(isolate, object, key));
327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// KeyedGetProperty is called from KeyedLoadIC::GenerateGeneric.
330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_KeyedGetProperty) {
331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
33262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, receiver_obj, 0);
335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, key_obj, 1);
336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
33713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(
33813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      isolate, KeyedGetObjectProperty(isolate, receiver_obj, key_obj));
339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_AddNamedProperty) {
342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
34313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK_EQ(4, args.length());
344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
346014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3);
349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef DEBUG
351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  uint32_t index = 0;
352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK(!name->ToArrayIndex(&index));
3533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it(object, name, object, LookupIterator::OWN_SKIP_INTERCEPTOR);
354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!maybe.IsJust()) return isolate->heap()->exception();
35613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(!it.IsFound());
357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
35913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, JSObject::SetOwnPropertyIgnoreAttributes(
36013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                        object, name, value, attrs));
361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Adds an element to an array.
365014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// This is used to create an indexed data property into an array.
366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_AddElement) {
367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
36813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK_EQ(3, args.length());
369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
373014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
374014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  uint32_t index = 0;
375014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(key->ToArrayIndex(&index));
376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifdef DEBUG
3783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it(isolate, object, index, object,
379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                    LookupIterator::OWN_SKIP_INTERCEPTOR);
380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!maybe.IsJust()) return isolate->heap()->exception();
38213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(!it.IsFound());
383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
384014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (object->IsJSArray()) {
385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Handle<JSArray> array = Handle<JSArray>::cast(object);
38613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CHECK(!JSArray::WouldChangeReadOnlyLength(array, index));
387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
39013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, JSObject::SetOwnElementIgnoreAttributes(
39113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                                        object, index, value, NONE));
392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_AppendElement) {
396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
39713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK_EQ(2, args.length());
398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
401f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CHECK(!value->IsTheHole(isolate));
402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  uint32_t index;
404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CHECK(array->length()->ToArrayIndex(&index));
405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
40613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_FAILURE_ON_EXCEPTION(
40713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      isolate, JSObject::AddDataElement(array, index, value, NONE));
408014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  JSObject::ValidateElements(array);
409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *array;
410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_SetProperty) {
414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
41513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  DCHECK_EQ(4, args.length());
416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
417014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 3);
421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
42213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(
42313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      isolate,
424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Runtime::SetObjectProperty(isolate, object, key, value, language_mode));
425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace {
429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ES6 section 12.5.4.
431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochObject* DeleteProperty(Isolate* isolate, Handle<Object> object,
432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                       Handle<Object> key, LanguageMode language_mode) {
433014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSReceiver> receiver;
434109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
435109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                     Object::ToObject(isolate, object));
436014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Maybe<bool> result =
437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Runtime::DeleteObjectProperty(isolate, receiver, key, language_mode);
438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MAYBE_RETURN(result, isolate->heap()->exception());
439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->ToBoolean(result.FromJust());
440014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace
443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_DeleteProperty_Sloppy) {
446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
447014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(2, args.length());
448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return DeleteProperty(isolate, object, key, SLOPPY);
451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
453014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
454014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_DeleteProperty_Strict) {
455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(2, args.length());
457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return DeleteProperty(isolate, object, key, STRICT);
460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
461014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ES6 section 12.9.3, operator in.
464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_HasProperty) {
465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(2, args.length());
467f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
468f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
470014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Check that {object} is actually a receiver.
471014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!object->IsJSReceiver()) {
472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    THROW_NEW_ERROR_RETURN_FAILURE(
473014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        isolate,
474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        NewTypeError(MessageTemplate::kInvalidInOperatorUse, key, object));
475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
476014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
478014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Convert the {key} to a name.
479014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<Name> name;
480014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name,
481014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                     Object::ToName(isolate, key));
482014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
483014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  // Lookup the {name} on {receiver}.
484014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Maybe<bool> maybe = JSReceiver::HasProperty(receiver, name);
485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!maybe.IsJust()) return isolate->heap()->exception();
486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->ToBoolean(maybe.FromJust());
487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
490014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_GetOwnPropertyKeys) {
491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
49262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
493014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
494014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_SMI_ARG_CHECKED(filter_value, 1);
495014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  PropertyFilter filter = static_cast<PropertyFilter>(filter_value);
496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
497014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Handle<FixedArray> keys;
498014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
499109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      isolate, keys,
50013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      KeyAccumulator::GetKeys(object, KeyCollectionMode::kOwnOnly, filter,
50113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch                              GetKeysConversion::kConvertToString));
502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
503014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *isolate->factory()->NewJSArrayWithElements(keys);
504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
507014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Return information on whether an object has a named or indexed interceptor.
508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// args[0]: object
509014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_GetInterceptorInfo) {
510014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
51162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
512014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!args[0]->IsJSObject()) {
513c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    return Smi::kZero;
514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
515014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
517014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  int result = 0;
518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (obj->HasNamedInterceptor()) result |= 2;
519014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (obj->HasIndexedInterceptor()) result |= 1;
520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
521014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return Smi::FromInt(result);
522014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
525014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToFastProperties) {
526014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
52762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
528014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
529014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (object->IsJSObject() && !object->IsJSGlobalObject()) {
530014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    JSObject::MigrateSlowToFast(Handle<JSObject>::cast(object), 0,
531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                                "RuntimeToFastProperties");
532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
533014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *object;
534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
537014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_AllocateHeapNumber) {
538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
53962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(0, args.length());
540014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *isolate->factory()->NewHeapNumber(0);
541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
544014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_NewObject) {
545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
546014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(2, args.length());
547014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSFunction, target, 0);
548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, new_target, 1);
54913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, JSObject::New(target, new_target));
550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_FinalizeInstanceSize) {
554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
55562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Map, initial_map, 0);
558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  initial_map->CompleteInobjectSlackTracking();
559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->undefined_value();
561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_LoadMutableDouble) {
565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
56662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Smi, index, 1);
56913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK((index->value() & 1) == 1);
570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  FieldIndex field_index =
571958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      FieldIndex::ForLoadByFieldIndex(object->map(), index->value());
572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (field_index.is_inobject()) {
57313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CHECK(field_index.property_index() <
57413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch          object->map()->GetInObjectProperties());
575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else {
57613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    CHECK(field_index.outobject_array_index() < object->properties()->length());
577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *JSObject::FastPropertyAt(object, Representation::Double(),
579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                   field_index);
580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_TryMigrateInstance) {
584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
58562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
587c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!object->IsJSObject()) return Smi::kZero;
588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Handle<JSObject> js_object = Handle<JSObject>::cast(object);
58962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // It could have been a DCHECK but we call this function directly from tests.
590c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!js_object->map()->is_deprecated()) return Smi::kZero;
591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // This call must not cause lazy deopts, because it's called from deferred
592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // code where we can't handle lazy deopts for lack of a suitable bailout
593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // ID. So we just try migration and signal failure if necessary,
594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // which will also trigger a deopt.
595c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  if (!JSObject::TryMigrateInstance(js_object)) return Smi::kZero;
596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return *object;
597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_IsJSGlobalProxy) {
601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SealHandleScope shs(isolate);
60262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(Object, obj, 0);
604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->ToBoolean(obj->IsJSGlobalProxy());
605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
60713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochstatic bool IsValidAccessor(Isolate* isolate, Handle<Object> obj) {
60862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return obj->IsNullOrUndefined(isolate) || obj->IsCallable();
609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Implements part of 8.12.9 DefineOwnProperty.
613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// There are 3 cases that lead here:
614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Step 4b - define a new accessor property.
615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Steps 9c & 12 - replace an existing data property with an accessor property.
616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Step 12 - update an existing accessor property with an accessor or generic
617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//           descriptor.
618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_DefineAccessorPropertyUnchecked) {
619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
62062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(5, args.length());
621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
62213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(!obj->IsNull(isolate));
623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2);
62513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(IsValidAccessor(isolate, getter));
626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3);
62713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  CHECK(IsValidAccessor(isolate, setter));
628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 4);
629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  RETURN_FAILURE_ON_EXCEPTION(
631014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate, JSObject::DefineAccessor(obj, name, getter, setter, attrs));
632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->undefined_value();
633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
636109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochRUNTIME_FUNCTION(Runtime_DefineDataPropertyInLiteral) {
637109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  HandleScope scope(isolate);
63862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(6, args.length());
639109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
640109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
641109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
64262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CONVERT_SMI_ARG_CHECKED(flag, 3);
64362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(FeedbackVector, vector, 4);
64462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CONVERT_SMI_ARG_CHECKED(index, 5);
64562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
64662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  StoreDataPropertyInLiteralICNexus nexus(vector, vector->ToSlot(index));
64762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (nexus.ic_state() == UNINITIALIZED) {
64862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (name->IsUniqueName()) {
64962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      nexus.ConfigureMonomorphic(name, handle(object->map()));
65062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    } else {
65162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      nexus.ConfigureMegamorphic();
65262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
65362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  } else if (nexus.ic_state() == MONOMORPHIC) {
65462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (nexus.FindFirstMap() != object->map() ||
65562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        nexus.GetFeedbackExtra() != *name) {
65662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      nexus.ConfigureMegamorphic();
65762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
65862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
65962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
66062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DataPropertyInLiteralFlags flags =
66162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      static_cast<DataPropertyInLiteralFlag>(flag);
662109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
66362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  PropertyAttributes attrs = (flags & DataPropertyInLiteralFlag::kDontEnum)
66462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                 ? PropertyAttributes::DONT_ENUM
66562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                 : PropertyAttributes::NONE;
66662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
66762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (flags & DataPropertyInLiteralFlag::kSetFunctionName) {
668109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    DCHECK(value->IsJSFunction());
669109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSFunction::SetName(Handle<JSFunction>::cast(value), name,
670109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                        isolate->factory()->empty_string());
671109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
672109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
6733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  LookupIterator it = LookupIterator::PropertyOrElement(
6743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      isolate, object, name, object, LookupIterator::OWN);
675109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // Cannot fail since this should only be called when
676109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  // creating an object literal.
677109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CHECK(JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, attrs,
678109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch                                                    Object::DONT_THROW)
679109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch            .IsJust());
680109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return *object;
681109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Return property without being observable by accessors or interceptors.
684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_GetDataProperty) {
685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  HandleScope scope(isolate);
68662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
687014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
688014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return *JSReceiver::GetDataProperty(object, name);
690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
692f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochRUNTIME_FUNCTION(Runtime_GetConstructorName) {
693f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  HandleScope scope(isolate);
69462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
695f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
696f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
69762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CHECK(!object->IsNullOrUndefined(isolate));
698f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Handle<JSReceiver> recv = Object::ToObject(isolate, object).ToHandleChecked();
699f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  return *JSReceiver::GetConstructorName(recv);
700f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierRUNTIME_FUNCTION(Runtime_HasFastPackedElements) {
703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SealHandleScope shs(isolate);
70462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(HeapObject, obj, 0);
706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return isolate->heap()->ToBoolean(
707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      IsFastPackedElementsKind(obj->map()->elements_kind()));
708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
711014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ValueOf) {
712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SealHandleScope shs(isolate);
71362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(Object, obj, 0);
715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (!obj->IsJSValue()) return obj;
716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return JSValue::cast(obj)->value();
717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_IsJSReceiver) {
721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SealHandleScope shs(isolate);
72262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(Object, obj, 0);
724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->ToBoolean(obj->IsJSReceiver());
725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ClassOf) {
729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SealHandleScope shs(isolate);
73062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(1, args.length());
731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  CONVERT_ARG_CHECKED(Object, obj, 0);
732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (!obj->IsJSReceiver()) return isolate->heap()->null_value();
733014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return JSReceiver::cast(obj)->class_name();
734014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
735014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
737014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_DefineGetterPropertyUnchecked) {
738014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
73962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(4, args.length());
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
742014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSFunction, getter, 2);
743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3);
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
74513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (String::cast(getter->shared()->name())->length() == 0) {
746109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSFunction::SetName(getter, name, isolate->factory()->get_string());
747109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
748109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RETURN_FAILURE_ON_EXCEPTION(
750014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate,
751014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSObject::DefineAccessor(object, name, getter,
752014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               isolate->factory()->null_value(), attrs));
753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->undefined_value();
754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
75662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochRUNTIME_FUNCTION(Runtime_CopyDataProperties) {
75762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  HandleScope scope(isolate);
75862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(2, args.length());
75962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSObject, target, 0);
76062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, source, 1);
76162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
76262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // 2. If source is undefined or null, let keys be an empty List.
76362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (source->IsUndefined(isolate) || source->IsNull(isolate)) {
76462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return isolate->heap()->undefined_value();
76562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
76662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
76762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  MAYBE_RETURN(JSReceiver::SetOrCopyDataProperties(isolate, target, source,
76862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                   nullptr, false),
76962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               isolate->heap()->exception());
77062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return isolate->heap()->undefined_value();
77162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
77262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
77362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochRUNTIME_FUNCTION(Runtime_CopyDataPropertiesWithExcludedProperties) {
77462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  HandleScope scope(isolate);
77562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_LE(1, args.length());
77662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, source, 0);
77762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
77862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  // 2. If source is undefined or null, let keys be an empty List.
77962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  if (source->IsUndefined(isolate) || source->IsNull(isolate)) {
78062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return isolate->heap()->undefined_value();
78162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
78262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
78362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  ScopedVector<Handle<Object>> excluded_properties(args.length() - 1);
78462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  for (int i = 1; i < args.length(); i++) {
78562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Handle<Object> property = args.at(i);
78662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    uint32_t property_num;
78762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // We convert string to number if possible, in cases of computed
78862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // properties resolving to numbers, which would've been strings
78962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // instead because of our call to %ToName() in the desugaring for
79062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    // computed properties.
79162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (property->IsString() &&
79262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        String::cast(*property)->AsArrayIndex(&property_num)) {
79362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      property = isolate->factory()->NewNumberFromUint(property_num);
79462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
79562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
79662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    excluded_properties[i - 1] = property;
79762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
79862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
79962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Handle<JSObject> target =
80062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      isolate->factory()->NewJSObject(isolate->object_function());
80162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  MAYBE_RETURN(JSReceiver::SetOrCopyDataProperties(isolate, target, source,
80262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                                   &excluded_properties, false),
80362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch               isolate->heap()->exception());
80462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return *target;
80562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
806014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
807014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_DefineSetterPropertyUnchecked) {
808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
80962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(4, args.length());
810014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
811014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSFunction, setter, 2);
813014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3);
814014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
81513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  if (String::cast(setter->shared()->name())->length() == 0) {
816109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    JSFunction::SetName(setter, name, isolate->factory()->set_string());
817109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
818109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  RETURN_FAILURE_ON_EXCEPTION(
820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      isolate,
821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      JSObject::DefineAccessor(object, name, isolate->factory()->null_value(),
822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                               setter, attrs));
823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->undefined_value();
824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
826014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
827014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToObject) {
828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
83113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, Object::ToObject(isolate, object));
832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
835014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToPrimitive) {
836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
83913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, Object::ToPrimitive(input));
840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
841014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
842014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
843014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToPrimitive_Number) {
844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
846014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
84713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(
84813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch      isolate, Object::ToPrimitive(input, ToPrimitiveHint::kNumber));
849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToNumber) {
852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
85513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, Object::ToNumber(input));
856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToInteger) {
860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
861014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
862014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
86313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, Object::ToInteger(isolate, input));
864014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
866014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
867014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToLength) {
868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
87113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, Object::ToLength(isolate, input));
872014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
874014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToString) {
876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
87913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, Object::ToString(isolate, input));
880014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
882014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
883014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_ToName) {
884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
886014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
88713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  RETURN_RESULT_OR_FAILURE(isolate, Object::ToName(isolate, input));
888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
891109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochRUNTIME_FUNCTION(Runtime_SameValue) {
892109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  SealHandleScope scope(isolate);
893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(2, args.length());
894109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CONVERT_ARG_CHECKED(Object, x, 0);
895109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CONVERT_ARG_CHECKED(Object, y, 1);
896109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return isolate->heap()->ToBoolean(x->SameValue(y));
897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
898014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
899014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
900109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochRUNTIME_FUNCTION(Runtime_SameValueZero) {
901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  SealHandleScope scope(isolate);
902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(2, args.length());
903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_CHECKED(Object, x, 0);
904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_CHECKED(Object, y, 1);
905109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  return isolate->heap()->ToBoolean(x->SameValueZero(y));
906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// TODO(bmeurer): Kill this special wrapper and use TF compatible LessThan,
910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// GreaterThan, etc. which return true or false.
911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_Compare) {
912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(3, args.length());
914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
915014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, ncr, 2);
917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Maybe<ComparisonResult> result = Object::Compare(x, y);
918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (result.IsJust()) {
919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    switch (result.FromJust()) {
920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kLessThan:
921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Smi::FromInt(LESS);
922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kEqual:
923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Smi::FromInt(EQUAL);
924014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kGreaterThan:
925014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return Smi::FromInt(GREATER);
926014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      case ComparisonResult::kUndefined:
927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        return *ncr;
928014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
929014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    UNREACHABLE();
930014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
931014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->exception();
932014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
933014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_HasInPrototypeChain) {
935014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
936014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(2, args.length());
937109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
938014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1);
939109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  Maybe<bool> result =
940109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch      JSReceiver::HasInPrototypeChain(isolate, object, prototype);
941014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  MAYBE_RETURN(result, isolate->heap()->exception());
942014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->ToBoolean(result.FromJust());
943014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
944014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ES6 section 7.4.7 CreateIterResultObject ( value, done )
947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_CreateIterResultObject) {
948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(2, args.length());
950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, value, 0);
951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, done, 1);
952c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return *isolate->factory()->NewJSIteratorResult(value, done->BooleanValue());
953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
955c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochRUNTIME_FUNCTION(Runtime_CreateKeyValueArray) {
956c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  HandleScope scope(isolate);
957c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  DCHECK_EQ(2, args.length());
958c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, key, 0);
959c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
960c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<FixedArray> elements = isolate->factory()->NewFixedArray(2);
961c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  elements->set(0, *key);
962c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  elements->set(1, *value);
963c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return *isolate->factory()->NewJSArrayWithElements(elements, FAST_ELEMENTS,
964c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                                                     2);
965c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochRUNTIME_FUNCTION(Runtime_IsAccessCheckNeeded) {
968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  SealHandleScope shs(isolate);
969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  DCHECK_EQ(1, args.length());
970014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  CONVERT_ARG_CHECKED(Object, object, 0);
971014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  return isolate->heap()->ToBoolean(object->IsAccessCheckNeeded());
972014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
974014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
975bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben MurdochRUNTIME_FUNCTION(Runtime_CreateDataProperty) {
976014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  HandleScope scope(isolate);
97762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  DCHECK_EQ(3, args.length());
978bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(JSReceiver, o, 0);
979bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
980bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
981bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  bool success;
982bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  LookupIterator it = LookupIterator::PropertyOrElement(
983bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      isolate, o, key, &success, LookupIterator::OWN);
984bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  if (!success) return isolate->heap()->exception();
985bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  MAYBE_RETURN(
986bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      JSReceiver::CreateDataProperty(&it, value, Object::THROW_ON_ERROR),
987bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch      isolate->heap()->exception());
988bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch  return *value;
989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
991f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
994