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