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 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 isolate, value, | 263 isolate, value, |
264 CreateLiteralBoilerplate(isolate, literals, array), | 264 CreateLiteralBoilerplate(isolate, literals, array), |
265 Object); | 265 Object); |
266 } | 266 } |
267 MaybeHandle<Object> maybe_result; | 267 MaybeHandle<Object> maybe_result; |
268 uint32_t element_index = 0; | 268 uint32_t element_index = 0; |
269 StoreMode mode = value->IsJSObject() ? FORCE_FIELD : ALLOW_AS_CONSTANT; | 269 StoreMode mode = value->IsJSObject() ? FORCE_FIELD : ALLOW_AS_CONSTANT; |
270 if (key->IsInternalizedString()) { | 270 if (key->IsInternalizedString()) { |
271 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { | 271 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { |
272 // Array index as string (uint32). | 272 // Array index as string (uint32). |
273 if (value->IsUninitialized()) { | 273 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); |
274 maybe_result = value; | 274 maybe_result = |
275 } else { | 275 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY); |
276 maybe_result = JSObject::SetOwnElement( | |
277 boilerplate, element_index, value, SLOPPY); | |
278 } | |
279 } else { | 276 } else { |
280 Handle<String> name(String::cast(*key)); | 277 Handle<String> name(String::cast(*key)); |
281 ASSERT(!name->AsArrayIndex(&element_index)); | 278 ASSERT(!name->AsArrayIndex(&element_index)); |
282 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( | 279 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( |
283 boilerplate, name, value, NONE, mode); | 280 boilerplate, name, value, NONE, mode); |
284 } | 281 } |
285 } else if (key->ToArrayIndex(&element_index)) { | 282 } else if (key->ToArrayIndex(&element_index)) { |
286 // Array index (uint32). | 283 // Array index (uint32). |
287 if (value->IsUninitialized()) { | 284 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); |
288 maybe_result = value; | 285 maybe_result = |
289 } else { | 286 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY); |
290 maybe_result = JSObject::SetOwnElement( | |
291 boilerplate, element_index, value, SLOPPY); | |
292 } | |
293 } else { | 287 } else { |
294 // Non-uint32 number. | 288 // Non-uint32 number. |
295 ASSERT(key->IsNumber()); | 289 ASSERT(key->IsNumber()); |
296 double num = key->Number(); | 290 double num = key->Number(); |
297 char arr[100]; | 291 char arr[100]; |
298 Vector<char> buffer(arr, ARRAY_SIZE(arr)); | 292 Vector<char> buffer(arr, ARRAY_SIZE(arr)); |
299 const char* str = DoubleToCString(num, buffer); | 293 const char* str = DoubleToCString(num, buffer); |
300 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); | 294 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); |
301 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( | 295 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( |
302 boilerplate, name, value, NONE, mode); | 296 boilerplate, name, value, NONE, mode); |
(...skipping 5020 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5323 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); | 5317 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); |
5324 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); | 5318 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); |
5325 RUNTIME_ASSERT( | 5319 RUNTIME_ASSERT( |
5326 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); | 5320 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); |
5327 // Compute attributes. | 5321 // Compute attributes. |
5328 PropertyAttributes attributes = | 5322 PropertyAttributes attributes = |
5329 static_cast<PropertyAttributes>(unchecked_attributes); | 5323 static_cast<PropertyAttributes>(unchecked_attributes); |
5330 | 5324 |
5331 #ifdef DEBUG | 5325 #ifdef DEBUG |
5332 bool duplicate; | 5326 bool duplicate; |
5333 if (key->IsName()) { | 5327 uint32_t index = 0; |
| 5328 if (key->IsName() || !key->ToArrayIndex(&index)) { |
| 5329 if (key->IsNumber()) { |
| 5330 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key, |
| 5331 Execution::ToString(isolate, key)); |
| 5332 } |
5334 LookupIterator it(object, Handle<Name>::cast(key), | 5333 LookupIterator it(object, Handle<Name>::cast(key), |
5335 LookupIterator::CHECK_OWN_REAL); | 5334 LookupIterator::CHECK_OWN_REAL); |
5336 JSReceiver::GetPropertyAttributes(&it); | 5335 JSReceiver::GetPropertyAttributes(&it); |
5337 duplicate = it.IsFound(); | 5336 duplicate = it.IsFound(); |
5338 } else { | 5337 } else { |
5339 uint32_t index = 0; | |
5340 RUNTIME_ASSERT(key->ToArrayIndex(&index)); | |
5341 duplicate = JSReceiver::HasOwnElement(object, index); | 5338 duplicate = JSReceiver::HasOwnElement(object, index); |
5342 } | 5339 } |
5343 RUNTIME_ASSERT(!duplicate); | 5340 RUNTIME_ASSERT(!duplicate); |
5344 #endif | 5341 #endif |
5345 | 5342 |
5346 Handle<Object> result; | 5343 Handle<Object> result; |
5347 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 5344 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
5348 isolate, result, | 5345 isolate, result, |
5349 Runtime::DefineObjectProperty(object, key, value, attributes)); | 5346 Runtime::DefineObjectProperty(object, key, value, attributes)); |
5350 return *result; | 5347 return *result; |
(...skipping 9757 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
15108 } | 15105 } |
15109 return NULL; | 15106 return NULL; |
15110 } | 15107 } |
15111 | 15108 |
15112 | 15109 |
15113 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { | 15110 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { |
15114 return &(kIntrinsicFunctions[static_cast<int>(id)]); | 15111 return &(kIntrinsicFunctions[static_cast<int>(id)]); |
15115 } | 15112 } |
15116 | 15113 |
15117 } } // namespace v8::internal | 15114 } } // namespace v8::internal |
OLD | NEW |