OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/builtins.h" | 5 #include "src/builtins.h" |
6 | 6 |
7 #include "src/api.h" | 7 #include "src/api.h" |
8 #include "src/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 } else if (object->IsBoolean()) { | 190 } else if (object->IsBoolean()) { |
191 *out = object->IsTrue(); | 191 *out = object->IsTrue(); |
192 return true; | 192 return true; |
193 } | 193 } |
194 return false; | 194 return false; |
195 } | 195 } |
196 | 196 |
197 | 197 |
198 inline bool GetSloppyArgumentsLength(Isolate* isolate, Handle<JSObject> object, | 198 inline bool GetSloppyArgumentsLength(Isolate* isolate, Handle<JSObject> object, |
199 int* out) { | 199 int* out) { |
200 Map* arguments_map = | 200 Map* arguments_map = isolate->native_context()->sloppy_arguments_map(); |
201 isolate->context()->native_context()->sloppy_arguments_map(); | 201 if (object->map() != arguments_map) return false; |
202 if (object->map() != arguments_map || !object->HasFastElements()) { | 202 DCHECK(object->HasFastElements()); |
203 return false; | |
204 } | |
205 Object* len_obj = object->InObjectPropertyAt(Heap::kArgumentsLengthIndex); | 203 Object* len_obj = object->InObjectPropertyAt(Heap::kArgumentsLengthIndex); |
206 if (!len_obj->IsSmi()) { | 204 if (!len_obj->IsSmi()) return false; |
207 return false; | 205 *out = Max(0, Smi::cast(len_obj)->value()); |
208 } | |
209 *out = Smi::cast(len_obj)->value(); | |
210 return *out <= object->elements()->length(); | 206 return *out <= object->elements()->length(); |
211 } | 207 } |
212 | 208 |
213 | 209 |
214 inline bool PrototypeHasNoElements(PrototypeIterator* iter) { | 210 inline bool PrototypeHasNoElements(PrototypeIterator* iter) { |
215 DisallowHeapAllocation no_gc; | 211 DisallowHeapAllocation no_gc; |
216 for (; !iter->IsAtEnd(); iter->Advance()) { | 212 for (; !iter->IsAtEnd(); iter->Advance()) { |
217 if (iter->GetCurrent()->IsJSProxy()) return false; | 213 if (iter->GetCurrent()->IsJSProxy()) return false; |
218 JSObject* current = iter->GetCurrent<JSObject>(); | 214 JSObject* current = iter->GetCurrent<JSObject>(); |
219 if (current->IsAccessCheckNeeded()) return false; | 215 if (current->IsAccessCheckNeeded()) return false; |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 * with the element index and the element's value. | 982 * with the element index and the element's value. |
987 * Afterwards it increments the base-index of the visitor by the array | 983 * Afterwards it increments the base-index of the visitor by the array |
988 * length. | 984 * length. |
989 * Returns false if any access threw an exception, otherwise true. | 985 * Returns false if any access threw an exception, otherwise true. |
990 */ | 986 */ |
991 bool IterateElements(Isolate* isolate, Handle<JSObject> receiver, | 987 bool IterateElements(Isolate* isolate, Handle<JSObject> receiver, |
992 ArrayConcatVisitor* visitor) { | 988 ArrayConcatVisitor* visitor) { |
993 uint32_t length = 0; | 989 uint32_t length = 0; |
994 | 990 |
995 if (receiver->IsJSArray()) { | 991 if (receiver->IsJSArray()) { |
996 Handle<JSArray> array(Handle<JSArray>::cast(receiver)); | 992 Handle<JSArray> array = Handle<JSArray>::cast(receiver); |
997 length = static_cast<uint32_t>(array->length()->Number()); | 993 length = static_cast<uint32_t>(array->length()->Number()); |
998 } else { | 994 } else { |
999 Handle<Object> val; | 995 Handle<Object> val; |
1000 Handle<Object> key(isolate->heap()->length_string(), isolate); | 996 Handle<Object> key = isolate->factory()->length_string(); |
1001 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 997 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
1002 isolate, val, Runtime::GetObjectProperty(isolate, receiver, key), | 998 isolate, val, Runtime::GetObjectProperty(isolate, receiver, key), |
1003 false); | 999 false); |
1004 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, val, | 1000 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, val, |
1005 Object::ToLength(isolate, val), false); | 1001 Object::ToLength(isolate, val), false); |
1006 // TODO(caitp): Support larger element indexes (up to 2^53-1). | 1002 // TODO(caitp): Support larger element indexes (up to 2^53-1). |
1007 if (!val->ToUint32(&length)) { | 1003 if (!val->ToUint32(&length)) { |
1008 length = 0; | 1004 length = 0; |
1009 } | 1005 } |
1010 } | 1006 } |
(...skipping 1380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2391 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) | 2387 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) |
2392 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) | 2388 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) |
2393 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) | 2389 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) |
2394 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) | 2390 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |
2395 #undef DEFINE_BUILTIN_ACCESSOR_C | 2391 #undef DEFINE_BUILTIN_ACCESSOR_C |
2396 #undef DEFINE_BUILTIN_ACCESSOR_A | 2392 #undef DEFINE_BUILTIN_ACCESSOR_A |
2397 | 2393 |
2398 | 2394 |
2399 } // namespace internal | 2395 } // namespace internal |
2400 } // namespace v8 | 2396 } // namespace v8 |
OLD | NEW |