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-arguments.h" | 7 #include "src/api-arguments.h" |
8 #include "src/api-natives.h" | 8 #include "src/api-natives.h" |
9 #include "src/api.h" | 9 #include "src/api.h" |
10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
(...skipping 1764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1775 // Define the properties if properties was specified and is not undefined. | 1775 // Define the properties if properties was specified and is not undefined. |
1776 Handle<Object> properties = args.atOrUndefined(isolate, 2); | 1776 Handle<Object> properties = args.atOrUndefined(isolate, 2); |
1777 if (!properties->IsUndefined()) { | 1777 if (!properties->IsUndefined()) { |
1778 RETURN_FAILURE_ON_EXCEPTION( | 1778 RETURN_FAILURE_ON_EXCEPTION( |
1779 isolate, JSReceiver::DefineProperties(isolate, object, properties)); | 1779 isolate, JSReceiver::DefineProperties(isolate, object, properties)); |
1780 } | 1780 } |
1781 | 1781 |
1782 return *object; | 1782 return *object; |
1783 } | 1783 } |
1784 | 1784 |
1785 namespace { | |
1786 | |
1787 template <AccessorComponent which_accessor> | |
1788 Object* ObjectDefineAccessor(Isolate* isolate, Handle<Object> object, | |
1789 Handle<Object> name, Handle<Object> accessor) { | |
1790 // 1. Let O be ? ToObject(this value). | |
1791 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, object, | |
Jakob Kummerow
2016/04/22 13:55:09
assign to new "Handle<JSReceiver> receiver"
Jakob Kummerow
2016/04/22 14:04:54
Done.
| |
1792 Object::ConvertReceiver(isolate, object)); | |
1793 // 2. If IsCallable(getter) is false, throw a TypeError exception. | |
1794 if (!accessor->IsCallable()) { | |
1795 MessageTemplate::Template message = | |
1796 which_accessor == ACCESSOR_GETTER | |
1797 ? MessageTemplate::kObjectGetterExpectingFunction | |
1798 : MessageTemplate::kObjectSetterExpectingFunction; | |
1799 THROW_NEW_ERROR_RETURN_FAILURE(isolate, NewTypeError(message)); | |
1800 } | |
1801 // 3. Let desc be PropertyDescriptor{[[Get]]: getter, [[Enumerable]]: true, | |
1802 // [[Configurable]]: true}. | |
1803 PropertyDescriptor desc; | |
1804 if (which_accessor == ACCESSOR_GETTER) { | |
1805 desc.set_get(accessor); | |
1806 } else { | |
1807 DCHECK(which_accessor == ACCESSOR_SETTER); | |
1808 desc.set_set(accessor); | |
1809 } | |
1810 desc.set_enumerable(true); | |
1811 desc.set_configurable(true); | |
1812 // 4. Let key be ? ToPropertyKey(P). | |
1813 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name, | |
1814 Object::ToPropertyKey(isolate, name)); | |
1815 // 5. Perform ? DefinePropertyOrThrow(O, key, desc). | |
1816 Maybe<bool> success = | |
1817 JSReceiver::DefineOwnProperty(isolate, Handle<JSReceiver>::cast(object), | |
1818 name, &desc, Object::THROW_ON_ERROR); | |
1819 MAYBE_RETURN(success, isolate->heap()->exception()); | |
1820 CHECK(success.FromJust()); | |
1821 // 6. Return undefined. | |
1822 return isolate->heap()->undefined_value(); | |
1823 } | |
1824 | |
1825 Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object, | |
1826 Handle<Object> key, AccessorComponent component) { | |
1827 // 1. Let O be ? ToObject(this value). | |
1828 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, object, | |
1829 Object::ConvertReceiver(isolate, object)); | |
1830 // 2. Let key be ? ToPropertyKey(P). | |
1831 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key, | |
1832 Object::ToPropertyKey(isolate, key)); | |
1833 // 3. TODO | |
Jakob Kummerow
2016/04/22 13:55:09
yep, TODO :-)
Jakob Kummerow
2016/04/22 14:04:54
Dropped (we're not implementing the spec exactly,
| |
1834 bool success = false; | |
1835 LookupIterator it = LookupIterator::PropertyOrElement( | |
1836 isolate, object, key, &success, | |
1837 LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); | |
1838 DCHECK(success); | |
1839 | |
1840 for (; it.IsFound(); it.Next()) { | |
1841 switch (it.state()) { | |
1842 case LookupIterator::INTERCEPTOR: | |
1843 case LookupIterator::NOT_FOUND: | |
1844 case LookupIterator::TRANSITION: | |
1845 UNREACHABLE(); | |
1846 | |
1847 case LookupIterator::ACCESS_CHECK: | |
1848 if (it.HasAccess()) continue; | |
1849 isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); | |
1850 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | |
1851 return isolate->heap()->undefined_value(); | |
1852 | |
1853 case LookupIterator::JSPROXY: | |
1854 return isolate->heap()->undefined_value(); | |
1855 | |
1856 case LookupIterator::INTEGER_INDEXED_EXOTIC: | |
1857 return isolate->heap()->undefined_value(); | |
1858 case LookupIterator::DATA: | |
1859 continue; | |
1860 case LookupIterator::ACCESSOR: { | |
1861 Handle<Object> maybe_pair = it.GetAccessors(); | |
1862 if (maybe_pair->IsAccessorPair()) { | |
1863 return *AccessorPair::GetComponent( | |
1864 Handle<AccessorPair>::cast(maybe_pair), component); | |
1865 } | |
1866 } | |
1867 } | |
1868 } | |
1869 | |
1870 return isolate->heap()->undefined_value(); | |
1871 } | |
1872 | |
1873 } // namespace | |
1874 | |
1875 // ES6 B.2.2.2 a.k.a. | |
1876 // https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__ | |
1877 BUILTIN(ObjectDefineGetter) { | |
1878 HandleScope scope(isolate); | |
1879 Handle<Object> object = args.at<Object>(0); // Receiver. | |
1880 Handle<Object> name = args.at<Object>(1); | |
1881 Handle<Object> getter = args.at<Object>(2); | |
1882 return ObjectDefineAccessor<ACCESSOR_GETTER>(isolate, object, name, getter); | |
1883 } | |
1884 | |
1885 // ES6 B.2.2.3 a.k.a. | |
1886 // https://tc39.github.io/ecma262/#sec-object.prototype.__defineSetter__ | |
1887 BUILTIN(ObjectDefineSetter) { | |
1888 HandleScope scope(isolate); | |
1889 Handle<Object> object = args.at<Object>(0); // Receiver. | |
1890 Handle<Object> name = args.at<Object>(1); | |
1891 Handle<Object> setter = args.at<Object>(2); | |
1892 return ObjectDefineAccessor<ACCESSOR_SETTER>(isolate, object, name, setter); | |
1893 } | |
1894 | |
1895 // ES6 B.2.2.4 a.k.a. | |
1896 // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupGetter__ | |
1897 BUILTIN(ObjectLookupGetter) { | |
1898 HandleScope scope(isolate); | |
1899 Handle<Object> object = args.at<Object>(0); | |
1900 Handle<Object> name = args.at<Object>(1); | |
1901 return ObjectLookupAccessor(isolate, object, name, ACCESSOR_GETTER); | |
1902 } | |
1903 | |
1904 // ES6 B.2.2.5 a.k.a. | |
1905 // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupSetter__ | |
1906 BUILTIN(ObjectLookupSetter) { | |
1907 HandleScope scope(isolate); | |
1908 Handle<Object> object = args.at<Object>(0); | |
1909 Handle<Object> name = args.at<Object>(1); | |
1910 return ObjectLookupAccessor(isolate, object, name, ACCESSOR_SETTER); | |
1911 } | |
1785 | 1912 |
1786 // ES6 section 19.1.2.5 Object.freeze ( O ) | 1913 // ES6 section 19.1.2.5 Object.freeze ( O ) |
1787 BUILTIN(ObjectFreeze) { | 1914 BUILTIN(ObjectFreeze) { |
1788 HandleScope scope(isolate); | 1915 HandleScope scope(isolate); |
1789 Handle<Object> object = args.atOrUndefined(isolate, 1); | 1916 Handle<Object> object = args.atOrUndefined(isolate, 1); |
1790 if (object->IsJSReceiver()) { | 1917 if (object->IsJSReceiver()) { |
1791 MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object), | 1918 MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object), |
1792 FROZEN, Object::THROW_ON_ERROR), | 1919 FROZEN, Object::THROW_ON_ERROR), |
1793 isolate->heap()->exception()); | 1920 isolate->heap()->exception()); |
1794 } | 1921 } |
(...skipping 2887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4682 MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function, | 4809 MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function, |
4683 Handle<Object> receiver, | 4810 Handle<Object> receiver, |
4684 int argc, | 4811 int argc, |
4685 Handle<Object> args[]) { | 4812 Handle<Object> args[]) { |
4686 Isolate* isolate = function->GetIsolate(); | 4813 Isolate* isolate = function->GetIsolate(); |
4687 // Do proper receiver conversion for non-strict mode api functions. | 4814 // Do proper receiver conversion for non-strict mode api functions. |
4688 if (!receiver->IsJSReceiver()) { | 4815 if (!receiver->IsJSReceiver()) { |
4689 DCHECK(function->IsFunctionTemplateInfo() || function->IsJSFunction()); | 4816 DCHECK(function->IsFunctionTemplateInfo() || function->IsJSFunction()); |
4690 if (function->IsFunctionTemplateInfo() || | 4817 if (function->IsFunctionTemplateInfo() || |
4691 is_sloppy(JSFunction::cast(*function)->shared()->language_mode())) { | 4818 is_sloppy(JSFunction::cast(*function)->shared()->language_mode())) { |
4692 if (receiver->IsUndefined() || receiver->IsNull()) { | 4819 ASSIGN_RETURN_ON_EXCEPTION(isolate, receiver, |
4693 receiver = handle(isolate->global_proxy(), isolate); | 4820 Object::ConvertReceiver(isolate, receiver), |
4694 } else { | 4821 Object); |
4695 ASSIGN_RETURN_ON_EXCEPTION(isolate, receiver, | |
4696 Object::ToObject(isolate, receiver), Object); | |
4697 } | |
4698 } | 4822 } |
4699 } | 4823 } |
4700 // Construct BuiltinArguments object: function, arguments reversed, receiver. | 4824 // Construct BuiltinArguments object: function, arguments reversed, receiver. |
4701 const int kBufferSize = 32; | 4825 const int kBufferSize = 32; |
4702 Object* small_argv[kBufferSize]; | 4826 Object* small_argv[kBufferSize]; |
4703 Object** argv; | 4827 Object** argv; |
4704 if (argc + 2 <= kBufferSize) { | 4828 if (argc + 2 <= kBufferSize) { |
4705 argv = small_argv; | 4829 argv = small_argv; |
4706 } else { | 4830 } else { |
4707 argv = new Object* [argc + 2]; | 4831 argv = new Object* [argc + 2]; |
(...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
5346 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) | 5470 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) |
5347 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) | 5471 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) |
5348 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) | 5472 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |
5349 #undef DEFINE_BUILTIN_ACCESSOR_C | 5473 #undef DEFINE_BUILTIN_ACCESSOR_C |
5350 #undef DEFINE_BUILTIN_ACCESSOR_A | 5474 #undef DEFINE_BUILTIN_ACCESSOR_A |
5351 #undef DEFINE_BUILTIN_ACCESSOR_T | 5475 #undef DEFINE_BUILTIN_ACCESSOR_T |
5352 #undef DEFINE_BUILTIN_ACCESSOR_H | 5476 #undef DEFINE_BUILTIN_ACCESSOR_H |
5353 | 5477 |
5354 } // namespace internal | 5478 } // namespace internal |
5355 } // namespace v8 | 5479 } // namespace v8 |
OLD | NEW |