OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <iomanip> | 7 #include <iomanip> |
8 #include <sstream> | 8 #include <sstream> |
9 | 9 |
10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 JSFunction::cast(native_context->get(constructor_function_index)), | 86 JSFunction::cast(native_context->get(constructor_function_index)), |
87 isolate); | 87 isolate); |
88 } | 88 } |
89 Handle<JSObject> result = isolate->factory()->NewJSObject(constructor); | 89 Handle<JSObject> result = isolate->factory()->NewJSObject(constructor); |
90 Handle<JSValue>::cast(result)->set_value(*object); | 90 Handle<JSValue>::cast(result)->set_value(*object); |
91 return result; | 91 return result; |
92 } | 92 } |
93 | 93 |
94 | 94 |
95 // static | 95 // static |
96 MaybeHandle<Object> Object::ToNumber(Isolate* isolate, Handle<Object> input) { | 96 MaybeHandle<Object> Object::ToNumber(Handle<Object> input) { |
97 while (true) { | 97 while (true) { |
98 if (input->IsNumber()) { | 98 if (input->IsNumber()) { |
99 return input; | 99 return input; |
100 } | 100 } |
| 101 Isolate* const isolate = Handle<HeapObject>::cast(input)->GetIsolate(); |
101 if (input->IsOddball()) { | 102 if (input->IsOddball()) { |
102 return handle(Handle<Oddball>::cast(input)->to_number(), isolate); | 103 return handle(Handle<Oddball>::cast(input)->to_number(), isolate); |
103 } | 104 } |
104 if (input->IsString()) { | 105 if (input->IsString()) { |
105 return String::ToNumber(Handle<String>::cast(input)); | 106 return String::ToNumber(Handle<String>::cast(input)); |
106 } | 107 } |
107 if (input->IsSymbol()) { | 108 if (input->IsSymbol()) { |
108 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToNumber), | 109 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToNumber), |
109 Object); | 110 Object); |
110 } | 111 } |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 if (object->IsSymbol()) return isolate->factory()->symbol_string(); | 187 if (object->IsSymbol()) return isolate->factory()->symbol_string(); |
187 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \ | 188 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \ |
188 if (object->Is##Type()) return isolate->factory()->type##_string(); | 189 if (object->Is##Type()) return isolate->factory()->type##_string(); |
189 SIMD128_TYPES(SIMD128_TYPE) | 190 SIMD128_TYPES(SIMD128_TYPE) |
190 #undef SIMD128_TYPE | 191 #undef SIMD128_TYPE |
191 if (object->IsCallable()) return isolate->factory()->function_string(); | 192 if (object->IsCallable()) return isolate->factory()->function_string(); |
192 return isolate->factory()->object_string(); | 193 return isolate->factory()->object_string(); |
193 } | 194 } |
194 | 195 |
195 | 196 |
| 197 // static |
| 198 MaybeHandle<Object> Object::Multiply(Isolate* isolate, Handle<Object> lhs, |
| 199 Handle<Object> rhs, Strength strength) { |
| 200 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 201 if (is_strong(strength)) { |
| 202 THROW_NEW_ERROR(isolate, |
| 203 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 204 Object); |
| 205 } |
| 206 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 207 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 208 } |
| 209 return isolate->factory()->NewNumber(lhs->Number() * rhs->Number()); |
| 210 } |
| 211 |
| 212 |
| 213 // static |
| 214 MaybeHandle<Object> Object::Divide(Isolate* isolate, Handle<Object> lhs, |
| 215 Handle<Object> rhs, Strength strength) { |
| 216 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 217 if (is_strong(strength)) { |
| 218 THROW_NEW_ERROR(isolate, |
| 219 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 220 Object); |
| 221 } |
| 222 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 223 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 224 } |
| 225 return isolate->factory()->NewNumber(lhs->Number() / rhs->Number()); |
| 226 } |
| 227 |
| 228 |
| 229 // static |
| 230 MaybeHandle<Object> Object::Modulus(Isolate* isolate, Handle<Object> lhs, |
| 231 Handle<Object> rhs, Strength strength) { |
| 232 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 233 if (is_strong(strength)) { |
| 234 THROW_NEW_ERROR(isolate, |
| 235 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 236 Object); |
| 237 } |
| 238 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 239 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 240 } |
| 241 return isolate->factory()->NewNumber(modulo(lhs->Number(), rhs->Number())); |
| 242 } |
| 243 |
| 244 |
| 245 // static |
| 246 MaybeHandle<Object> Object::Add(Isolate* isolate, Handle<Object> lhs, |
| 247 Handle<Object> rhs, Strength strength) { |
| 248 if (lhs->IsNumber() && rhs->IsNumber()) { |
| 249 return isolate->factory()->NewNumber(lhs->Number() + rhs->Number()); |
| 250 } else if (lhs->IsString() && rhs->IsString()) { |
| 251 return isolate->factory()->NewConsString(Handle<String>::cast(lhs), |
| 252 Handle<String>::cast(rhs)); |
| 253 } else if (is_strong(strength)) { |
| 254 THROW_NEW_ERROR(isolate, |
| 255 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 256 Object); |
| 257 } |
| 258 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToPrimitive(lhs), Object); |
| 259 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToPrimitive(rhs), Object); |
| 260 if (lhs->IsString() || rhs->IsString()) { |
| 261 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToString(isolate, rhs), |
| 262 Object); |
| 263 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToString(isolate, lhs), |
| 264 Object); |
| 265 return isolate->factory()->NewConsString(Handle<String>::cast(lhs), |
| 266 Handle<String>::cast(rhs)); |
| 267 } |
| 268 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 269 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 270 return isolate->factory()->NewNumber(lhs->Number() + rhs->Number()); |
| 271 } |
| 272 |
| 273 |
| 274 // static |
| 275 MaybeHandle<Object> Object::Subtract(Isolate* isolate, Handle<Object> lhs, |
| 276 Handle<Object> rhs, Strength strength) { |
| 277 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 278 if (is_strong(strength)) { |
| 279 THROW_NEW_ERROR(isolate, |
| 280 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 281 Object); |
| 282 } |
| 283 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 284 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 285 } |
| 286 return isolate->factory()->NewNumber(lhs->Number() - rhs->Number()); |
| 287 } |
| 288 |
| 289 |
| 290 // static |
| 291 MaybeHandle<Object> Object::ShiftLeft(Isolate* isolate, Handle<Object> lhs, |
| 292 Handle<Object> rhs, Strength strength) { |
| 293 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 294 if (is_strong(strength)) { |
| 295 THROW_NEW_ERROR(isolate, |
| 296 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 297 Object); |
| 298 } |
| 299 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 300 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 301 } |
| 302 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) |
| 303 << (NumberToUint32(*rhs) & 0x1F)); |
| 304 } |
| 305 |
| 306 |
| 307 // static |
| 308 MaybeHandle<Object> Object::ShiftRight(Isolate* isolate, Handle<Object> lhs, |
| 309 Handle<Object> rhs, Strength strength) { |
| 310 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 311 if (is_strong(strength)) { |
| 312 THROW_NEW_ERROR(isolate, |
| 313 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 314 Object); |
| 315 } |
| 316 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 317 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 318 } |
| 319 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) >> |
| 320 (NumberToUint32(*rhs) & 0x1F)); |
| 321 } |
| 322 |
| 323 |
| 324 // static |
| 325 MaybeHandle<Object> Object::ShiftRightLogical(Isolate* isolate, |
| 326 Handle<Object> lhs, |
| 327 Handle<Object> rhs, |
| 328 Strength strength) { |
| 329 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 330 if (is_strong(strength)) { |
| 331 THROW_NEW_ERROR(isolate, |
| 332 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 333 Object); |
| 334 } |
| 335 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 336 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 337 } |
| 338 return isolate->factory()->NewNumberFromUint(NumberToUint32(*lhs) >> |
| 339 (NumberToUint32(*rhs) & 0x1F)); |
| 340 } |
| 341 |
| 342 |
| 343 // static |
| 344 MaybeHandle<Object> Object::BitwiseAnd(Isolate* isolate, Handle<Object> lhs, |
| 345 Handle<Object> rhs, Strength strength) { |
| 346 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 347 if (is_strong(strength)) { |
| 348 THROW_NEW_ERROR(isolate, |
| 349 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 350 Object); |
| 351 } |
| 352 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 353 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 354 } |
| 355 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) & |
| 356 NumberToInt32(*rhs)); |
| 357 } |
| 358 |
| 359 |
| 360 // static |
| 361 MaybeHandle<Object> Object::BitwiseOr(Isolate* isolate, Handle<Object> lhs, |
| 362 Handle<Object> rhs, Strength strength) { |
| 363 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 364 if (is_strong(strength)) { |
| 365 THROW_NEW_ERROR(isolate, |
| 366 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 367 Object); |
| 368 } |
| 369 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 370 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 371 } |
| 372 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) | |
| 373 NumberToInt32(*rhs)); |
| 374 } |
| 375 |
| 376 |
| 377 // static |
| 378 MaybeHandle<Object> Object::BitwiseXor(Isolate* isolate, Handle<Object> lhs, |
| 379 Handle<Object> rhs, Strength strength) { |
| 380 if (!lhs->IsNumber() || !rhs->IsNumber()) { |
| 381 if (is_strong(strength)) { |
| 382 THROW_NEW_ERROR(isolate, |
| 383 NewTypeError(MessageTemplate::kStrongImplicitConversion), |
| 384 Object); |
| 385 } |
| 386 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object); |
| 387 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object); |
| 388 } |
| 389 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) ^ |
| 390 NumberToInt32(*rhs)); |
| 391 } |
| 392 |
| 393 |
196 bool Object::IsPromise(Handle<Object> object) { | 394 bool Object::IsPromise(Handle<Object> object) { |
197 if (!object->IsJSObject()) return false; | 395 if (!object->IsJSObject()) return false; |
198 auto js_object = Handle<JSObject>::cast(object); | 396 auto js_object = Handle<JSObject>::cast(object); |
199 // Promises can't have access checks. | 397 // Promises can't have access checks. |
200 if (js_object->map()->is_access_check_needed()) return false; | 398 if (js_object->map()->is_access_check_needed()) return false; |
201 auto isolate = js_object->GetIsolate(); | 399 auto isolate = js_object->GetIsolate(); |
202 // TODO(dcarney): this should just be read from the symbol registry so as not | 400 // TODO(dcarney): this should just be read from the symbol registry so as not |
203 // to be context dependent. | 401 // to be context dependent. |
204 auto key = isolate->factory()->promise_status_symbol(); | 402 auto key = isolate->factory()->promise_status_symbol(); |
205 // Shouldn't be possible to throw here. | 403 // Shouldn't be possible to throw here. |
(...skipping 3203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3409 (it->IsElement() || | 3607 (it->IsElement() || |
3410 !it->isolate()->IsInternallyUsedPropertyName(it->name())); | 3608 !it->isolate()->IsInternallyUsedPropertyName(it->name())); |
3411 MaybeHandle<Object> maybe_old; | 3609 MaybeHandle<Object> maybe_old; |
3412 if (is_observed) maybe_old = it->GetDataValue(); | 3610 if (is_observed) maybe_old = it->GetDataValue(); |
3413 | 3611 |
3414 Handle<Object> to_assign = value; | 3612 Handle<Object> to_assign = value; |
3415 // Convert the incoming value to a number for storing into typed arrays. | 3613 // Convert the incoming value to a number for storing into typed arrays. |
3416 if (it->IsElement() && receiver->HasFixedTypedArrayElements()) { | 3614 if (it->IsElement() && receiver->HasFixedTypedArrayElements()) { |
3417 if (!value->IsNumber() && !value->IsUndefined()) { | 3615 if (!value->IsNumber() && !value->IsUndefined()) { |
3418 ASSIGN_RETURN_ON_EXCEPTION(it->isolate(), to_assign, | 3616 ASSIGN_RETURN_ON_EXCEPTION(it->isolate(), to_assign, |
3419 Object::ToNumber(it->isolate(), value), | 3617 Object::ToNumber(value), Object); |
3420 Object); | |
3421 // ToNumber above might modify the receiver, causing the cached | 3618 // ToNumber above might modify the receiver, causing the cached |
3422 // holder_map to mismatch the actual holder->map() after this point. | 3619 // holder_map to mismatch the actual holder->map() after this point. |
3423 // Reload the map to be in consistent state. Other cached state cannot | 3620 // Reload the map to be in consistent state. Other cached state cannot |
3424 // have been invalidated since typed array elements cannot be reconfigured | 3621 // have been invalidated since typed array elements cannot be reconfigured |
3425 // in any way. | 3622 // in any way. |
3426 it->ReloadHolderMap(); | 3623 it->ReloadHolderMap(); |
3427 | 3624 |
3428 // We have to recheck the length. However, it can only change if the | 3625 // We have to recheck the length. However, it can only change if the |
3429 // underlying buffer was neutered, so just check that. | 3626 // underlying buffer was neutered, so just check that. |
3430 if (Handle<JSArrayBufferView>::cast(receiver)->WasNeutered()) { | 3627 if (Handle<JSArrayBufferView>::cast(receiver)->WasNeutered()) { |
(...skipping 12733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16164 if (cell->value() != *new_value) { | 16361 if (cell->value() != *new_value) { |
16165 cell->set_value(*new_value); | 16362 cell->set_value(*new_value); |
16166 Isolate* isolate = cell->GetIsolate(); | 16363 Isolate* isolate = cell->GetIsolate(); |
16167 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16364 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
16168 isolate, DependentCode::kPropertyCellChangedGroup); | 16365 isolate, DependentCode::kPropertyCellChangedGroup); |
16169 } | 16366 } |
16170 } | 16367 } |
16171 | 16368 |
16172 } // namespace internal | 16369 } // namespace internal |
16173 } // namespace v8 | 16370 } // namespace v8 |
OLD | NEW |