| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/allocation-site-scopes.h" | 7 #include "src/allocation-site-scopes.h" |
| 8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
| 9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
| 10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 if (value->IsFixedArray()) { | 79 if (value->IsFixedArray()) { |
| 80 // The value contains the constant_properties of a | 80 // The value contains the constant_properties of a |
| 81 // simple object or array literal. | 81 // simple object or array literal. |
| 82 Handle<FixedArray> array = Handle<FixedArray>::cast(value); | 82 Handle<FixedArray> array = Handle<FixedArray>::cast(value); |
| 83 ASSIGN_RETURN_ON_EXCEPTION( | 83 ASSIGN_RETURN_ON_EXCEPTION( |
| 84 isolate, value, CreateLiteralBoilerplate(isolate, literals, array), | 84 isolate, value, CreateLiteralBoilerplate(isolate, literals, array), |
| 85 Object); | 85 Object); |
| 86 } | 86 } |
| 87 MaybeHandle<Object> maybe_result; | 87 MaybeHandle<Object> maybe_result; |
| 88 uint32_t element_index = 0; | 88 uint32_t element_index = 0; |
| 89 if (key->IsInternalizedString()) { | 89 if (key->ToArrayIndex(&element_index)) { |
| 90 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { | |
| 91 // Array index as string (uint32). | |
| 92 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); | |
| 93 maybe_result = JSObject::SetOwnElementIgnoreAttributes( | |
| 94 boilerplate, element_index, value, NONE); | |
| 95 } else { | |
| 96 Handle<String> name(String::cast(*key)); | |
| 97 DCHECK(!name->AsArrayIndex(&element_index)); | |
| 98 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( | |
| 99 boilerplate, name, value, NONE); | |
| 100 } | |
| 101 } else if (key->ToArrayIndex(&element_index)) { | |
| 102 // Array index (uint32). | 90 // Array index (uint32). |
| 103 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); | 91 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); |
| 104 maybe_result = JSObject::SetOwnElementIgnoreAttributes( | 92 maybe_result = JSObject::SetOwnElementIgnoreAttributes( |
| 105 boilerplate, element_index, value, NONE); | 93 boilerplate, element_index, value, NONE); |
| 106 } else { | 94 } else { |
| 107 // Non-uint32 number. | 95 Handle<String> name = Handle<String>::cast(key); |
| 108 DCHECK(key->IsNumber()); | 96 DCHECK(!name->AsArrayIndex(&element_index)); |
| 109 double num = key->Number(); | |
| 110 char arr[100]; | |
| 111 Vector<char> buffer(arr, arraysize(arr)); | |
| 112 const char* str = DoubleToCString(num, buffer); | |
| 113 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); | |
| 114 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(boilerplate, name, | 97 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(boilerplate, name, |
| 115 value, NONE); | 98 value, NONE); |
| 116 } | 99 } |
| 117 // If setting the property on the boilerplate throws an | |
| 118 // exception, the exception is converted to an empty handle in | |
| 119 // the handle based operations. In that case, we need to | |
| 120 // convert back to an exception. | |
| 121 RETURN_ON_EXCEPTION(isolate, maybe_result, Object); | 100 RETURN_ON_EXCEPTION(isolate, maybe_result, Object); |
| 122 } | 101 } |
| 123 | 102 |
| 124 // Transform to fast properties if necessary. For object literals with | 103 // Transform to fast properties if necessary. For object literals with |
| 125 // containing function literals we defer this operation until after all | 104 // containing function literals we defer this operation until after all |
| 126 // computed properties have been assigned so that we can generate | 105 // computed properties have been assigned so that we can generate |
| 127 // constant function properties. | 106 // constant function properties. |
| 128 if (should_transform && !has_function_literal) { | 107 if (should_transform && !has_function_literal) { |
| 129 JSObject::MigrateSlowToFast(boilerplate, | 108 JSObject::MigrateSlowToFast(boilerplate, |
| 130 boilerplate->map()->unused_property_fields(), | 109 boilerplate->map()->unused_property_fields(), |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 Handle<LiteralsArray> literals(closure->literals(), isolate); | 361 Handle<LiteralsArray> literals(closure->literals(), isolate); |
| 383 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 362 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 384 isolate, result, | 363 isolate, result, |
| 385 CreateArrayLiteralImpl(isolate, literals, literals_index, elements, | 364 CreateArrayLiteralImpl(isolate, literals, literals_index, elements, |
| 386 ArrayLiteral::kShallowElements)); | 365 ArrayLiteral::kShallowElements)); |
| 387 return *result; | 366 return *result; |
| 388 } | 367 } |
| 389 | 368 |
| 390 } // namespace internal | 369 } // namespace internal |
| 391 } // namespace v8 | 370 } // namespace v8 |
| OLD | NEW |