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 <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 Maybe<bool> Object::Equals(Handle<Object> x, Handle<Object> y) { | 284 Maybe<bool> Object::Equals(Handle<Object> x, Handle<Object> y) { |
285 while (true) { | 285 while (true) { |
286 if (x->IsNumber()) { | 286 if (x->IsNumber()) { |
287 if (y->IsNumber()) { | 287 if (y->IsNumber()) { |
288 return Just(NumberEquals(x, y)); | 288 return Just(NumberEquals(x, y)); |
289 } else if (y->IsBoolean()) { | 289 } else if (y->IsBoolean()) { |
290 return Just(NumberEquals(*x, Handle<Oddball>::cast(y)->to_number())); | 290 return Just(NumberEquals(*x, Handle<Oddball>::cast(y)->to_number())); |
291 } else if (y->IsString()) { | 291 } else if (y->IsString()) { |
292 return Just(NumberEquals(x, String::ToNumber(Handle<String>::cast(y)))); | 292 return Just(NumberEquals(x, String::ToNumber(Handle<String>::cast(y)))); |
293 } else if (y->IsJSReceiver() && !y->IsUndetectableObject()) { | 293 } else if (y->IsJSReceiver() && !y->IsUndetectableObject()) { |
294 if (!JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y)) | 294 if (JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y)).ToHandle(&y)) { |
295 .ToHandle(&y)) { | 295 continue; |
| 296 } else { |
296 return Nothing<bool>(); | 297 return Nothing<bool>(); |
297 } | 298 } |
298 } else { | 299 } else { |
299 return Just(false); | 300 return Just(false); |
300 } | 301 } |
301 } else if (x->IsString()) { | 302 } else if (x->IsString()) { |
302 if (y->IsString()) { | 303 if (y->IsString()) { |
303 return Just( | 304 return Just( |
304 String::Equals(Handle<String>::cast(x), Handle<String>::cast(y))); | 305 String::Equals(Handle<String>::cast(x), Handle<String>::cast(y))); |
305 } else if (y->IsNumber()) { | 306 } else if (y->IsNumber()) { |
306 x = String::ToNumber(Handle<String>::cast(x)); | 307 x = String::ToNumber(Handle<String>::cast(x)); |
307 return Just(NumberEquals(x, y)); | 308 return Just(NumberEquals(x, y)); |
308 } else if (y->IsBoolean()) { | 309 } else if (y->IsBoolean()) { |
309 x = String::ToNumber(Handle<String>::cast(x)); | 310 x = String::ToNumber(Handle<String>::cast(x)); |
310 return Just(NumberEquals(*x, Handle<Oddball>::cast(y)->to_number())); | 311 return Just(NumberEquals(*x, Handle<Oddball>::cast(y)->to_number())); |
311 } else if (y->IsJSReceiver() && !y->IsUndetectableObject()) { | 312 } else if (y->IsJSReceiver() && !y->IsUndetectableObject()) { |
312 if (!JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y)) | 313 if (JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y)).ToHandle(&y)) { |
313 .ToHandle(&y)) { | 314 continue; |
| 315 } else { |
314 return Nothing<bool>(); | 316 return Nothing<bool>(); |
315 } | 317 } |
316 } else { | 318 } else { |
317 return Just(false); | 319 return Just(false); |
318 } | 320 } |
319 } else if (x->IsBoolean()) { | 321 } else if (x->IsBoolean()) { |
320 if (y->IsOddball()) { | 322 if (y->IsOddball()) { |
321 return Just(x.is_identical_to(y)); | 323 return Just(x.is_identical_to(y)); |
322 } else if (y->IsNumber()) { | 324 } else if (y->IsNumber()) { |
323 return Just(NumberEquals(Handle<Oddball>::cast(x)->to_number(), *y)); | 325 return Just(NumberEquals(Handle<Oddball>::cast(x)->to_number(), *y)); |
324 } else if (y->IsString()) { | 326 } else if (y->IsString()) { |
325 y = String::ToNumber(Handle<String>::cast(y)); | 327 y = String::ToNumber(Handle<String>::cast(y)); |
326 return Just(NumberEquals(Handle<Oddball>::cast(x)->to_number(), *y)); | 328 return Just(NumberEquals(Handle<Oddball>::cast(x)->to_number(), *y)); |
327 } else if (y->IsJSReceiver() && !y->IsUndetectableObject()) { | 329 } else if (y->IsJSReceiver() && !y->IsUndetectableObject()) { |
328 if (!JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y)) | 330 if (!JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y)) |
329 .ToHandle(&y)) { | 331 .ToHandle(&y)) { |
330 return Nothing<bool>(); | 332 return Nothing<bool>(); |
331 } | 333 } |
332 x = Oddball::ToNumber(Handle<Oddball>::cast(x)); | 334 x = Oddball::ToNumber(Handle<Oddball>::cast(x)); |
| 335 continue; |
333 } else { | 336 } else { |
334 return Just(false); | 337 return Just(false); |
335 } | 338 } |
336 } else if (x->IsSymbol()) { | 339 } else if (x->IsSymbol()) { |
337 return Just(x.is_identical_to(y)); | 340 if (y->IsSymbol()) { |
| 341 return Just(x.is_identical_to(y)); |
| 342 } else if (y->IsJSReceiver() && !y->IsUndetectableObject()) { |
| 343 if (JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y)).ToHandle(&y)) { |
| 344 continue; |
| 345 } else { |
| 346 return Nothing<bool>(); |
| 347 } |
| 348 } else { |
| 349 return Just(false); |
| 350 } |
338 } else if (x->IsSimd128Value()) { | 351 } else if (x->IsSimd128Value()) { |
339 if (!y->IsSimd128Value()) return Just(false); | 352 if (y->IsSimd128Value()) { |
340 return Just(Simd128Value::Equals(Handle<Simd128Value>::cast(x), | 353 return Just(Simd128Value::Equals(Handle<Simd128Value>::cast(x), |
341 Handle<Simd128Value>::cast(y))); | 354 Handle<Simd128Value>::cast(y))); |
| 355 } else if (y->IsJSReceiver() && !y->IsUndetectableObject()) { |
| 356 if (JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(y)).ToHandle(&y)) { |
| 357 continue; |
| 358 } else { |
| 359 return Nothing<bool>(); |
| 360 } |
| 361 } else { |
| 362 return Just(false); |
| 363 } |
342 } else if (x->IsJSReceiver() && !x->IsUndetectableObject()) { | 364 } else if (x->IsJSReceiver() && !x->IsUndetectableObject()) { |
343 if (y->IsJSReceiver()) { | 365 if (y->IsJSReceiver()) { |
344 return Just(x.is_identical_to(y)); | 366 return Just(x.is_identical_to(y)); |
345 } else if (y->IsNull() || y->IsSimd128Value() || y->IsSymbol() || | 367 } else if (y->IsNull() || y->IsUndefined()) { |
346 y->IsUndefined()) { | |
347 return Just(false); | 368 return Just(false); |
348 } else if (y->IsBoolean()) { | 369 } else if (y->IsBoolean()) { |
349 y = Oddball::ToNumber(Handle<Oddball>::cast(y)); | 370 y = Oddball::ToNumber(Handle<Oddball>::cast(y)); |
350 } | 371 continue; |
351 if (!JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(x)).ToHandle(&x)) { | 372 } else if (JSReceiver::ToPrimitive(Handle<JSReceiver>::cast(x)) |
| 373 .ToHandle(&x)) { |
| 374 continue; |
| 375 } else { |
352 return Nothing<bool>(); | 376 return Nothing<bool>(); |
353 } | 377 } |
354 } else { | 378 } else { |
355 return Just( | 379 return Just( |
356 (x->IsNull() || x->IsUndefined() || x->IsUndetectableObject()) && | 380 (x->IsNull() || x->IsUndefined() || x->IsUndetectableObject()) && |
357 (y->IsNull() || y->IsUndefined() || y->IsUndetectableObject())); | 381 (y->IsNull() || y->IsUndefined() || y->IsUndetectableObject())); |
358 } | 382 } |
| 383 UNREACHABLE(); |
359 } | 384 } |
360 } | 385 } |
361 | 386 |
362 | 387 |
363 bool Object::StrictEquals(Object* that) { | 388 bool Object::StrictEquals(Object* that) { |
364 if (this->IsNumber()) { | 389 if (this->IsNumber()) { |
365 if (!that->IsNumber()) return false; | 390 if (!that->IsNumber()) return false; |
366 return NumberEquals(this, that); | 391 return NumberEquals(this, that); |
367 } else if (this->IsString()) { | 392 } else if (this->IsString()) { |
368 if (!that->IsString()) return false; | 393 if (!that->IsString()) return false; |
(...skipping 17546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17915 if (cell->value() != *new_value) { | 17940 if (cell->value() != *new_value) { |
17916 cell->set_value(*new_value); | 17941 cell->set_value(*new_value); |
17917 Isolate* isolate = cell->GetIsolate(); | 17942 Isolate* isolate = cell->GetIsolate(); |
17918 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 17943 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
17919 isolate, DependentCode::kPropertyCellChangedGroup); | 17944 isolate, DependentCode::kPropertyCellChangedGroup); |
17920 } | 17945 } |
17921 } | 17946 } |
17922 | 17947 |
17923 } // namespace internal | 17948 } // namespace internal |
17924 } // namespace v8 | 17949 } // namespace v8 |
OLD | NEW |