summaryrefslogtreecommitdiff
path: root/deps/v8/src/runtime/runtime-object.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/runtime/runtime-object.cc')
-rw-r--r--deps/v8/src/runtime/runtime-object.cc258
1 files changed, 86 insertions, 172 deletions
diff --git a/deps/v8/src/runtime/runtime-object.cc b/deps/v8/src/runtime/runtime-object.cc
index 75ddb7bc22..415920d6c6 100644
--- a/deps/v8/src/runtime/runtime-object.cc
+++ b/deps/v8/src/runtime/runtime-object.cc
@@ -15,11 +15,9 @@
namespace v8 {
namespace internal {
-
MaybeHandle<Object> Runtime::GetObjectProperty(Isolate* isolate,
Handle<Object> object,
- Handle<Object> key,
- LanguageMode language_mode) {
+ Handle<Object> key) {
if (object->IsUndefined() || object->IsNull()) {
THROW_NEW_ERROR(
isolate,
@@ -32,14 +30,12 @@ MaybeHandle<Object> Runtime::GetObjectProperty(Isolate* isolate,
LookupIterator::PropertyOrElement(isolate, object, key, &success);
if (!success) return MaybeHandle<Object>();
- return Object::GetProperty(&it, language_mode);
+ return Object::GetProperty(&it);
}
-
static MaybeHandle<Object> KeyedGetObjectProperty(Isolate* isolate,
Handle<Object> receiver_obj,
- Handle<Object> key_obj,
- LanguageMode language_mode) {
+ Handle<Object> key_obj) {
// Fast cases for getting named properties of the receiver JSObject
// itself.
//
@@ -113,8 +109,7 @@ static MaybeHandle<Object> KeyedGetObjectProperty(Isolate* isolate,
}
// Fall back to GetObjectProperty.
- return Runtime::GetObjectProperty(isolate, receiver_obj, key_obj,
- language_mode);
+ return Runtime::GetObjectProperty(isolate, receiver_obj, key_obj);
}
@@ -158,10 +153,10 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate,
RUNTIME_FUNCTION(Runtime_GetPrototype) {
HandleScope scope(isolate);
DCHECK(args.length() == 1);
- CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0);
+ CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0);
Handle<Object> prototype;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, prototype,
- Object::GetPrototype(isolate, obj));
+ JSReceiver::GetPrototype(isolate, obj));
return *prototype;
}
@@ -230,8 +225,10 @@ MUST_USE_RESULT static MaybeHandle<Object> GetOwnProperty(Isolate* isolate,
if (is_accessor_pair) {
Handle<AccessorPair> accessors =
Handle<AccessorPair>::cast(it.GetAccessors());
- Handle<Object> getter(accessors->GetComponent(ACCESSOR_GETTER), isolate);
- Handle<Object> setter(accessors->GetComponent(ACCESSOR_SETTER), isolate);
+ Handle<Object> getter =
+ AccessorPair::GetComponent(accessors, ACCESSOR_GETTER);
+ Handle<Object> setter =
+ AccessorPair::GetComponent(accessors, ACCESSOR_SETTER);
elms->set(GETTER_INDEX, *getter);
elms->set(SETTER_INDEX, *setter);
} else {
@@ -266,31 +263,6 @@ RUNTIME_FUNCTION(Runtime_GetOwnProperty_Legacy) {
}
-// ES6 19.1.2.6
-RUNTIME_FUNCTION(Runtime_GetOwnProperty) {
- HandleScope scope(isolate);
- DCHECK(args.length() == 2);
- CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
- CONVERT_ARG_HANDLE_CHECKED(Object, raw_name, 1);
- // 1. Let obj be ? ToObject(O).
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, object,
- Execution::ToObject(isolate, object));
- // 2. Let key be ? ToPropertyKey(P).
- Handle<Name> key;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key,
- Object::ToName(isolate, raw_name));
-
- // 3. Let desc be ? obj.[[GetOwnProperty]](key).
- PropertyDescriptor desc;
- Maybe<bool> found = JSReceiver::GetOwnPropertyDescriptor(
- isolate, Handle<JSReceiver>::cast(object), key, &desc);
- MAYBE_RETURN(found, isolate->heap()->exception());
- // 4. Return FromPropertyDescriptor(desc).
- if (!found.FromJust()) return isolate->heap()->undefined_value();
- return *desc.ToObject(isolate);
-}
-
-
RUNTIME_FUNCTION(Runtime_OptimizeObjectForAddingMultipleProperties) {
HandleScope scope(isolate);
DCHECK(args.length() == 2);
@@ -409,23 +381,7 @@ RUNTIME_FUNCTION(Runtime_GetProperty) {
Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, result,
- Runtime::GetObjectProperty(isolate, object, key, SLOPPY));
- return *result;
-}
-
-
-RUNTIME_FUNCTION(Runtime_GetPropertyStrong) {
- HandleScope scope(isolate);
- DCHECK(args.length() == 2);
-
- CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
- CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
-
- Handle<Object> result;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, result,
- Runtime::GetObjectProperty(isolate, object, key, STRONG));
+ isolate, result, Runtime::GetObjectProperty(isolate, object, key));
return *result;
}
@@ -440,23 +396,7 @@ RUNTIME_FUNCTION(Runtime_KeyedGetProperty) {
Handle<Object> result;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, result,
- KeyedGetObjectProperty(isolate, receiver_obj, key_obj, SLOPPY));
- return *result;
-}
-
-
-RUNTIME_FUNCTION(Runtime_KeyedGetPropertyStrong) {
- HandleScope scope(isolate);
- DCHECK(args.length() == 2);
-
- CONVERT_ARG_HANDLE_CHECKED(Object, receiver_obj, 0);
- CONVERT_ARG_HANDLE_CHECKED(Object, key_obj, 1);
-
- Handle<Object> result;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, result,
- KeyedGetObjectProperty(isolate, receiver_obj, key_obj, STRONG));
+ isolate, result, KeyedGetObjectProperty(isolate, receiver_obj, key_obj));
return *result;
}
@@ -563,10 +503,8 @@ namespace {
Object* DeleteProperty(Isolate* isolate, Handle<Object> object,
Handle<Object> key, LanguageMode language_mode) {
Handle<JSReceiver> receiver;
- if (!JSReceiver::ToObject(isolate, object).ToHandle(&receiver)) {
- THROW_NEW_ERROR_RETURN_FAILURE(
- isolate, NewTypeError(MessageTemplate::kUndefinedOrNullToObject));
- }
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
+ Object::ToObject(isolate, object));
Maybe<bool> result =
Runtime::DeleteObjectProperty(isolate, receiver, key, language_mode);
MAYBE_RETURN(result, isolate->heap()->exception());
@@ -603,11 +541,10 @@ static Object* HasOwnPropertyImplementation(Isolate* isolate,
// Handle hidden prototypes. If there's a hidden prototype above this thing
// then we have to check it for properties, because they are supposed to
// look like they are on this object.
- PrototypeIterator iter(isolate, object);
- if (!iter.IsAtEnd() &&
- PrototypeIterator::GetCurrent<HeapObject>(iter)
- ->map()
- ->is_hidden_prototype()) {
+ if (object->map()->has_hidden_prototype()) {
+ PrototypeIterator iter(isolate, object);
+ DCHECK(!iter.IsAtEnd());
+
// TODO(verwaest): The recursion is not necessary for keys that are array
// indices. Removing this.
// Casting to JSObject is fine because JSProxies are never used as
@@ -652,7 +589,7 @@ RUNTIME_FUNCTION(Runtime_HasOwnProperty) {
}
Map* map = js_obj->map();
if (!key_is_array_index && !map->has_named_interceptor() &&
- !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) {
+ !map->has_hidden_prototype()) {
return isolate->heap()->false_value();
}
// Slow case.
@@ -716,32 +653,6 @@ RUNTIME_FUNCTION(Runtime_PropertyIsEnumerable) {
}
-// Returns either a FixedArray or, if the given object has an enum cache that
-// contains all enumerable properties of the object and its prototypes have
-// none, the map of the object. This is used to speed up the check for
-// deletions during a for-in.
-RUNTIME_FUNCTION(Runtime_GetPropertyNamesFast) {
- SealHandleScope shs(isolate);
- DCHECK(args.length() == 1);
-
- CONVERT_ARG_CHECKED(JSReceiver, raw_object, 0);
-
- if (raw_object->IsSimpleEnum()) return raw_object->map();
-
- HandleScope scope(isolate);
- Handle<JSReceiver> object(raw_object);
- Handle<FixedArray> content;
- ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, content, JSReceiver::GetKeys(object, JSReceiver::INCLUDE_PROTOS,
- ENUMERABLE_STRINGS));
-
- // Test again, since cache may have been built by preceding call.
- if (object->IsSimpleEnum()) return object->map();
-
- return *content;
-}
-
-
RUNTIME_FUNCTION(Runtime_GetOwnPropertyKeys) {
HandleScope scope(isolate);
DCHECK(args.length() == 2);
@@ -751,8 +662,8 @@ RUNTIME_FUNCTION(Runtime_GetOwnPropertyKeys) {
Handle<FixedArray> keys;
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, keys, JSReceiver::GetKeys(object, JSReceiver::OWN_ONLY, filter,
- CONVERT_TO_STRING));
+ isolate, keys,
+ JSReceiver::GetKeys(object, OWN_ONLY, filter, CONVERT_TO_STRING));
return *isolate->factory()->NewJSArrayWithElements(keys);
}
@@ -943,6 +854,30 @@ RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) {
return *result;
}
+RUNTIME_FUNCTION(Runtime_DefineDataPropertyInLiteral) {
+ HandleScope scope(isolate);
+ DCHECK(args.length() == 5);
+ CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
+ CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
+ CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
+ CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3);
+ CONVERT_SMI_ARG_CHECKED(set_function_name, 4);
+
+ if (FLAG_harmony_function_name && set_function_name) {
+ DCHECK(value->IsJSFunction());
+ JSFunction::SetName(Handle<JSFunction>::cast(value), name,
+ isolate->factory()->empty_string());
+ }
+
+ LookupIterator it = LookupIterator::PropertyOrElement(isolate, object, name,
+ LookupIterator::OWN);
+ // Cannot fail since this should only be called when
+ // creating an object literal.
+ CHECK(JSObject::DefineOwnPropertyIgnoreAttributes(&it, value, attrs,
+ Object::DONT_THROW)
+ .IsJust());
+ return *object;
+}
// Return property without being observable by accessors or interceptors.
RUNTIME_FUNCTION(Runtime_GetDataProperty) {
@@ -972,34 +907,6 @@ RUNTIME_FUNCTION(Runtime_ValueOf) {
}
-RUNTIME_FUNCTION(Runtime_SetValueOf) {
- SealHandleScope shs(isolate);
- DCHECK(args.length() == 2);
- CONVERT_ARG_CHECKED(Object, obj, 0);
- CONVERT_ARG_CHECKED(Object, value, 1);
- if (!obj->IsJSValue()) return value;
- JSValue::cast(obj)->set_value(value);
- return value;
-}
-
-
-RUNTIME_FUNCTION(Runtime_JSValueGetValue) {
- SealHandleScope shs(isolate);
- DCHECK(args.length() == 1);
- CONVERT_ARG_CHECKED(JSValue, obj, 0);
- return JSValue::cast(obj)->value();
-}
-
-
-RUNTIME_FUNCTION(Runtime_ObjectEquals) {
- SealHandleScope shs(isolate);
- DCHECK(args.length() == 2);
- CONVERT_ARG_CHECKED(Object, obj1, 0);
- CONVERT_ARG_CHECKED(Object, obj2, 1);
- return isolate->heap()->ToBoolean(obj1 == obj2);
-}
-
-
RUNTIME_FUNCTION(Runtime_IsJSReceiver) {
SealHandleScope shs(isolate);
DCHECK(args.length() == 1);
@@ -1034,6 +941,11 @@ RUNTIME_FUNCTION(Runtime_DefineGetterPropertyUnchecked) {
CONVERT_ARG_HANDLE_CHECKED(JSFunction, getter, 2);
CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3);
+ if (FLAG_harmony_function_name &&
+ String::cast(getter->shared()->name())->length() == 0) {
+ JSFunction::SetName(getter, name, isolate->factory()->get_string());
+ }
+
RETURN_FAILURE_ON_EXCEPTION(
isolate,
JSObject::DefineAccessor(object, name, getter,
@@ -1050,6 +962,11 @@ RUNTIME_FUNCTION(Runtime_DefineSetterPropertyUnchecked) {
CONVERT_ARG_HANDLE_CHECKED(JSFunction, setter, 2);
CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3);
+ if (FLAG_harmony_function_name &&
+ String::cast(setter->shared()->name())->length() == 0) {
+ JSFunction::SetName(setter, name, isolate->factory()->set_string());
+ }
+
RETURN_FAILURE_ON_EXCEPTION(
isolate,
JSObject::DefineAccessor(object, name, isolate->factory()->null_value(),
@@ -1063,11 +980,9 @@ RUNTIME_FUNCTION(Runtime_ToObject) {
DCHECK_EQ(1, args.length());
CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
Handle<JSReceiver> receiver;
- if (JSReceiver::ToObject(isolate, object).ToHandle(&receiver)) {
- return *receiver;
- }
- THROW_NEW_ERROR_RETURN_FAILURE(
- isolate, NewTypeError(MessageTemplate::kUndefinedOrNullToObject));
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
+ Object::ToObject(isolate, object));
+ return *receiver;
}
@@ -1180,41 +1095,33 @@ RUNTIME_FUNCTION(Runtime_StrictEquals) {
}
-// TODO(bmeurer): Kill this special wrapper and use TF compatible LessThan,
-// GreaterThan, etc. which return true or false.
-RUNTIME_FUNCTION(Runtime_Compare) {
- HandleScope scope(isolate);
- DCHECK_EQ(3, args.length());
- CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
- CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
- CONVERT_ARG_HANDLE_CHECKED(Object, ncr, 2);
- Maybe<ComparisonResult> result = Object::Compare(x, y);
- if (result.IsJust()) {
- switch (result.FromJust()) {
- case ComparisonResult::kLessThan:
- return Smi::FromInt(LESS);
- case ComparisonResult::kEqual:
- return Smi::FromInt(EQUAL);
- case ComparisonResult::kGreaterThan:
- return Smi::FromInt(GREATER);
- case ComparisonResult::kUndefined:
- return *ncr;
- }
- UNREACHABLE();
- }
- return isolate->heap()->exception();
+RUNTIME_FUNCTION(Runtime_SameValue) {
+ SealHandleScope scope(isolate);
+ DCHECK_EQ(2, args.length());
+ CONVERT_ARG_CHECKED(Object, x, 0);
+ CONVERT_ARG_CHECKED(Object, y, 1);
+ return isolate->heap()->ToBoolean(x->SameValue(y));
+}
+
+
+RUNTIME_FUNCTION(Runtime_SameValueZero) {
+ SealHandleScope scope(isolate);
+ DCHECK_EQ(2, args.length());
+ CONVERT_ARG_CHECKED(Object, x, 0);
+ CONVERT_ARG_CHECKED(Object, y, 1);
+ return isolate->heap()->ToBoolean(x->SameValueZero(y));
}
// TODO(bmeurer): Kill this special wrapper and use TF compatible LessThan,
// GreaterThan, etc. which return true or false.
-RUNTIME_FUNCTION(Runtime_Compare_Strong) {
+RUNTIME_FUNCTION(Runtime_Compare) {
HandleScope scope(isolate);
DCHECK_EQ(3, args.length());
CONVERT_ARG_HANDLE_CHECKED(Object, x, 0);
CONVERT_ARG_HANDLE_CHECKED(Object, y, 1);
CONVERT_ARG_HANDLE_CHECKED(Object, ncr, 2);
- Maybe<ComparisonResult> result = Object::Compare(x, y, Strength::STRONG);
+ Maybe<ComparisonResult> result = Object::Compare(x, y);
if (result.IsJust()) {
switch (result.FromJust()) {
case ComparisonResult::kLessThan:
@@ -1268,7 +1175,9 @@ RUNTIME_FUNCTION(Runtime_InstanceOf) {
NewTypeError(MessageTemplate::kInstanceofNonobjectProto, prototype));
}
// Return whether or not {prototype} is in the prototype chain of {object}.
- Maybe<bool> result = Object::HasInPrototypeChain(isolate, object, prototype);
+ Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
+ Maybe<bool> result =
+ JSReceiver::HasInPrototypeChain(isolate, receiver, prototype);
MAYBE_RETURN(result, isolate->heap()->exception());
return isolate->heap()->ToBoolean(result.FromJust());
}
@@ -1277,9 +1186,10 @@ RUNTIME_FUNCTION(Runtime_InstanceOf) {
RUNTIME_FUNCTION(Runtime_HasInPrototypeChain) {
HandleScope scope(isolate);
DCHECK_EQ(2, args.length());
- CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
+ CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1);
- Maybe<bool> result = Object::HasInPrototypeChain(isolate, object, prototype);
+ Maybe<bool> result =
+ JSReceiver::HasInPrototypeChain(isolate, object, prototype);
MAYBE_RETURN(result, isolate->heap()->exception());
return isolate->heap()->ToBoolean(result.FromJust());
}
@@ -1291,7 +1201,11 @@ RUNTIME_FUNCTION(Runtime_CreateIterResultObject) {
DCHECK_EQ(2, args.length());
CONVERT_ARG_HANDLE_CHECKED(Object, value, 0);
CONVERT_ARG_HANDLE_CHECKED(Object, done, 1);
- return *isolate->factory()->NewJSIteratorResult(value, done);
+ Handle<JSObject> result =
+ isolate->factory()->NewJSObjectFromMap(isolate->iterator_result_map());
+ result->InObjectPropertyAtPut(JSIteratorResult::kValueIndex, *value);
+ result->InObjectPropertyAtPut(JSIteratorResult::kDoneIndex, *done);
+ return *result;
}