| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 #include <limits> | 6 #include <limits> |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 // The value contains the constant_properties of a | 260 // The value contains the constant_properties of a |
| 261 // simple object or array literal. | 261 // simple object or array literal. |
| 262 Handle<FixedArray> array = Handle<FixedArray>::cast(value); | 262 Handle<FixedArray> array = Handle<FixedArray>::cast(value); |
| 263 ASSIGN_RETURN_ON_EXCEPTION( | 263 ASSIGN_RETURN_ON_EXCEPTION( |
| 264 isolate, value, | 264 isolate, value, |
| 265 CreateLiteralBoilerplate(isolate, literals, array), | 265 CreateLiteralBoilerplate(isolate, literals, array), |
| 266 Object); | 266 Object); |
| 267 } | 267 } |
| 268 MaybeHandle<Object> maybe_result; | 268 MaybeHandle<Object> maybe_result; |
| 269 uint32_t element_index = 0; | 269 uint32_t element_index = 0; |
| 270 StoreMode mode = value->IsJSObject() ? FORCE_FIELD : ALLOW_AS_CONSTANT; | |
| 271 if (key->IsInternalizedString()) { | 270 if (key->IsInternalizedString()) { |
| 272 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { | 271 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { |
| 273 // Array index as string (uint32). | 272 // Array index as string (uint32). |
| 274 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); | 273 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); |
| 275 maybe_result = | 274 maybe_result = |
| 276 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY); | 275 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY); |
| 277 } else { | 276 } else { |
| 278 Handle<String> name(String::cast(*key)); | 277 Handle<String> name(String::cast(*key)); |
| 279 ASSERT(!name->AsArrayIndex(&element_index)); | 278 ASSERT(!name->AsArrayIndex(&element_index)); |
| 280 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( | 279 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( |
| 281 boilerplate, name, value, NONE, mode); | 280 boilerplate, name, value, NONE); |
| 282 } | 281 } |
| 283 } else if (key->ToArrayIndex(&element_index)) { | 282 } else if (key->ToArrayIndex(&element_index)) { |
| 284 // Array index (uint32). | 283 // Array index (uint32). |
| 285 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); | 284 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); |
| 286 maybe_result = | 285 maybe_result = |
| 287 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY); | 286 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY); |
| 288 } else { | 287 } else { |
| 289 // Non-uint32 number. | 288 // Non-uint32 number. |
| 290 ASSERT(key->IsNumber()); | 289 ASSERT(key->IsNumber()); |
| 291 double num = key->Number(); | 290 double num = key->Number(); |
| 292 char arr[100]; | 291 char arr[100]; |
| 293 Vector<char> buffer(arr, ARRAY_SIZE(arr)); | 292 Vector<char> buffer(arr, ARRAY_SIZE(arr)); |
| 294 const char* str = DoubleToCString(num, buffer); | 293 const char* str = DoubleToCString(num, buffer); |
| 295 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); | 294 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); |
| 296 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( | 295 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(boilerplate, name, |
| 297 boilerplate, name, value, NONE, mode); | 296 value, NONE); |
| 298 } | 297 } |
| 299 // If setting the property on the boilerplate throws an | 298 // If setting the property on the boilerplate throws an |
| 300 // exception, the exception is converted to an empty handle in | 299 // exception, the exception is converted to an empty handle in |
| 301 // the handle based operations. In that case, we need to | 300 // the handle based operations. In that case, we need to |
| 302 // convert back to an exception. | 301 // convert back to an exception. |
| 303 RETURN_ON_EXCEPTION(isolate, maybe_result, Object); | 302 RETURN_ON_EXCEPTION(isolate, maybe_result, Object); |
| 304 } | 303 } |
| 305 | 304 |
| 306 // Transform to fast properties if necessary. For object literals with | 305 // Transform to fast properties if necessary. For object literals with |
| 307 // containing function literals we defer this operation until after all | 306 // containing function literals we defer this operation until after all |
| (...skipping 4656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4964 JSObject::NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0); | 4963 JSObject::NormalizeProperties(js_object, CLEAR_INOBJECT_PROPERTIES, 0); |
| 4965 } | 4964 } |
| 4966 | 4965 |
| 4967 // Use IgnoreAttributes version since a readonly property may be | 4966 // Use IgnoreAttributes version since a readonly property may be |
| 4968 // overridden and SetProperty does not allow this. | 4967 // overridden and SetProperty does not allow this. |
| 4969 Handle<Object> result; | 4968 Handle<Object> result; |
| 4970 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 4969 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 4971 isolate, result, | 4970 isolate, result, |
| 4972 JSObject::SetOwnPropertyIgnoreAttributes( | 4971 JSObject::SetOwnPropertyIgnoreAttributes( |
| 4973 js_object, name, obj_value, attr, | 4972 js_object, name, obj_value, attr, |
| 4974 ALLOW_AS_CONSTANT, | |
| 4975 JSReceiver::PERFORM_EXTENSIBILITY_CHECK, | 4973 JSReceiver::PERFORM_EXTENSIBILITY_CHECK, |
| 4976 JSReceiver::MAY_BE_STORE_FROM_KEYED, | 4974 JSReceiver::MAY_BE_STORE_FROM_KEYED, |
| 4977 JSObject::DONT_FORCE_FIELD)); | 4975 JSObject::DONT_FORCE_FIELD)); |
| 4978 return *result; | 4976 return *result; |
| 4979 } | 4977 } |
| 4980 | 4978 |
| 4981 Handle<Object> result; | 4979 Handle<Object> result; |
| 4982 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 4980 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 4983 isolate, result, | 4981 isolate, result, |
| 4984 Runtime::DefineObjectProperty( | 4982 Runtime::DefineObjectProperty( |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5117 } | 5115 } |
| 5118 | 5116 |
| 5119 if (key->IsName()) { | 5117 if (key->IsName()) { |
| 5120 Handle<Name> name = Handle<Name>::cast(key); | 5118 Handle<Name> name = Handle<Name>::cast(key); |
| 5121 if (name->AsArrayIndex(&index)) { | 5119 if (name->AsArrayIndex(&index)) { |
| 5122 return JSObject::SetElement(js_object, index, value, attr, | 5120 return JSObject::SetElement(js_object, index, value, attr, |
| 5123 SLOPPY, false, DEFINE_PROPERTY); | 5121 SLOPPY, false, DEFINE_PROPERTY); |
| 5124 } else { | 5122 } else { |
| 5125 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); | 5123 if (name->IsString()) name = String::Flatten(Handle<String>::cast(name)); |
| 5126 return JSObject::SetOwnPropertyIgnoreAttributes( | 5124 return JSObject::SetOwnPropertyIgnoreAttributes( |
| 5127 js_object, name, value, attr, ALLOW_AS_CONSTANT, | 5125 js_object, name, value, attr, JSReceiver::PERFORM_EXTENSIBILITY_CHECK, |
| 5128 JSReceiver::PERFORM_EXTENSIBILITY_CHECK, store_from_keyed); | 5126 store_from_keyed); |
| 5129 } | 5127 } |
| 5130 } | 5128 } |
| 5131 | 5129 |
| 5132 // Call-back into JavaScript to convert the key to a string. | 5130 // Call-back into JavaScript to convert the key to a string. |
| 5133 Handle<Object> converted; | 5131 Handle<Object> converted; |
| 5134 ASSIGN_RETURN_ON_EXCEPTION( | 5132 ASSIGN_RETURN_ON_EXCEPTION( |
| 5135 isolate, converted, Execution::ToString(isolate, key), Object); | 5133 isolate, converted, Execution::ToString(isolate, key), Object); |
| 5136 Handle<String> name = Handle<String>::cast(converted); | 5134 Handle<String> name = Handle<String>::cast(converted); |
| 5137 | 5135 |
| 5138 if (name->AsArrayIndex(&index)) { | 5136 if (name->AsArrayIndex(&index)) { |
| 5139 return JSObject::SetElement(js_object, index, value, attr, | 5137 return JSObject::SetElement(js_object, index, value, attr, |
| 5140 SLOPPY, false, DEFINE_PROPERTY); | 5138 SLOPPY, false, DEFINE_PROPERTY); |
| 5141 } else { | 5139 } else { |
| 5142 return JSObject::SetOwnPropertyIgnoreAttributes( | 5140 return JSObject::SetOwnPropertyIgnoreAttributes( |
| 5143 js_object, name, value, attr, ALLOW_AS_CONSTANT, | 5141 js_object, name, value, attr, JSReceiver::PERFORM_EXTENSIBILITY_CHECK, |
| 5144 JSReceiver::PERFORM_EXTENSIBILITY_CHECK, store_from_keyed); | 5142 store_from_keyed); |
| 5145 } | 5143 } |
| 5146 } | 5144 } |
| 5147 | 5145 |
| 5148 | 5146 |
| 5149 MaybeHandle<Object> Runtime::DeleteObjectProperty(Isolate* isolate, | 5147 MaybeHandle<Object> Runtime::DeleteObjectProperty(Isolate* isolate, |
| 5150 Handle<JSReceiver> receiver, | 5148 Handle<JSReceiver> receiver, |
| 5151 Handle<Object> key, | 5149 Handle<Object> key, |
| 5152 JSReceiver::DeleteMode mode) { | 5150 JSReceiver::DeleteMode mode) { |
| 5153 // Check if the given key is an array index. | 5151 // Check if the given key is an array index. |
| 5154 uint32_t index; | 5152 uint32_t index; |
| (...skipping 9811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14966 } | 14964 } |
| 14967 return NULL; | 14965 return NULL; |
| 14968 } | 14966 } |
| 14969 | 14967 |
| 14970 | 14968 |
| 14971 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 14969 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
| 14972 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 14970 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
| 14973 } | 14971 } |
| 14974 | 14972 |
| 14975 } } // namespace v8::internal | 14973 } } // namespace v8::internal |
| OLD | NEW |