diff options
Diffstat (limited to 'deps/v8/src/runtime/runtime-object.cc')
-rw-r--r-- | deps/v8/src/runtime/runtime-object.cc | 197 |
1 files changed, 89 insertions, 108 deletions
diff --git a/deps/v8/src/runtime/runtime-object.cc b/deps/v8/src/runtime/runtime-object.cc index 407f237794..96d9331038 100644 --- a/deps/v8/src/runtime/runtime-object.cc +++ b/deps/v8/src/runtime/runtime-object.cc @@ -99,7 +99,7 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, Handle<Object> object, Handle<Object> key, Handle<Object> value, - StrictMode strict_mode) { + LanguageMode language_mode) { if (object->IsUndefined() || object->IsNull()) { Handle<Object> args[2] = {key, object}; THROW_NEW_ERROR(isolate, NewTypeError("non_object_property_store", @@ -117,7 +117,7 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, } Handle<Name> name = Handle<Name>::cast(name_object); return Object::SetProperty(Handle<JSProxy>::cast(object), name, value, - strict_mode); + language_mode); } // Check if the given key is an array index. @@ -148,7 +148,7 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, } MaybeHandle<Object> result = JSObject::SetElement( - js_object, index, value, NONE, strict_mode, true, SET_PROPERTY); + js_object, index, value, NONE, language_mode, true, SET_PROPERTY); JSObject::ValidateElements(js_object); return result.is_null() ? result : value; @@ -166,11 +166,11 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, isolate, value, Execution::ToNumber(isolate, value), Object); } } - return JSObject::SetElement(js_object, index, value, NONE, strict_mode, + return JSObject::SetElement(js_object, index, value, NONE, language_mode, true, SET_PROPERTY); } else { if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); - return Object::SetProperty(object, name, value, strict_mode); + return Object::SetProperty(object, name, value, language_mode); } } @@ -184,17 +184,17 @@ MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, // TODO(verwaest): Support non-JSObject receivers. if (!object->IsJSObject()) return value; Handle<JSObject> js_object = Handle<JSObject>::cast(object); - return JSObject::SetElement(js_object, index, value, NONE, strict_mode, + return JSObject::SetElement(js_object, index, value, NONE, language_mode, true, SET_PROPERTY); } - return Object::SetProperty(object, name, value, strict_mode); + return Object::SetProperty(object, name, value, language_mode); } MaybeHandle<Object> Runtime::DefineObjectProperty(Handle<JSObject> js_object, Handle<Object> key, Handle<Object> value, - PropertyAttributes attr) { + PropertyAttributes attrs) { Isolate* isolate = js_object->GetIsolate(); // Check if the given key is an array index. uint32_t index; @@ -210,19 +210,19 @@ MaybeHandle<Object> Runtime::DefineObjectProperty(Handle<JSObject> js_object, return value; } - return JSObject::SetElement(js_object, index, value, attr, SLOPPY, false, + return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, DEFINE_PROPERTY); } if (key->IsName()) { Handle<Name> name = Handle<Name>::cast(key); if (name->AsArrayIndex(&index)) { - return JSObject::SetElement(js_object, index, value, attr, SLOPPY, false, + return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, DEFINE_PROPERTY); } else { if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); return JSObject::SetOwnPropertyIgnoreAttributes(js_object, name, value, - attr); + attrs); } } @@ -233,11 +233,11 @@ MaybeHandle<Object> Runtime::DefineObjectProperty(Handle<JSObject> js_object, Handle<String> name = Handle<String>::cast(converted); if (name->AsArrayIndex(&index)) { - return JSObject::SetElement(js_object, index, value, attr, SLOPPY, false, + return JSObject::SetElement(js_object, index, value, attrs, SLOPPY, false, DEFINE_PROPERTY); } else { return JSObject::SetOwnPropertyIgnoreAttributes(js_object, name, value, - attr); + attrs); } } @@ -601,38 +601,12 @@ RUNTIME_FUNCTION(Runtime_KeyedGetProperty) { DisallowHeapAllocation no_allocation; Handle<JSObject> receiver = Handle<JSObject>::cast(receiver_obj); Handle<Name> key = Handle<Name>::cast(key_obj); - if (receiver->HasFastProperties()) { - // Attempt to use lookup cache. - Handle<Map> receiver_map(receiver->map(), isolate); - KeyedLookupCache* keyed_lookup_cache = isolate->keyed_lookup_cache(); - int index = keyed_lookup_cache->Lookup(receiver_map, key); - if (index != -1) { - // Doubles are not cached, so raw read the value. - return receiver->RawFastPropertyAt( - FieldIndex::ForKeyedLookupCacheIndex(*receiver_map, index)); - } - // Lookup cache miss. Perform lookup and update the cache if - // appropriate. - LookupIterator it(receiver, key, LookupIterator::OWN); - if (it.state() == LookupIterator::DATA && - it.property_details().type() == FIELD) { - FieldIndex field_index = it.GetFieldIndex(); - // Do not track double fields in the keyed lookup cache. Reading - // double values requires boxing. - if (!it.representation().IsDouble()) { - keyed_lookup_cache->Update(receiver_map, key, - field_index.GetKeyedLookupCacheIndex()); - } - AllowHeapAllocation allow_allocation; - return *JSObject::FastPropertyAt(receiver, it.representation(), - field_index); - } - } else { + if (!receiver->HasFastProperties()) { // Attempt dictionary lookup. NameDictionary* dictionary = receiver->property_dictionary(); int entry = dictionary->FindEntry(key); if ((entry != NameDictionary::kNotFound) && - (dictionary->DetailsAt(entry).type() == FIELD)) { + (dictionary->DetailsAt(entry).type() == DATA)) { Object* value = dictionary->ValueAt(entry); if (!receiver->IsGlobalObject()) return value; value = PropertyCell::cast(value)->value(); @@ -690,12 +664,7 @@ RUNTIME_FUNCTION(Runtime_AddNamedProperty) { CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); - CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); - RUNTIME_ASSERT( - (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); - // Compute attributes. - PropertyAttributes attributes = - static_cast<PropertyAttributes>(unchecked_attributes); + CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); #ifdef DEBUG uint32_t index = 0; @@ -709,7 +678,7 @@ RUNTIME_FUNCTION(Runtime_AddNamedProperty) { Handle<Object> result; ASSIGN_RETURN_FAILURE_ON_EXCEPTION( isolate, result, - JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attributes)); + JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attrs)); return *result; } @@ -721,13 +690,13 @@ RUNTIME_FUNCTION(Runtime_SetProperty) { CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); - CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode_arg, 3); - StrictMode strict_mode = strict_mode_arg; + CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode_arg, 3); + LanguageMode language_mode = language_mode_arg; Handle<Object> result; ASSIGN_RETURN_FAILURE_ON_EXCEPTION( isolate, result, - Runtime::SetObjectProperty(isolate, object, key, value, strict_mode)); + Runtime::SetObjectProperty(isolate, object, key, value, language_mode)); return *result; } @@ -741,20 +710,15 @@ RUNTIME_FUNCTION(Runtime_AddElement) { CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); - CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); - RUNTIME_ASSERT( - (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); - // Compute attributes. - PropertyAttributes attributes = - static_cast<PropertyAttributes>(unchecked_attributes); + CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); uint32_t index = 0; key->ToArrayIndex(&index); Handle<Object> result; ASSIGN_RETURN_FAILURE_ON_EXCEPTION( - isolate, result, JSObject::SetElement(object, index, value, attributes, - SLOPPY, false, DEFINE_PROPERTY)); + isolate, result, JSObject::SetElement(object, index, value, attrs, SLOPPY, + false, DEFINE_PROPERTY)); return *result; } @@ -764,13 +728,10 @@ RUNTIME_FUNCTION(Runtime_DeleteProperty) { DCHECK(args.length() == 3); CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); - CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); - JSReceiver::DeleteMode delete_mode = strict_mode == STRICT - ? JSReceiver::STRICT_DELETION - : JSReceiver::NORMAL_DELETION; + CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 2); Handle<Object> result; ASSIGN_RETURN_FAILURE_ON_EXCEPTION( - isolate, result, JSReceiver::DeleteProperty(object, key, delete_mode)); + isolate, result, JSReceiver::DeleteProperty(object, key, language_mode)); return *result; } @@ -1066,9 +1027,9 @@ RUNTIME_FUNCTION(Runtime_GetOwnElementNames) { } CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); - int n = obj->NumberOfOwnElements(static_cast<PropertyAttributes>(NONE)); + int n = obj->NumberOfOwnElements(NONE); Handle<FixedArray> names = isolate->factory()->NewFixedArray(n); - obj->GetOwnElementKeys(*names, static_cast<PropertyAttributes>(NONE)); + obj->GetOwnElementKeys(*names, NONE); return *isolate->factory()->NewJSArrayWithElements(names); } @@ -1236,35 +1197,6 @@ RUNTIME_FUNCTION(Runtime_Typeof) { } -RUNTIME_FUNCTION(Runtime_Booleanize) { - SealHandleScope shs(isolate); - DCHECK(args.length() == 2); - CONVERT_ARG_CHECKED(Object, value_raw, 0); - CONVERT_SMI_ARG_CHECKED(token_raw, 1); - intptr_t value = reinterpret_cast<intptr_t>(value_raw); - Token::Value token = static_cast<Token::Value>(token_raw); - switch (token) { - case Token::EQ: - case Token::EQ_STRICT: - return isolate->heap()->ToBoolean(value == 0); - case Token::NE: - case Token::NE_STRICT: - return isolate->heap()->ToBoolean(value != 0); - case Token::LT: - return isolate->heap()->ToBoolean(value < 0); - case Token::GT: - return isolate->heap()->ToBoolean(value > 0); - case Token::LTE: - return isolate->heap()->ToBoolean(value <= 0); - case Token::GTE: - return isolate->heap()->ToBoolean(value >= 0); - default: - // This should only happen during natives fuzzing. - return isolate->heap()->undefined_value(); - } -} - - RUNTIME_FUNCTION(Runtime_NewStringWrapper) { HandleScope scope(isolate); DCHECK(args.length() == 1); @@ -1282,6 +1214,7 @@ RUNTIME_FUNCTION(Runtime_AllocateHeapNumber) { static Object* Runtime_NewObjectHelper(Isolate* isolate, Handle<Object> constructor, + Handle<Object> original_constructor, Handle<AllocationSite> site) { // If the constructor isn't a proper function we throw a type error. if (!constructor->IsJSFunction()) { @@ -1292,6 +1225,11 @@ static Object* Runtime_NewObjectHelper(Isolate* isolate, Handle<JSFunction> function = Handle<JSFunction>::cast(constructor); + CHECK(original_constructor->IsJSFunction()); + Handle<JSFunction> original_function = + Handle<JSFunction>::cast(original_constructor); + + // If function should not have prototype, construction is not allowed. In this // case generated code bailouts here, since function has no initial_map. if (!function->should_have_prototype() && !function->shared()->bound()) { @@ -1334,6 +1272,18 @@ static Object* Runtime_NewObjectHelper(Isolate* isolate, result = isolate->factory()->NewJSObjectWithMemento(function, site); } + // Set up the prototoype using original function. + // TODO(dslomov): instead of setting the __proto__, + // use and cache the correct map. + if (*original_function != *function) { + if (original_function->has_instance_prototype()) { + Handle<Object> prototype = + handle(original_function->instance_prototype(), isolate); + RETURN_FAILURE_ON_EXCEPTION( + isolate, JSObject::SetPrototype(result, prototype, false)); + } + } + isolate->counters()->constructed_objects()->Increment(); isolate->counters()->constructed_objects_runtime()->Increment(); @@ -1343,16 +1293,18 @@ static Object* Runtime_NewObjectHelper(Isolate* isolate, RUNTIME_FUNCTION(Runtime_NewObject) { HandleScope scope(isolate); - DCHECK(args.length() == 1); + DCHECK(args.length() == 2); CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 0); - return Runtime_NewObjectHelper(isolate, constructor, + CONVERT_ARG_HANDLE_CHECKED(Object, original_constructor, 1); + return Runtime_NewObjectHelper(isolate, constructor, original_constructor, Handle<AllocationSite>::null()); } RUNTIME_FUNCTION(Runtime_NewObjectWithAllocationSite) { HandleScope scope(isolate); - DCHECK(args.length() == 2); + DCHECK(args.length() == 3); + CONVERT_ARG_HANDLE_CHECKED(Object, original_constructor, 2); CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 1); CONVERT_ARG_HANDLE_CHECKED(Object, feedback, 0); Handle<AllocationSite> site; @@ -1360,7 +1312,8 @@ RUNTIME_FUNCTION(Runtime_NewObjectWithAllocationSite) { // The feedback can be an AllocationSite or undefined. site = Handle<AllocationSite>::cast(feedback); } - return Runtime_NewObjectHelper(isolate, constructor, site); + return Runtime_NewObjectHelper(isolate, constructor, original_constructor, + site); } @@ -1465,12 +1418,10 @@ RUNTIME_FUNCTION(Runtime_DefineAccessorPropertyUnchecked) { RUNTIME_ASSERT(IsValidAccessor(getter)); CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3); RUNTIME_ASSERT(IsValidAccessor(setter)); - CONVERT_SMI_ARG_CHECKED(unchecked, 4); - RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); - PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); + CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 4); RETURN_FAILURE_ON_EXCEPTION( - isolate, JSObject::DefineAccessor(obj, name, getter, setter, attr)); + isolate, JSObject::DefineAccessor(obj, name, getter, setter, attrs)); return isolate->heap()->undefined_value(); } @@ -1487,9 +1438,7 @@ RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) { CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); CONVERT_ARG_HANDLE_CHECKED(Object, obj_value, 2); - CONVERT_SMI_ARG_CHECKED(unchecked, 3); - RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); - PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); + CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); LookupIterator it(js_object, name, LookupIterator::OWN_SKIP_INTERCEPTOR); if (it.IsFound() && it.state() == LookupIterator::ACCESS_CHECK) { @@ -1508,14 +1457,14 @@ RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) { ASSIGN_RETURN_FAILURE_ON_EXCEPTION( isolate, result, JSObject::SetOwnPropertyIgnoreAttributes( - js_object, name, obj_value, attr, JSObject::DONT_FORCE_FIELD)); + js_object, name, obj_value, attrs, JSObject::DONT_FORCE_FIELD)); return *result; } Handle<Object> result; ASSIGN_RETURN_FAILURE_ON_EXCEPTION( isolate, result, - Runtime::DefineObjectProperty(js_object, name, obj_value, attr)); + Runtime::DefineObjectProperty(js_object, name, obj_value, attrs)); return *result; } @@ -1606,5 +1555,37 @@ RUNTIME_FUNCTION(RuntimeReference_ClassOf) { if (!obj->IsJSReceiver()) return isolate->heap()->null_value(); return JSReceiver::cast(obj)->class_name(); } + + +RUNTIME_FUNCTION(Runtime_DefineGetterPropertyUnchecked) { + HandleScope scope(isolate); + DCHECK(args.length() == 4); + CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); + CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); + CONVERT_ARG_HANDLE_CHECKED(JSFunction, getter, 2); + CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); + + RETURN_FAILURE_ON_EXCEPTION( + isolate, + JSObject::DefineAccessor(object, name, getter, + isolate->factory()->null_value(), attrs)); + return isolate->heap()->undefined_value(); +} + + +RUNTIME_FUNCTION(Runtime_DefineSetterPropertyUnchecked) { + HandleScope scope(isolate); + DCHECK(args.length() == 4); + CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); + CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); + CONVERT_ARG_HANDLE_CHECKED(JSFunction, setter, 2); + CONVERT_PROPERTY_ATTRIBUTES_CHECKED(attrs, 3); + + RETURN_FAILURE_ON_EXCEPTION( + isolate, + JSObject::DefineAccessor(object, name, isolate->factory()->null_value(), + setter, attrs)); + return isolate->heap()->undefined_value(); +} } } // namespace v8::internal |