| 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 1797 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1808 BUILTIN(ObjectDefineProperty) { |  1808 BUILTIN(ObjectDefineProperty) { | 
|  1809   HandleScope scope(isolate); |  1809   HandleScope scope(isolate); | 
|  1810   DCHECK_EQ(4, args.length()); |  1810   DCHECK_EQ(4, args.length()); | 
|  1811   Handle<Object> target = args.at<Object>(1); |  1811   Handle<Object> target = args.at<Object>(1); | 
|  1812   Handle<Object> key = args.at<Object>(2); |  1812   Handle<Object> key = args.at<Object>(2); | 
|  1813   Handle<Object> attributes = args.at<Object>(3); |  1813   Handle<Object> attributes = args.at<Object>(3); | 
|  1814  |  1814  | 
|  1815   return JSReceiver::DefineProperty(isolate, target, key, attributes); |  1815   return JSReceiver::DefineProperty(isolate, target, key, attributes); | 
|  1816 } |  1816 } | 
|  1817  |  1817  | 
 |  1818 namespace { | 
 |  1819  | 
 |  1820 template <AccessorComponent which_accessor> | 
 |  1821 Object* ObjectDefineAccessor(Isolate* isolate, Handle<Object> object, | 
 |  1822                              Handle<Object> name, Handle<Object> accessor) { | 
 |  1823   // 1. Let O be ? ToObject(this value). | 
 |  1824   Handle<JSReceiver> receiver; | 
 |  1825   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver, | 
 |  1826                                      Object::ConvertReceiver(isolate, object)); | 
 |  1827   // 2. If IsCallable(getter) is false, throw a TypeError exception. | 
 |  1828   if (!accessor->IsCallable()) { | 
 |  1829     MessageTemplate::Template message = | 
 |  1830         which_accessor == ACCESSOR_GETTER | 
 |  1831             ? MessageTemplate::kObjectGetterExpectingFunction | 
 |  1832             : MessageTemplate::kObjectSetterExpectingFunction; | 
 |  1833     THROW_NEW_ERROR_RETURN_FAILURE(isolate, NewTypeError(message)); | 
 |  1834   } | 
 |  1835   // 3. Let desc be PropertyDescriptor{[[Get]]: getter, [[Enumerable]]: true, | 
 |  1836   //                                   [[Configurable]]: true}. | 
 |  1837   PropertyDescriptor desc; | 
 |  1838   if (which_accessor == ACCESSOR_GETTER) { | 
 |  1839     desc.set_get(accessor); | 
 |  1840   } else { | 
 |  1841     DCHECK(which_accessor == ACCESSOR_SETTER); | 
 |  1842     desc.set_set(accessor); | 
 |  1843   } | 
 |  1844   desc.set_enumerable(true); | 
 |  1845   desc.set_configurable(true); | 
 |  1846   // 4. Let key be ? ToPropertyKey(P). | 
 |  1847   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, name, | 
 |  1848                                      Object::ToPropertyKey(isolate, name)); | 
 |  1849   // 5. Perform ? DefinePropertyOrThrow(O, key, desc). | 
 |  1850   // To preserve legacy behavior, we ignore errors silently rather than | 
 |  1851   // throwing an exception. | 
 |  1852   Maybe<bool> success = JSReceiver::DefineOwnProperty( | 
 |  1853       isolate, receiver, name, &desc, Object::DONT_THROW); | 
 |  1854   MAYBE_RETURN(success, isolate->heap()->exception()); | 
 |  1855   // 6. Return undefined. | 
 |  1856   return isolate->heap()->undefined_value(); | 
 |  1857 } | 
 |  1858  | 
 |  1859 Object* ObjectLookupAccessor(Isolate* isolate, Handle<Object> object, | 
 |  1860                              Handle<Object> key, AccessorComponent component) { | 
 |  1861   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, object, | 
 |  1862                                      Object::ConvertReceiver(isolate, object)); | 
 |  1863   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key, | 
 |  1864                                      Object::ToPropertyKey(isolate, key)); | 
 |  1865   bool success = false; | 
 |  1866   LookupIterator it = LookupIterator::PropertyOrElement( | 
 |  1867       isolate, object, key, &success, | 
 |  1868       LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR); | 
 |  1869   DCHECK(success); | 
 |  1870  | 
 |  1871   for (; it.IsFound(); it.Next()) { | 
 |  1872     switch (it.state()) { | 
 |  1873       case LookupIterator::INTERCEPTOR: | 
 |  1874       case LookupIterator::NOT_FOUND: | 
 |  1875       case LookupIterator::TRANSITION: | 
 |  1876         UNREACHABLE(); | 
 |  1877  | 
 |  1878       case LookupIterator::ACCESS_CHECK: | 
 |  1879         if (it.HasAccess()) continue; | 
 |  1880         isolate->ReportFailedAccessCheck(it.GetHolder<JSObject>()); | 
 |  1881         RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); | 
 |  1882         return isolate->heap()->undefined_value(); | 
 |  1883  | 
 |  1884       case LookupIterator::JSPROXY: | 
 |  1885         return isolate->heap()->undefined_value(); | 
 |  1886  | 
 |  1887       case LookupIterator::INTEGER_INDEXED_EXOTIC: | 
 |  1888         return isolate->heap()->undefined_value(); | 
 |  1889       case LookupIterator::DATA: | 
 |  1890         continue; | 
 |  1891       case LookupIterator::ACCESSOR: { | 
 |  1892         Handle<Object> maybe_pair = it.GetAccessors(); | 
 |  1893         if (maybe_pair->IsAccessorPair()) { | 
 |  1894           return *AccessorPair::GetComponent( | 
 |  1895               Handle<AccessorPair>::cast(maybe_pair), component); | 
 |  1896         } | 
 |  1897       } | 
 |  1898     } | 
 |  1899   } | 
 |  1900  | 
 |  1901   return isolate->heap()->undefined_value(); | 
 |  1902 } | 
 |  1903  | 
 |  1904 }  // namespace | 
 |  1905  | 
 |  1906 // ES6 B.2.2.2 a.k.a. | 
 |  1907 // https://tc39.github.io/ecma262/#sec-object.prototype.__defineGetter__ | 
 |  1908 BUILTIN(ObjectDefineGetter) { | 
 |  1909   HandleScope scope(isolate); | 
 |  1910   Handle<Object> object = args.at<Object>(0);  // Receiver. | 
 |  1911   Handle<Object> name = args.at<Object>(1); | 
 |  1912   Handle<Object> getter = args.at<Object>(2); | 
 |  1913   return ObjectDefineAccessor<ACCESSOR_GETTER>(isolate, object, name, getter); | 
 |  1914 } | 
 |  1915  | 
 |  1916 // ES6 B.2.2.3 a.k.a. | 
 |  1917 // https://tc39.github.io/ecma262/#sec-object.prototype.__defineSetter__ | 
 |  1918 BUILTIN(ObjectDefineSetter) { | 
 |  1919   HandleScope scope(isolate); | 
 |  1920   Handle<Object> object = args.at<Object>(0);  // Receiver. | 
 |  1921   Handle<Object> name = args.at<Object>(1); | 
 |  1922   Handle<Object> setter = args.at<Object>(2); | 
 |  1923   return ObjectDefineAccessor<ACCESSOR_SETTER>(isolate, object, name, setter); | 
 |  1924 } | 
 |  1925  | 
 |  1926 // ES6 B.2.2.4 a.k.a. | 
 |  1927 // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupGetter__ | 
 |  1928 BUILTIN(ObjectLookupGetter) { | 
 |  1929   HandleScope scope(isolate); | 
 |  1930   Handle<Object> object = args.at<Object>(0); | 
 |  1931   Handle<Object> name = args.at<Object>(1); | 
 |  1932   return ObjectLookupAccessor(isolate, object, name, ACCESSOR_GETTER); | 
 |  1933 } | 
 |  1934  | 
 |  1935 // ES6 B.2.2.5 a.k.a. | 
 |  1936 // https://tc39.github.io/ecma262/#sec-object.prototype.__lookupSetter__ | 
 |  1937 BUILTIN(ObjectLookupSetter) { | 
 |  1938   HandleScope scope(isolate); | 
 |  1939   Handle<Object> object = args.at<Object>(0); | 
 |  1940   Handle<Object> name = args.at<Object>(1); | 
 |  1941   return ObjectLookupAccessor(isolate, object, name, ACCESSOR_SETTER); | 
 |  1942 } | 
 |  1943  | 
|  1818 // ES6 section 19.1.2.5 Object.freeze ( O ) |  1944 // ES6 section 19.1.2.5 Object.freeze ( O ) | 
|  1819 BUILTIN(ObjectFreeze) { |  1945 BUILTIN(ObjectFreeze) { | 
|  1820   HandleScope scope(isolate); |  1946   HandleScope scope(isolate); | 
|  1821   Handle<Object> object = args.atOrUndefined(isolate, 1); |  1947   Handle<Object> object = args.atOrUndefined(isolate, 1); | 
|  1822   if (object->IsJSReceiver()) { |  1948   if (object->IsJSReceiver()) { | 
|  1823     MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object), |  1949     MAYBE_RETURN(JSReceiver::SetIntegrityLevel(Handle<JSReceiver>::cast(object), | 
|  1824                                                FROZEN, Object::THROW_ON_ERROR), |  1950                                                FROZEN, Object::THROW_ON_ERROR), | 
|  1825                  isolate->heap()->exception()); |  1951                  isolate->heap()->exception()); | 
|  1826   } |  1952   } | 
|  1827   return *object; |  1953   return *object; | 
| (...skipping 2892 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4720 MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function, |  4846 MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function, | 
|  4721                                                 Handle<Object> receiver, |  4847                                                 Handle<Object> receiver, | 
|  4722                                                 int argc, |  4848                                                 int argc, | 
|  4723                                                 Handle<Object> args[]) { |  4849                                                 Handle<Object> args[]) { | 
|  4724   Isolate* isolate = function->GetIsolate(); |  4850   Isolate* isolate = function->GetIsolate(); | 
|  4725   // Do proper receiver conversion for non-strict mode api functions. |  4851   // Do proper receiver conversion for non-strict mode api functions. | 
|  4726   if (!receiver->IsJSReceiver()) { |  4852   if (!receiver->IsJSReceiver()) { | 
|  4727     DCHECK(function->IsFunctionTemplateInfo() || function->IsJSFunction()); |  4853     DCHECK(function->IsFunctionTemplateInfo() || function->IsJSFunction()); | 
|  4728     if (function->IsFunctionTemplateInfo() || |  4854     if (function->IsFunctionTemplateInfo() || | 
|  4729         is_sloppy(JSFunction::cast(*function)->shared()->language_mode())) { |  4855         is_sloppy(JSFunction::cast(*function)->shared()->language_mode())) { | 
|  4730       if (receiver->IsUndefined() || receiver->IsNull()) { |  4856       ASSIGN_RETURN_ON_EXCEPTION(isolate, receiver, | 
|  4731         receiver = handle(isolate->global_proxy(), isolate); |  4857                                  Object::ConvertReceiver(isolate, receiver), | 
|  4732       } else { |  4858                                  Object); | 
|  4733         ASSIGN_RETURN_ON_EXCEPTION(isolate, receiver, |  | 
|  4734                                    Object::ToObject(isolate, receiver), Object); |  | 
|  4735       } |  | 
|  4736     } |  4859     } | 
|  4737   } |  4860   } | 
|  4738   // Construct BuiltinArguments object: |  4861   // Construct BuiltinArguments object: | 
|  4739   // new target, function, arguments reversed, receiver. |  4862   // new target, function, arguments reversed, receiver. | 
|  4740   const int kBufferSize = 32; |  4863   const int kBufferSize = 32; | 
|  4741   Object* small_argv[kBufferSize]; |  4864   Object* small_argv[kBufferSize]; | 
|  4742   Object** argv; |  4865   Object** argv; | 
|  4743   if (argc + 3 <= kBufferSize) { |  4866   if (argc + 3 <= kBufferSize) { | 
|  4744     argv = small_argv; |  4867     argv = small_argv; | 
|  4745   } else { |  4868   } else { | 
| (...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5394 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) |  5517 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) | 
|  5395 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) |  5518 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) | 
|  5396 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |  5519 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) | 
|  5397 #undef DEFINE_BUILTIN_ACCESSOR_C |  5520 #undef DEFINE_BUILTIN_ACCESSOR_C | 
|  5398 #undef DEFINE_BUILTIN_ACCESSOR_A |  5521 #undef DEFINE_BUILTIN_ACCESSOR_A | 
|  5399 #undef DEFINE_BUILTIN_ACCESSOR_T |  5522 #undef DEFINE_BUILTIN_ACCESSOR_T | 
|  5400 #undef DEFINE_BUILTIN_ACCESSOR_H |  5523 #undef DEFINE_BUILTIN_ACCESSOR_H | 
|  5401  |  5524  | 
|  5402 }  // namespace internal |  5525 }  // namespace internal | 
|  5403 }  // namespace v8 |  5526 }  // namespace v8 | 
| OLD | NEW |