Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(718)

Side by Side Diff: src/objects.cc

Issue 1404283002: Unify ToArrayLength conversions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: addressed comments Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 697 matching lines...) Expand 10 before | Expand all | Expand 10 after
708 return true; 708 return true;
709 } 709 }
710 } 710 }
711 return false; 711 return false;
712 } 712 }
713 713
714 714
715 bool Object::ToUint32(uint32_t* value) { 715 bool Object::ToUint32(uint32_t* value) {
716 if (IsSmi()) { 716 if (IsSmi()) {
717 int num = Smi::cast(this)->value(); 717 int num = Smi::cast(this)->value();
718 if (num >= 0) { 718 if (num < 0) return false;
719 *value = static_cast<uint32_t>(num); 719 *value = static_cast<uint32_t>(num);
720 return true;
721 }
722 if (IsHeapNumber()) {
723 double num = HeapNumber::cast(this)->value();
724 if (num < 0) return false;
725 uint32_t uint_value = FastD2UI(num);
726 if (FastUI2D(uint_value) == num) {
727 *value = uint_value;
720 return true; 728 return true;
721 } 729 }
722 } 730 }
723 if (IsHeapNumber()) {
724 double num = HeapNumber::cast(this)->value();
725 if (num >= 0 && FastUI2D(FastD2UI(num)) == num) {
726 *value = FastD2UI(num);
727 return true;
728 }
729 }
730 return false; 731 return false;
731 } 732 }
732 733
733 734
734 bool FunctionTemplateInfo::IsTemplateFor(Object* object) { 735 bool FunctionTemplateInfo::IsTemplateFor(Object* object) {
735 if (!object->IsHeapObject()) return false; 736 if (!object->IsHeapObject()) return false;
736 return IsTemplateFor(HeapObject::cast(object)->map()); 737 return IsTemplateFor(HeapObject::cast(object)->map());
737 } 738 }
738 739
739 740
(...skipping 5646 matching lines...) Expand 10 before | Expand all | Expand 10 after
6386 } 6387 }
6387 // 3k. Return true. 6388 // 3k. Return true.
6388 return true; 6389 return true;
6389 } 6390 }
6390 6391
6391 // 4. Return OrdinaryDefineOwnProperty(A, P, Desc). 6392 // 4. Return OrdinaryDefineOwnProperty(A, P, Desc).
6392 return OrdinaryDefineOwnProperty(isolate, o, name, desc, should_throw); 6393 return OrdinaryDefineOwnProperty(isolate, o, name, desc, should_throw);
6393 } 6394 }
6394 6395
6395 6396
6396 // TODO(jkummerow): Consider unification with ArrayLengthSetter in accessors.cc. 6397 // Part of ES6 9.4.2.4 ArraySetLength.
6397 bool AnythingToArrayLength(Isolate* isolate, Handle<Object> length_obj, 6398 // static
6398 uint32_t* output) { 6399 bool JSArray::AnythingToArrayLength(Isolate* isolate,
6400 Handle<Object> length_object,
6401 uint32_t* output) {
6399 // Fast path: check numbers and strings that can be converted directly 6402 // Fast path: check numbers and strings that can be converted directly
6400 // and unobservably. 6403 // and unobservably.
6401 if (length_obj->ToUint32(output)) return true; 6404 if (length_object->ToArrayLength(output)) return true;
6402 if (length_obj->IsString() && 6405 if (length_object->IsString() &&
6403 Handle<String>::cast(length_obj)->AsArrayIndex(output)) { 6406 Handle<String>::cast(length_object)->AsArrayIndex(output)) {
6404 return true; 6407 return true;
6405 } 6408 }
6406 // Slow path: follow steps in ES6 9.4.2.4 "ArraySetLength". 6409 // Slow path: follow steps in ES6 9.4.2.4 "ArraySetLength".
6407 // 3. Let newLen be ToUint32(Desc.[[Value]]). 6410 // 3. Let newLen be ToUint32(Desc.[[Value]]).
6408 Handle<Object> uint32_v; 6411 Handle<Object> uint32_v;
6409 if (!Object::ToUint32(isolate, length_obj).ToHandle(&uint32_v)) { 6412 if (!Object::ToUint32(isolate, length_object).ToHandle(&uint32_v)) {
6410 // 4. ReturnIfAbrupt(newLen). 6413 // 4. ReturnIfAbrupt(newLen).
6411 return false; 6414 return false;
6412 } 6415 }
6413 // 5. Let numberLen be ToNumber(Desc.[[Value]]). 6416 // 5. Let numberLen be ToNumber(Desc.[[Value]]).
6414 Handle<Object> number_v; 6417 Handle<Object> number_v;
6415 if (!Object::ToNumber(length_obj).ToHandle(&number_v)) { 6418 if (!Object::ToNumber(length_object).ToHandle(&number_v)) {
6416 // 6. ReturnIfAbrupt(newLen). 6419 // 6. ReturnIfAbrupt(newLen).
6417 return false; 6420 return false;
6418 } 6421 }
6419 // 7. If newLen != numberLen, throw a RangeError exception. 6422 // 7. If newLen != numberLen, throw a RangeError exception.
6420 if (uint32_v->Number() != number_v->Number()) { 6423 if (uint32_v->Number() != number_v->Number()) {
6421 Handle<Object> exception = 6424 Handle<Object> exception =
6422 isolate->factory()->NewRangeError(MessageTemplate::kInvalidArrayLength); 6425 isolate->factory()->NewRangeError(MessageTemplate::kInvalidArrayLength);
6423 isolate->Throw(*exception); 6426 isolate->Throw(*exception);
6424 return false; 6427 return false;
6425 } 6428 }
6426 return uint32_v->ToArrayLength(output); 6429 CHECK(uint32_v->ToArrayLength(output));
6430 return true;
6427 } 6431 }
6428 6432
6429 6433
6430 // ES6 9.4.2.4 6434 // ES6 9.4.2.4
6431 // static 6435 // static
6432 bool JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a, 6436 bool JSArray::ArraySetLength(Isolate* isolate, Handle<JSArray> a,
6433 PropertyDescriptor* desc, 6437 PropertyDescriptor* desc,
6434 ShouldThrow should_throw) { 6438 ShouldThrow should_throw) {
6435 // 1. If the [[Value]] field of Desc is absent, then 6439 // 1. If the [[Value]] field of Desc is absent, then
6436 if (!desc->has_value()) { 6440 if (!desc->has_value()) {
(...skipping 11225 matching lines...) Expand 10 before | Expand all | Expand 10 after
17662 if (cell->value() != *new_value) { 17666 if (cell->value() != *new_value) {
17663 cell->set_value(*new_value); 17667 cell->set_value(*new_value);
17664 Isolate* isolate = cell->GetIsolate(); 17668 Isolate* isolate = cell->GetIsolate();
17665 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17669 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17666 isolate, DependentCode::kPropertyCellChangedGroup); 17670 isolate, DependentCode::kPropertyCellChangedGroup);
17667 } 17671 }
17668 } 17672 }
17669 17673
17670 } // namespace internal 17674 } // namespace internal
17671 } // namespace v8 17675 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698