OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 | 244 |
245 | 245 |
246 // Returns an array with the property description: | 246 // Returns an array with the property description: |
247 // if args[1] is not a property on args[0] | 247 // if args[1] is not a property on args[0] |
248 // returns undefined | 248 // returns undefined |
249 // if args[1] is a data property on args[0] | 249 // if args[1] is a data property on args[0] |
250 // [false, value, Writeable, Enumerable, Configurable] | 250 // [false, value, Writeable, Enumerable, Configurable] |
251 // if args[1] is an accessor on args[0] | 251 // if args[1] is an accessor on args[0] |
252 // [true, GetFunction, SetFunction, Enumerable, Configurable] | 252 // [true, GetFunction, SetFunction, Enumerable, Configurable] |
253 RUNTIME_FUNCTION(Runtime_GetOwnProperty) { | 253 RUNTIME_FUNCTION(Runtime_GetOwnProperty) { |
| 254 // TODO(jkummerow): Support Proxies. |
| 255 // TODO(jkummerow): Use JSReceiver::GetOwnPropertyDescriptor() and |
| 256 // PropertyDescriptor::ToObject(). |
254 HandleScope scope(isolate); | 257 HandleScope scope(isolate); |
255 DCHECK(args.length() == 2); | 258 DCHECK(args.length() == 2); |
256 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); | 259 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); |
257 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); | 260 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); |
258 Handle<Object> result; | 261 Handle<Object> result; |
259 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 262 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
260 GetOwnProperty(isolate, obj, name)); | 263 GetOwnProperty(isolate, obj, name)); |
261 return *result; | 264 return *result; |
262 } | 265 } |
263 | 266 |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 | 652 |
650 uint32_t index; | 653 uint32_t index; |
651 const bool key_is_array_index = key->AsArrayIndex(&index); | 654 const bool key_is_array_index = key->AsArrayIndex(&index); |
652 | 655 |
653 // Only JS objects can have properties. | 656 // Only JS objects can have properties. |
654 if (object->IsJSObject()) { | 657 if (object->IsJSObject()) { |
655 Handle<JSObject> js_obj = Handle<JSObject>::cast(object); | 658 Handle<JSObject> js_obj = Handle<JSObject>::cast(object); |
656 // Fast case: either the key is a real named property or it is not | 659 // Fast case: either the key is a real named property or it is not |
657 // an array index and there are no interceptors or hidden | 660 // an array index and there are no interceptors or hidden |
658 // prototypes. | 661 // prototypes. |
| 662 // TODO(jkummerow): Make JSReceiver::HasOwnProperty fast enough to |
| 663 // handle all cases directly (without this custom fast path). |
659 Maybe<bool> maybe = Nothing<bool>(); | 664 Maybe<bool> maybe = Nothing<bool>(); |
660 if (key_is_array_index) { | 665 if (key_is_array_index) { |
661 maybe = JSObject::HasOwnElement(js_obj, index); | 666 maybe = JSObject::HasOwnElement(js_obj, index); |
662 } else { | 667 } else { |
663 maybe = JSObject::HasRealNamedProperty(js_obj, key); | 668 maybe = JSObject::HasRealNamedProperty(js_obj, key); |
664 } | 669 } |
665 if (!maybe.IsJust()) return isolate->heap()->exception(); | 670 if (!maybe.IsJust()) return isolate->heap()->exception(); |
666 DCHECK(!isolate->has_pending_exception()); | 671 DCHECK(!isolate->has_pending_exception()); |
667 if (maybe.FromJust()) { | 672 if (maybe.FromJust()) { |
668 return isolate->heap()->true_value(); | 673 return isolate->heap()->true_value(); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 // Test again, since cache may have been built by preceding call. | 755 // Test again, since cache may have been built by preceding call. |
751 if (object->IsSimpleEnum()) return object->map(); | 756 if (object->IsSimpleEnum()) return object->map(); |
752 | 757 |
753 return *content; | 758 return *content; |
754 } | 759 } |
755 | 760 |
756 | 761 |
757 // Return the names of the own named properties. | 762 // Return the names of the own named properties. |
758 // args[0]: object | 763 // args[0]: object |
759 // args[1]: PropertyAttributes as int | 764 // args[1]: PropertyAttributes as int |
| 765 // TODO(cbruni/jkummerow): Use JSReceiver::GetKeys() internally, merge with |
| 766 // Runtime_GetOwnElementNames. |
760 RUNTIME_FUNCTION(Runtime_GetOwnPropertyNames) { | 767 RUNTIME_FUNCTION(Runtime_GetOwnPropertyNames) { |
761 HandleScope scope(isolate); | 768 HandleScope scope(isolate); |
762 DCHECK(args.length() == 2); | 769 DCHECK(args.length() == 2); |
763 if (!args[0]->IsJSObject()) { | 770 if (!args[0]->IsJSObject()) { |
764 return isolate->heap()->undefined_value(); | 771 return isolate->heap()->undefined_value(); |
765 } | 772 } |
766 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); | 773 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); |
767 CONVERT_SMI_ARG_CHECKED(filter_value, 1); | 774 CONVERT_SMI_ARG_CHECKED(filter_value, 1); |
768 PropertyAttributes filter = static_cast<PropertyAttributes>(filter_value); | 775 PropertyAttributes filter = static_cast<PropertyAttributes>(filter_value); |
769 | 776 |
(...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1558 | 1565 |
1559 RUNTIME_FUNCTION(Runtime_ObjectDefineProperties) { | 1566 RUNTIME_FUNCTION(Runtime_ObjectDefineProperties) { |
1560 HandleScope scope(isolate); | 1567 HandleScope scope(isolate); |
1561 DCHECK(args.length() == 2); | 1568 DCHECK(args.length() == 2); |
1562 CONVERT_ARG_HANDLE_CHECKED(Object, o, 0); | 1569 CONVERT_ARG_HANDLE_CHECKED(Object, o, 0); |
1563 CONVERT_ARG_HANDLE_CHECKED(Object, properties, 1); | 1570 CONVERT_ARG_HANDLE_CHECKED(Object, properties, 1); |
1564 return JSReceiver::DefineProperties(isolate, o, properties); | 1571 return JSReceiver::DefineProperties(isolate, o, properties); |
1565 } | 1572 } |
1566 } // namespace internal | 1573 } // namespace internal |
1567 } // namespace v8 | 1574 } // namespace v8 |
OLD | NEW |