OLD | NEW |
---|---|
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 18979 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
18990 | 18990 |
18991 bool JSReceiver::HasProxyInPrototype(Isolate* isolate) { | 18991 bool JSReceiver::HasProxyInPrototype(Isolate* isolate) { |
18992 for (PrototypeIterator iter(isolate, this, kStartAtReceiver, | 18992 for (PrototypeIterator iter(isolate, this, kStartAtReceiver, |
18993 PrototypeIterator::END_AT_NULL); | 18993 PrototypeIterator::END_AT_NULL); |
18994 !iter.IsAtEnd(); iter.AdvanceIgnoringProxies()) { | 18994 !iter.IsAtEnd(); iter.AdvanceIgnoringProxies()) { |
18995 if (iter.GetCurrent<Object>()->IsJSProxy()) return true; | 18995 if (iter.GetCurrent<Object>()->IsJSProxy()) return true; |
18996 } | 18996 } |
18997 return false; | 18997 return false; |
18998 } | 18998 } |
18999 | 18999 |
19000 Maybe<bool> JSReceiver::IncludesValue(Isolate* isolate, | |
19001 Handle<JSReceiver> object, | |
19002 Handle<Object> value, | |
19003 Handle<Object> from_index) { | |
Camillo Bruni
2016/08/01 07:23:47
nit: Any particular reason this has to be on JSRec
caitp
2016/08/01 15:10:45
had moved it here to make it easy to share the c++
| |
19004 // Let len be ? ToLength(? Get(O, "length")). | |
19005 int64_t len; | |
19006 { | |
19007 Handle<Object> len_; | |
19008 if (object->map()->instance_type() == JS_ARRAY_TYPE) { | |
19009 len_ = handle(JSArray::cast(*object)->length(), isolate); | |
Camillo Bruni
2016/08/01 07:23:47
nit: A JSArray can only have sane length values (0
caitp
2016/08/01 15:10:45
updated to use ToArrayLength() for JS_ARRAY_TYPE
| |
19010 } else { | |
19011 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | |
19012 isolate, len_, | |
19013 Object::GetProperty(object, isolate->factory()->length_string()), | |
19014 Nothing<bool>()); | |
19015 } | |
19016 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | |
19017 isolate, len_, Object::ToLength(isolate, len_), Nothing<bool>()); | |
19018 len = static_cast<int64_t>(len_->Number()); | |
19019 DCHECK_EQ(len, len_->Number()); | |
19020 } | |
19021 | |
19022 if (len == 0) return Just(false); | |
19023 | |
19024 // Let n be ? ToInteger(fromIndex). (If fromIndex is undefined, this step | |
19025 // produces the value 0.) | |
19026 int64_t start_from; | |
19027 { | |
19028 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, from_index, | |
19029 Object::ToInteger(isolate, from_index), | |
19030 Nothing<bool>()); | |
19031 double fp = from_index->Number(); | |
19032 if (fp > len) return Just(false); | |
19033 start_from = static_cast<int64_t>(fp); | |
19034 } | |
19035 | |
19036 int64_t index; | |
19037 if (start_from >= 0) { | |
19038 index = start_from; | |
19039 } else { | |
19040 index = len + start_from; | |
19041 if (index < 0) { | |
19042 index = 0; | |
19043 } | |
19044 } | |
19045 | |
19046 // If the receiver is not a special receiver type, and the length is a valid | |
19047 // element index, perform fast operation tailored to specific ElementsKinds. | |
19048 if (object->map()->instance_type() > LAST_SPECIAL_RECEIVER_TYPE && | |
19049 len < kMaxUInt32 && | |
19050 JSObject::PrototypeHasNoElements(isolate, JSObject::cast(*object))) { | |
19051 Handle<JSObject> obj = Handle<JSObject>::cast(object); | |
19052 ElementsAccessor* elements = obj->GetElementsAccessor(); | |
19053 return elements->IncludesValue(isolate, obj, value, | |
19054 static_cast<uint32_t>(index), | |
19055 static_cast<uint32_t>(len)); | |
19056 } | |
19057 | |
19058 // Otherwise, perform slow lookups for special receiver types | |
19059 for (; index < len; ++index) { | |
19060 // Let elementK be the result of ? Get(O, ! ToString(k)). | |
19061 Handle<Object> element_k; | |
19062 { | |
19063 Handle<Object> index_obj = isolate->factory()->NewNumberFromInt64(index); | |
19064 bool success; | |
19065 LookupIterator it = LookupIterator::PropertyOrElement( | |
19066 isolate, object, index_obj, &success); | |
19067 DCHECK(success); | |
19068 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | |
19069 isolate, element_k, Object::GetProperty(&it), Nothing<bool>()); | |
19070 } | |
19071 | |
19072 // If SameValueZero(searchElement, elementK) is true, return true. | |
19073 if (value->SameValueZero(*element_k)) return Just(true); | |
19074 } | |
19075 return Just(false); | |
19076 } | |
19077 | |
19000 } // namespace internal | 19078 } // namespace internal |
19001 } // namespace v8 | 19079 } // namespace v8 |
OLD | NEW |