OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 6404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6415 ASSIGN_RETURN_ON_EXCEPTION( | 6415 ASSIGN_RETURN_ON_EXCEPTION( |
6416 isolate, names, | 6416 isolate, names, |
6417 Execution::Call(isolate, | 6417 Execution::Call(isolate, |
6418 isolate->proxy_enumerate(), | 6418 isolate->proxy_enumerate(), |
6419 object, | 6419 object, |
6420 ARRAY_SIZE(args), | 6420 ARRAY_SIZE(args), |
6421 args), | 6421 args), |
6422 FixedArray); | 6422 FixedArray); |
6423 ASSIGN_RETURN_ON_EXCEPTION( | 6423 ASSIGN_RETURN_ON_EXCEPTION( |
6424 isolate, content, | 6424 isolate, content, |
6425 FixedArray::AddKeysFromJSArray( | 6425 FixedArray::AddKeysFromArrayLike( |
6426 content, Handle<JSArray>::cast(names)), | 6426 content, Handle<JSObject>::cast(names)), |
6427 FixedArray); | 6427 FixedArray); |
6428 break; | 6428 break; |
6429 } | 6429 } |
6430 | 6430 |
6431 Handle<JSObject> current(JSObject::cast(*p), isolate); | 6431 Handle<JSObject> current(JSObject::cast(*p), isolate); |
6432 | 6432 |
6433 // Check access rights if required. | 6433 // Check access rights if required. |
6434 if (current->IsAccessCheckNeeded() && | 6434 if (current->IsAccessCheckNeeded() && |
6435 !isolate->MayNamedAccess( | 6435 !isolate->MayNamedAccess( |
6436 current, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { | 6436 current, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { |
6437 isolate->ReportFailedAccessCheck(current, v8::ACCESS_KEYS); | 6437 isolate->ReportFailedAccessCheck(current, v8::ACCESS_KEYS); |
6438 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); | 6438 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); |
6439 break; | 6439 break; |
6440 } | 6440 } |
6441 | 6441 |
6442 // Compute the element keys. | 6442 // Compute the element keys. |
6443 Handle<FixedArray> element_keys = | 6443 Handle<FixedArray> element_keys = |
6444 isolate->factory()->NewFixedArray(current->NumberOfEnumElements()); | 6444 isolate->factory()->NewFixedArray(current->NumberOfEnumElements()); |
6445 current->GetEnumElementKeys(*element_keys); | 6445 current->GetEnumElementKeys(*element_keys); |
6446 ASSIGN_RETURN_ON_EXCEPTION( | 6446 ASSIGN_RETURN_ON_EXCEPTION( |
6447 isolate, content, | 6447 isolate, content, |
6448 FixedArray::UnionOfKeys(content, element_keys), | 6448 FixedArray::UnionOfKeys(content, element_keys), |
6449 FixedArray); | 6449 FixedArray); |
6450 ASSERT(ContainsOnlyValidKeys(content)); | 6450 ASSERT(ContainsOnlyValidKeys(content)); |
6451 | 6451 |
6452 // Add the element keys from the interceptor. | 6452 // Add the element keys from the interceptor. |
6453 if (current->HasIndexedInterceptor()) { | 6453 if (current->HasIndexedInterceptor()) { |
6454 Handle<JSArray> result; | 6454 Handle<JSObject> result; |
6455 if (JSObject::GetKeysForIndexedInterceptor( | 6455 if (JSObject::GetKeysForIndexedInterceptor( |
6456 current, object).ToHandle(&result)) { | 6456 current, object).ToHandle(&result)) { |
6457 ASSIGN_RETURN_ON_EXCEPTION( | 6457 ASSIGN_RETURN_ON_EXCEPTION( |
6458 isolate, content, | 6458 isolate, content, |
6459 FixedArray::AddKeysFromJSArray(content, result), | 6459 FixedArray::AddKeysFromArrayLike(content, result), |
6460 FixedArray); | 6460 FixedArray); |
6461 } | 6461 } |
6462 ASSERT(ContainsOnlyValidKeys(content)); | 6462 ASSERT(ContainsOnlyValidKeys(content)); |
6463 } | 6463 } |
6464 | 6464 |
6465 // We can cache the computed property keys if access checks are | 6465 // We can cache the computed property keys if access checks are |
6466 // not needed and no interceptors are involved. | 6466 // not needed and no interceptors are involved. |
6467 // | 6467 // |
6468 // We do not use the cache if the object has elements and | 6468 // We do not use the cache if the object has elements and |
6469 // therefore it does not make sense to cache the property names | 6469 // therefore it does not make sense to cache the property names |
(...skipping 11 matching lines...) Expand all Loading... |
6481 // Compute the property keys and cache them if possible. | 6481 // Compute the property keys and cache them if possible. |
6482 ASSIGN_RETURN_ON_EXCEPTION( | 6482 ASSIGN_RETURN_ON_EXCEPTION( |
6483 isolate, content, | 6483 isolate, content, |
6484 FixedArray::UnionOfKeys( | 6484 FixedArray::UnionOfKeys( |
6485 content, GetEnumPropertyKeys(current, cache_enum_keys)), | 6485 content, GetEnumPropertyKeys(current, cache_enum_keys)), |
6486 FixedArray); | 6486 FixedArray); |
6487 ASSERT(ContainsOnlyValidKeys(content)); | 6487 ASSERT(ContainsOnlyValidKeys(content)); |
6488 | 6488 |
6489 // Add the property keys from the interceptor. | 6489 // Add the property keys from the interceptor. |
6490 if (current->HasNamedInterceptor()) { | 6490 if (current->HasNamedInterceptor()) { |
6491 Handle<JSArray> result; | 6491 Handle<JSObject> result; |
6492 if (JSObject::GetKeysForNamedInterceptor( | 6492 if (JSObject::GetKeysForNamedInterceptor( |
6493 current, object).ToHandle(&result)) { | 6493 current, object).ToHandle(&result)) { |
6494 ASSIGN_RETURN_ON_EXCEPTION( | 6494 ASSIGN_RETURN_ON_EXCEPTION( |
6495 isolate, content, | 6495 isolate, content, |
6496 FixedArray::AddKeysFromJSArray(content, result), | 6496 FixedArray::AddKeysFromArrayLike(content, result), |
6497 FixedArray); | 6497 FixedArray); |
6498 } | 6498 } |
6499 ASSERT(ContainsOnlyValidKeys(content)); | 6499 ASSERT(ContainsOnlyValidKeys(content)); |
6500 } | 6500 } |
6501 | 6501 |
6502 // If we only want local properties we bail out after the first | 6502 // If we only want local properties we bail out after the first |
6503 // iteration. | 6503 // iteration. |
6504 if (type == LOCAL_ONLY) break; | 6504 if (type == LOCAL_ONLY) break; |
6505 } | 6505 } |
6506 return content; | 6506 return content; |
(...skipping 1717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8224 | 8224 |
8225 void FixedArray::Shrink(int new_length) { | 8225 void FixedArray::Shrink(int new_length) { |
8226 ASSERT(0 <= new_length && new_length <= length()); | 8226 ASSERT(0 <= new_length && new_length <= length()); |
8227 if (new_length < length()) { | 8227 if (new_length < length()) { |
8228 RightTrimFixedArray<Heap::FROM_MUTATOR>( | 8228 RightTrimFixedArray<Heap::FROM_MUTATOR>( |
8229 GetHeap(), this, length() - new_length); | 8229 GetHeap(), this, length() - new_length); |
8230 } | 8230 } |
8231 } | 8231 } |
8232 | 8232 |
8233 | 8233 |
8234 MaybeHandle<FixedArray> FixedArray::AddKeysFromJSArray( | 8234 MaybeHandle<FixedArray> FixedArray::AddKeysFromArrayLike( |
8235 Handle<FixedArray> content, | 8235 Handle<FixedArray> content, |
8236 Handle<JSArray> array) { | 8236 Handle<JSObject> array) { |
| 8237 ASSERT(array->IsJSArray() || array->HasSloppyArgumentsElements()); |
8237 ElementsAccessor* accessor = array->GetElementsAccessor(); | 8238 ElementsAccessor* accessor = array->GetElementsAccessor(); |
8238 Handle<FixedArray> result; | 8239 Handle<FixedArray> result; |
8239 ASSIGN_RETURN_ON_EXCEPTION( | 8240 ASSIGN_RETURN_ON_EXCEPTION( |
8240 array->GetIsolate(), result, | 8241 array->GetIsolate(), result, |
8241 accessor->AddElementsToFixedArray(array, array, content), | 8242 accessor->AddElementsToFixedArray(array, array, content), |
8242 FixedArray); | 8243 FixedArray); |
8243 | 8244 |
8244 #ifdef ENABLE_SLOW_ASSERTS | 8245 #ifdef ENABLE_SLOW_ASSERTS |
8245 if (FLAG_enable_slow_asserts) { | 8246 if (FLAG_enable_slow_asserts) { |
8246 DisallowHeapAllocation no_allocation; | 8247 DisallowHeapAllocation no_allocation; |
(...skipping 5651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13898 return handle(*result_internal, isolate); | 13899 return handle(*result_internal, isolate); |
13899 } | 13900 } |
13900 } | 13901 } |
13901 | 13902 |
13902 return GetPropertyPostInterceptor(object, receiver, name, attributes); | 13903 return GetPropertyPostInterceptor(object, receiver, name, attributes); |
13903 } | 13904 } |
13904 | 13905 |
13905 | 13906 |
13906 // Compute the property keys from the interceptor. | 13907 // Compute the property keys from the interceptor. |
13907 // TODO(rossberg): support symbols in API, and filter here if needed. | 13908 // TODO(rossberg): support symbols in API, and filter here if needed. |
13908 MaybeHandle<JSArray> JSObject::GetKeysForNamedInterceptor( | 13909 MaybeHandle<JSObject> JSObject::GetKeysForNamedInterceptor( |
13909 Handle<JSObject> object, Handle<JSReceiver> receiver) { | 13910 Handle<JSObject> object, Handle<JSReceiver> receiver) { |
13910 Isolate* isolate = receiver->GetIsolate(); | 13911 Isolate* isolate = receiver->GetIsolate(); |
13911 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); | 13912 Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor()); |
13912 PropertyCallbackArguments | 13913 PropertyCallbackArguments |
13913 args(isolate, interceptor->data(), *receiver, *object); | 13914 args(isolate, interceptor->data(), *receiver, *object); |
13914 v8::Handle<v8::Array> result; | 13915 v8::Handle<v8::Object> result; |
13915 if (!interceptor->enumerator()->IsUndefined()) { | 13916 if (!interceptor->enumerator()->IsUndefined()) { |
13916 v8::NamedPropertyEnumeratorCallback enum_fun = | 13917 v8::NamedPropertyEnumeratorCallback enum_fun = |
13917 v8::ToCData<v8::NamedPropertyEnumeratorCallback>( | 13918 v8::ToCData<v8::NamedPropertyEnumeratorCallback>( |
13918 interceptor->enumerator()); | 13919 interceptor->enumerator()); |
13919 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); | 13920 LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object)); |
13920 result = args.Call(enum_fun); | 13921 result = args.Call(enum_fun); |
13921 } | 13922 } |
13922 if (result.IsEmpty()) return MaybeHandle<JSArray>(); | 13923 if (result.IsEmpty()) return MaybeHandle<JSObject>(); |
13923 #if ENABLE_EXTRA_CHECKS | 13924 #if ENABLE_EXTRA_CHECKS |
13924 CHECK(v8::Utils::OpenHandle(*result)->IsJSObject()); | 13925 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || |
| 13926 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); |
13925 #endif | 13927 #endif |
13926 // Rebox before returning. | 13928 // Rebox before returning. |
13927 return handle(*v8::Utils::OpenHandle(*result), isolate); | 13929 return handle(*v8::Utils::OpenHandle(*result), isolate); |
13928 } | 13930 } |
13929 | 13931 |
13930 | 13932 |
13931 // Compute the element keys from the interceptor. | 13933 // Compute the element keys from the interceptor. |
13932 MaybeHandle<JSArray> JSObject::GetKeysForIndexedInterceptor( | 13934 MaybeHandle<JSObject> JSObject::GetKeysForIndexedInterceptor( |
13933 Handle<JSObject> object, Handle<JSReceiver> receiver) { | 13935 Handle<JSObject> object, Handle<JSReceiver> receiver) { |
13934 Isolate* isolate = receiver->GetIsolate(); | 13936 Isolate* isolate = receiver->GetIsolate(); |
13935 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); | 13937 Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor()); |
13936 PropertyCallbackArguments | 13938 PropertyCallbackArguments |
13937 args(isolate, interceptor->data(), *receiver, *object); | 13939 args(isolate, interceptor->data(), *receiver, *object); |
13938 v8::Handle<v8::Array> result; | 13940 v8::Handle<v8::Object> result; |
13939 if (!interceptor->enumerator()->IsUndefined()) { | 13941 if (!interceptor->enumerator()->IsUndefined()) { |
13940 v8::IndexedPropertyEnumeratorCallback enum_fun = | 13942 v8::IndexedPropertyEnumeratorCallback enum_fun = |
13941 v8::ToCData<v8::IndexedPropertyEnumeratorCallback>( | 13943 v8::ToCData<v8::IndexedPropertyEnumeratorCallback>( |
13942 interceptor->enumerator()); | 13944 interceptor->enumerator()); |
13943 LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); | 13945 LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object)); |
13944 result = args.Call(enum_fun); | 13946 result = args.Call(enum_fun); |
13945 } | 13947 } |
13946 if (result.IsEmpty()) return MaybeHandle<JSArray>(); | 13948 if (result.IsEmpty()) return MaybeHandle<JSObject>(); |
13947 #if ENABLE_EXTRA_CHECKS | 13949 #if ENABLE_EXTRA_CHECKS |
13948 CHECK(v8::Utils::OpenHandle(*result)->IsJSObject()); | 13950 CHECK(v8::Utils::OpenHandle(*result)->IsJSArray() || |
| 13951 v8::Utils::OpenHandle(*result)->HasSloppyArgumentsElements()); |
13949 #endif | 13952 #endif |
13950 // Rebox before returning. | 13953 // Rebox before returning. |
13951 return handle(*v8::Utils::OpenHandle(*result), isolate); | 13954 return handle(*v8::Utils::OpenHandle(*result), isolate); |
13952 } | 13955 } |
13953 | 13956 |
13954 | 13957 |
13955 bool JSObject::HasRealNamedProperty(Handle<JSObject> object, | 13958 bool JSObject::HasRealNamedProperty(Handle<JSObject> object, |
13956 Handle<Name> key) { | 13959 Handle<Name> key) { |
13957 Isolate* isolate = object->GetIsolate(); | 13960 Isolate* isolate = object->GetIsolate(); |
13958 SealHandleScope shs(isolate); | 13961 SealHandleScope shs(isolate); |
(...skipping 3396 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17355 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17358 #define ERROR_MESSAGES_TEXTS(C, T) T, |
17356 static const char* error_messages_[] = { | 17359 static const char* error_messages_[] = { |
17357 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17360 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
17358 }; | 17361 }; |
17359 #undef ERROR_MESSAGES_TEXTS | 17362 #undef ERROR_MESSAGES_TEXTS |
17360 return error_messages_[reason]; | 17363 return error_messages_[reason]; |
17361 } | 17364 } |
17362 | 17365 |
17363 | 17366 |
17364 } } // namespace v8::internal | 17367 } } // namespace v8::internal |
OLD | NEW |