| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 811d72d91d6832645f74579661a4ef4601671122..460132caa7968f470a63abf19a71c2b1ae761e65 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -355,7 +355,7 @@ static Handle<Object> CreateObjectLiteralBoilerplate(
|
| Handle<JSObject> boilerplate = isolate->factory()->NewJSObjectFromMap(map);
|
|
|
| // Normalize the elements of the boilerplate to save space if needed.
|
| - if (!should_have_fast_elements) NormalizeElements(boilerplate);
|
| + if (!should_have_fast_elements) JSObject::NormalizeElements(boilerplate);
|
|
|
| // Add the constant properties to the boilerplate.
|
| int length = constant_properties->length();
|
| @@ -365,7 +365,8 @@ static Handle<Object> CreateObjectLiteralBoilerplate(
|
| // Normalize the properties of object to avoid n^2 behavior
|
| // when extending the object multiple properties. Indicate the number of
|
| // properties to be added.
|
| - NormalizeProperties(boilerplate, KEEP_INOBJECT_PROPERTIES, length / 2);
|
| + JSObject::NormalizeProperties(
|
| + boilerplate, KEEP_INOBJECT_PROPERTIES, length / 2);
|
| }
|
|
|
| for (int index = 0; index < length; index +=2) {
|
| @@ -383,22 +384,18 @@ static Handle<Object> CreateObjectLiteralBoilerplate(
|
| if (key->IsSymbol()) {
|
| if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) {
|
| // Array index as string (uint32).
|
| - result = SetOwnElement(boilerplate,
|
| - element_index,
|
| - value,
|
| - kNonStrictMode);
|
| + result = JSObject::SetOwnElement(
|
| + boilerplate, element_index, value, kNonStrictMode);
|
| } else {
|
| Handle<String> name(String::cast(*key));
|
| ASSERT(!name->AsArrayIndex(&element_index));
|
| - result = SetLocalPropertyIgnoreAttributes(boilerplate, name,
|
| - value, NONE);
|
| + result = JSObject::SetLocalPropertyIgnoreAttributes(
|
| + boilerplate, name, value, NONE);
|
| }
|
| } else if (key->ToArrayIndex(&element_index)) {
|
| // Array index (uint32).
|
| - result = SetOwnElement(boilerplate,
|
| - element_index,
|
| - value,
|
| - kNonStrictMode);
|
| + result = JSObject::SetOwnElement(
|
| + boilerplate, element_index, value, kNonStrictMode);
|
| } else {
|
| // Non-uint32 number.
|
| ASSERT(key->IsNumber());
|
| @@ -408,8 +405,8 @@ static Handle<Object> CreateObjectLiteralBoilerplate(
|
| const char* str = DoubleToCString(num, buffer);
|
| Handle<String> name =
|
| isolate->factory()->NewStringFromAscii(CStrVector(str));
|
| - result = SetLocalPropertyIgnoreAttributes(boilerplate, name,
|
| - value, NONE);
|
| + result = JSObject::SetLocalPropertyIgnoreAttributes(
|
| + boilerplate, name, value, NONE);
|
| }
|
| // If setting the property on the boilerplate throws an
|
| // exception, the exception is converted to an empty handle in
|
| @@ -423,8 +420,8 @@ static Handle<Object> CreateObjectLiteralBoilerplate(
|
| // computed properties have been assigned so that we can generate
|
| // constant function properties.
|
| if (should_transform && !has_function_literal) {
|
| - TransformToFastProperties(boilerplate,
|
| - boilerplate->map()->unused_property_fields());
|
| + JSObject::TransformToFastProperties(
|
| + boilerplate, boilerplate->map()->unused_property_fields());
|
| }
|
|
|
| return boilerplate;
|
| @@ -1335,21 +1332,19 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareGlobals) {
|
| }
|
| PropertyAttributes attributes = static_cast<PropertyAttributes>(attr);
|
|
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - SetLocalPropertyIgnoreAttributes(global,
|
| - name,
|
| - value,
|
| - attributes));
|
| + RETURN_IF_EMPTY_HANDLE(
|
| + isolate,
|
| + JSObject::SetLocalPropertyIgnoreAttributes(global, name, value,
|
| + attributes));
|
| } else {
|
| LanguageMode language_mode = DeclareGlobalsLanguageMode::decode(flags);
|
| StrictModeFlag strict_mode_flag = (language_mode == CLASSIC_MODE)
|
| ? kNonStrictMode : kStrictMode;
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - SetProperty(global,
|
| - name,
|
| - value,
|
| - static_cast<PropertyAttributes>(attr),
|
| - strict_mode_flag));
|
| + RETURN_IF_EMPTY_HANDLE(
|
| + isolate,
|
| + JSReceiver::SetProperty(global, name, value,
|
| + static_cast<PropertyAttributes>(attr),
|
| + strict_mode_flag));
|
| }
|
| }
|
|
|
| @@ -1403,7 +1398,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareContextSlot) {
|
| Handle<JSObject> object = Handle<JSObject>::cast(holder);
|
| RETURN_IF_EMPTY_HANDLE(
|
| isolate,
|
| - SetProperty(object, name, initial_value, mode, kNonStrictMode));
|
| + JSReceiver::SetProperty(object, name, initial_value, mode,
|
| + kNonStrictMode));
|
| }
|
| }
|
|
|
| @@ -1443,9 +1439,9 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DeclareContextSlot) {
|
| return ThrowRedeclarationError(isolate, "const", name);
|
| }
|
| }
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - SetProperty(object, name, value, mode,
|
| - kNonStrictMode));
|
| + RETURN_IF_EMPTY_HANDLE(
|
| + isolate,
|
| + JSReceiver::SetProperty(object, name, value, mode, kNonStrictMode));
|
| }
|
|
|
| return isolate->heap()->undefined_value();
|
| @@ -1554,12 +1550,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstGlobal) {
|
| // property through an interceptor and only do it if it's
|
| // uninitialized, e.g. the hole. Nirk...
|
| // Passing non-strict mode because the property is writable.
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - SetProperty(global,
|
| - name,
|
| - value,
|
| - attributes,
|
| - kNonStrictMode));
|
| + RETURN_IF_EMPTY_HANDLE(
|
| + isolate,
|
| + JSReceiver::SetProperty(global, name, value, attributes,
|
| + kNonStrictMode));
|
| return *value;
|
| }
|
|
|
| @@ -1629,7 +1623,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstContextSlot) {
|
| // Strict mode not needed (const disallowed in strict mode).
|
| RETURN_IF_EMPTY_HANDLE(
|
| isolate,
|
| - SetProperty(global, name, value, NONE, kNonStrictMode));
|
| + JSReceiver::SetProperty(global, name, value, NONE, kNonStrictMode));
|
| return *value;
|
| }
|
|
|
| @@ -1681,7 +1675,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_InitializeConstContextSlot) {
|
| // Strict mode not needed (const disallowed in strict mode).
|
| RETURN_IF_EMPTY_HANDLE(
|
| isolate,
|
| - SetProperty(object, name, value, attributes, kNonStrictMode));
|
| + JSReceiver::SetProperty(object, name, value, attributes,
|
| + kNonStrictMode));
|
| }
|
| }
|
|
|
| @@ -1696,7 +1691,7 @@ RUNTIME_FUNCTION(MaybeObject*,
|
| CONVERT_ARG_CHECKED(JSObject, object, 0);
|
| CONVERT_SMI_ARG_CHECKED(properties, 1);
|
| if (object->HasFastProperties()) {
|
| - NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties);
|
| + JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties);
|
| }
|
| return *object;
|
| }
|
| @@ -1852,7 +1847,7 @@ static Handle<JSFunction> InstallBuiltin(Isolate* isolate,
|
| code,
|
| false);
|
| optimized->shared()->DontAdaptArguments();
|
| - SetProperty(holder, key, optimized, NONE, kStrictMode);
|
| + JSReceiver::SetProperty(holder, key, optimized, NONE, kStrictMode);
|
| return optimized;
|
| }
|
|
|
| @@ -4066,8 +4061,7 @@ MaybeObject* Runtime::GetElementOrCharAt(Isolate* isolate,
|
| }
|
|
|
| if (object->IsString() || object->IsNumber() || object->IsBoolean()) {
|
| - Handle<Object> prototype = GetPrototype(object);
|
| - return prototype->GetElement(index);
|
| + return object->GetPrototype()->GetElement(index);
|
| }
|
|
|
| return object->GetElement(index);
|
| @@ -4134,8 +4128,8 @@ MaybeObject* TransitionElements(Handle<Object> object,
|
| ElementsKind from_kind =
|
| Handle<JSObject>::cast(object)->map()->elements_kind();
|
| if (Map::IsValidElementsTransition(from_kind, to_kind)) {
|
| - Handle<Object> result =
|
| - TransitionElementsKind(Handle<JSObject>::cast(object), to_kind);
|
| + Handle<Object> result = JSObject::TransitionElementsKind(
|
| + Handle<JSObject>::cast(object), to_kind);
|
| if (result.is_null()) return isolate->ThrowIllegalOperation();
|
| return *result;
|
| }
|
| @@ -4307,12 +4301,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) {
|
| return isolate->Throw(*error);
|
| }
|
|
|
| - Handle<NumberDictionary> dictionary = NormalizeElements(js_object);
|
| + Handle<NumberDictionary> dictionary =
|
| + JSObject::NormalizeElements(js_object);
|
| // Make sure that we never go back to fast case.
|
| dictionary->set_requires_slow_elements();
|
| PropertyDetails details = PropertyDetails(attr, NORMAL);
|
| Handle<NumberDictionary> extended_dictionary =
|
| - NumberDictionarySet(dictionary, index, obj_value, details);
|
| + NumberDictionary::Set(dictionary, index, obj_value, details);
|
| if (*extended_dictionary != *dictionary) {
|
| if (js_object->GetElementsKind() == NON_STRICT_ARGUMENTS_ELEMENTS) {
|
| FixedArray::cast(js_object->elements())->set(1, *extended_dictionary);
|
| @@ -4362,7 +4357,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) {
|
| // we don't have to check for null.
|
| js_object = Handle<JSObject>(JSObject::cast(js_object->GetPrototype()));
|
| }
|
| - NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0);
|
| + JSObject::NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0);
|
| // Use IgnoreAttributes version since a readonly property may be
|
| // overridden and SetProperty does not allow this.
|
| return js_object->SetLocalPropertyIgnoreAttributes(*name,
|
| @@ -4387,12 +4382,12 @@ static MaybeObject* NormalizeObjectSetElement(Isolate* isolate,
|
| Handle<Object> value,
|
| PropertyAttributes attr) {
|
| // Normalize the elements to enable attributes on the property.
|
| - Handle<NumberDictionary> dictionary = NormalizeElements(js_object);
|
| + Handle<NumberDictionary> dictionary = JSObject::NormalizeElements(js_object);
|
| // Make sure that we never go back to fast case.
|
| dictionary->set_requires_slow_elements();
|
| PropertyDetails details = PropertyDetails(attr, NORMAL);
|
| Handle<NumberDictionary> extended_dictionary =
|
| - NumberDictionarySet(dictionary, index, value, details);
|
| + NumberDictionary::Set(dictionary, index, value, details);
|
| if (*extended_dictionary != *dictionary) {
|
| js_object->set_elements(*extended_dictionary);
|
| }
|
| @@ -4447,7 +4442,8 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate,
|
| return NormalizeObjectSetElement(isolate, js_object, index, value, attr);
|
| }
|
|
|
| - Handle<Object> result = SetElement(js_object, index, value, strict_mode);
|
| + Handle<Object> result =
|
| + JSObject::SetElement(js_object, index, value, strict_mode);
|
| if (result.is_null()) return Failure::Exception();
|
| return *value;
|
| }
|
| @@ -4462,11 +4458,13 @@ MaybeObject* Runtime::SetObjectProperty(Isolate* isolate,
|
| value,
|
| attr);
|
| }
|
| - result = SetElement(js_object, index, value, strict_mode);
|
| + result =
|
| + JSObject::SetElement(js_object, index, value, strict_mode);
|
| } else {
|
| Handle<String> key_string = Handle<String>::cast(key);
|
| key_string->TryFlatten();
|
| - result = SetProperty(js_object, key_string, value, attr, strict_mode);
|
| + result = JSReceiver::SetProperty(
|
| + js_object, key_string, value, attr, strict_mode);
|
| }
|
| if (result.is_null()) return Failure::Exception();
|
| return *value;
|
| @@ -4655,8 +4653,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) {
|
|
|
| if (value->IsNumber()) {
|
| ASSERT(elements_kind == FAST_SMI_ONLY_ELEMENTS);
|
| - TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS);
|
| - TransitionElementsKind(boilerplate_object, FAST_DOUBLE_ELEMENTS);
|
| + JSObject::TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS);
|
| + JSObject::TransitionElementsKind(boilerplate_object, FAST_DOUBLE_ELEMENTS);
|
| ASSERT(object->GetElementsKind() == FAST_DOUBLE_ELEMENTS);
|
| FixedDoubleArray* double_array =
|
| FixedDoubleArray::cast(object->elements());
|
| @@ -4665,8 +4663,8 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreArrayLiteralElement) {
|
| } else {
|
| ASSERT(elements_kind == FAST_SMI_ONLY_ELEMENTS ||
|
| elements_kind == FAST_DOUBLE_ELEMENTS);
|
| - TransitionElementsKind(object, FAST_ELEMENTS);
|
| - TransitionElementsKind(boilerplate_object, FAST_ELEMENTS);
|
| + JSObject::TransitionElementsKind(object, FAST_ELEMENTS);
|
| + JSObject::TransitionElementsKind(boilerplate_object, FAST_ELEMENTS);
|
| FixedArray* object_array =
|
| FixedArray::cast(object->elements());
|
| object_array->set(store_index, *value);
|
| @@ -5144,31 +5142,20 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_GetArgumentsProperty) {
|
|
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_ToFastProperties) {
|
| - HandleScope scope(isolate);
|
| -
|
| ASSERT(args.length() == 1);
|
| - Handle<Object> object = args.at<Object>(0);
|
| - if (object->IsJSObject()) {
|
| - Handle<JSObject> js_object = Handle<JSObject>::cast(object);
|
| - if (!js_object->HasFastProperties() && !js_object->IsGlobalObject()) {
|
| - MaybeObject* ok = js_object->TransformToFastProperties(0);
|
| - if (ok->IsRetryAfterGC()) return ok;
|
| - }
|
| - }
|
| - return *object;
|
| + Object* object = args[0];
|
| + return (object->IsJSObject() && !object->IsGlobalObject())
|
| + ? JSObject::cast(object)->TransformToFastProperties(0)
|
| + : object;
|
| }
|
|
|
|
|
| RUNTIME_FUNCTION(MaybeObject*, Runtime_ToSlowProperties) {
|
| - HandleScope scope(isolate);
|
| -
|
| ASSERT(args.length() == 1);
|
| - Handle<Object> object = args.at<Object>(0);
|
| - if (object->IsJSObject() && !object->IsJSGlobalProxy()) {
|
| - Handle<JSObject> js_object = Handle<JSObject>::cast(object);
|
| - NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0);
|
| - }
|
| - return *object;
|
| + Object* obj = args[0];
|
| + return (obj->IsJSObject() && !obj->IsJSGlobalProxy())
|
| + ? JSObject::cast(obj)->NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0)
|
| + : obj;
|
| }
|
|
|
|
|
| @@ -9133,7 +9120,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StoreContextSlot) {
|
| (object->GetLocalPropertyAttribute(*name) == ABSENT)) {
|
| RETURN_IF_EMPTY_HANDLE(
|
| isolate,
|
| - SetProperty(object, name, value, NONE, strict_mode));
|
| + JSReceiver::SetProperty(object, name, value, NONE, strict_mode));
|
| } else if (strict_mode == kStrictMode && (attributes & READ_ONLY) != 0) {
|
| // Setting read only property in strict mode.
|
| Handle<Object> error =
|
| @@ -10049,7 +10036,7 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_ArrayConcat) {
|
| // FAST_ELEMENTS.
|
| if (array->HasFastDoubleElements()) {
|
| array = Handle<JSArray>::cast(
|
| - TransitionElementsKind(array, FAST_ELEMENTS));
|
| + JSObject::TransitionElementsKind(array, FAST_ELEMENTS));
|
| }
|
| length_estimate =
|
| static_cast<uint32_t>(array->length()->Number());
|
| @@ -10209,10 +10196,10 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_SwapElements) {
|
| Handle<Object> tmp2 = Object::GetElement(jsobject, index2);
|
| RETURN_IF_EMPTY_HANDLE(isolate, tmp2);
|
|
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - SetElement(jsobject, index1, tmp2, kStrictMode));
|
| - RETURN_IF_EMPTY_HANDLE(isolate,
|
| - SetElement(jsobject, index2, tmp1, kStrictMode));
|
| + RETURN_IF_EMPTY_HANDLE(
|
| + isolate, JSObject::SetElement(jsobject, index1, tmp2, kStrictMode));
|
| + RETURN_IF_EMPTY_HANDLE(
|
| + isolate, JSObject::SetElement(jsobject, index2, tmp1, kStrictMode));
|
|
|
| return isolate->heap()->undefined_value();
|
| }
|
|
|