| 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 13 matching lines...) Expand all Loading... |
| 24 namespace v8 { | 24 namespace v8 { |
| 25 namespace internal { | 25 namespace internal { |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 // Arguments object passed to C++ builtins. | 29 // Arguments object passed to C++ builtins. |
| 30 template <BuiltinExtraArguments extra_args> | 30 template <BuiltinExtraArguments extra_args> |
| 31 class BuiltinArguments : public Arguments { | 31 class BuiltinArguments : public Arguments { |
| 32 public: | 32 public: |
| 33 BuiltinArguments(int length, Object** arguments) | 33 BuiltinArguments(int length, Object** arguments) |
| 34 : Arguments(length, arguments) { } | 34 : Arguments(length, arguments) { |
| 35 // Check we have at least the receiver. |
| 36 DCHECK_LE(1, this->length()); |
| 37 } |
| 35 | 38 |
| 36 Object*& operator[] (int index) { | 39 Object*& operator[] (int index) { |
| 37 DCHECK(index < length()); | 40 DCHECK(index < length()); |
| 38 return Arguments::operator[](index); | 41 return Arguments::operator[](index); |
| 39 } | 42 } |
| 40 | 43 |
| 41 template <class S> Handle<S> at(int index) { | 44 template <class S> Handle<S> at(int index) { |
| 42 DCHECK(index < length()); | 45 DCHECK(index < length()); |
| 43 return Arguments::at<S>(index); | 46 return Arguments::at<S>(index); |
| 44 } | 47 } |
| 45 | 48 |
| 46 Handle<Object> receiver() { | 49 Handle<Object> receiver() { |
| 47 return Arguments::at<Object>(0); | 50 return Arguments::at<Object>(0); |
| 48 } | 51 } |
| 49 | 52 |
| 50 Handle<JSFunction> called_function() { | 53 Handle<JSFunction> target(); |
| 51 STATIC_ASSERT(extra_args == NEEDS_CALLED_FUNCTION); | 54 Handle<HeapObject> new_target(); |
| 52 return Arguments::at<JSFunction>(Arguments::length() - 1); | |
| 53 } | |
| 54 | 55 |
| 55 // Gets the total number of arguments including the receiver (but | 56 // Gets the total number of arguments including the receiver (but |
| 56 // excluding extra arguments). | 57 // excluding extra arguments). |
| 57 int length() const { | 58 int length() const; |
| 58 STATIC_ASSERT(extra_args == NO_EXTRA_ARGUMENTS); | |
| 59 return Arguments::length(); | |
| 60 } | |
| 61 | |
| 62 #ifdef DEBUG | |
| 63 void Verify() { | |
| 64 // Check we have at least the receiver. | |
| 65 DCHECK(Arguments::length() >= 1); | |
| 66 } | |
| 67 #endif | |
| 68 }; | 59 }; |
| 69 | 60 |
| 70 | 61 |
| 71 // Specialize BuiltinArguments for the called function extra argument. | 62 // Specialize BuiltinArguments for the extra arguments. |
| 72 | 63 |
| 73 template <> | 64 template <> |
| 74 int BuiltinArguments<NEEDS_CALLED_FUNCTION>::length() const { | 65 int BuiltinArguments<BuiltinExtraArguments::kNone>::length() const { |
| 66 return Arguments::length(); |
| 67 } |
| 68 |
| 69 template <> |
| 70 int BuiltinArguments<BuiltinExtraArguments::kTarget>::length() const { |
| 75 return Arguments::length() - 1; | 71 return Arguments::length() - 1; |
| 76 } | 72 } |
| 77 | 73 |
| 78 #ifdef DEBUG | |
| 79 template <> | 74 template <> |
| 80 void BuiltinArguments<NEEDS_CALLED_FUNCTION>::Verify() { | 75 Handle<JSFunction> BuiltinArguments<BuiltinExtraArguments::kTarget>::target() { |
| 81 // Check we have at least the receiver and the called function. | 76 return Arguments::at<JSFunction>(Arguments::length() - 1); |
| 82 DCHECK(Arguments::length() >= 2); | |
| 83 // Make sure cast to JSFunction succeeds. | |
| 84 called_function(); | |
| 85 } | 77 } |
| 86 #endif | 78 |
| 79 template <> |
| 80 int BuiltinArguments<BuiltinExtraArguments::kNewTarget>::length() const { |
| 81 return Arguments::length() - 1; |
| 82 } |
| 83 |
| 84 template <> |
| 85 Handle<HeapObject> |
| 86 BuiltinArguments<BuiltinExtraArguments::kNewTarget>::new_target() { |
| 87 return Arguments::at<HeapObject>(Arguments::length() - 1); |
| 88 } |
| 89 |
| 90 template <> |
| 91 int BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::length() |
| 92 const { |
| 93 return Arguments::length() - 2; |
| 94 } |
| 95 |
| 96 template <> |
| 97 Handle<JSFunction> |
| 98 BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::target() { |
| 99 return Arguments::at<JSFunction>(Arguments::length() - 2); |
| 100 } |
| 101 |
| 102 template <> |
| 103 Handle<HeapObject> |
| 104 BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::new_target() { |
| 105 return Arguments::at<HeapObject>(Arguments::length() - 1); |
| 106 } |
| 87 | 107 |
| 88 | 108 |
| 89 #define DEF_ARG_TYPE(name, spec) \ | 109 #define DEF_ARG_TYPE(name, spec) \ |
| 90 typedef BuiltinArguments<spec> name##ArgumentsType; | 110 typedef BuiltinArguments<BuiltinExtraArguments::spec> name##ArgumentsType; |
| 91 BUILTIN_LIST_C(DEF_ARG_TYPE) | 111 BUILTIN_LIST_C(DEF_ARG_TYPE) |
| 92 #undef DEF_ARG_TYPE | 112 #undef DEF_ARG_TYPE |
| 93 | 113 |
| 94 | 114 |
| 95 // ---------------------------------------------------------------------------- | 115 // ---------------------------------------------------------------------------- |
| 96 // Support macro for defining builtins in C++. | 116 // Support macro for defining builtins in C++. |
| 97 // ---------------------------------------------------------------------------- | 117 // ---------------------------------------------------------------------------- |
| 98 // | 118 // |
| 99 // A builtin function is defined by writing: | 119 // A builtin function is defined by writing: |
| 100 // | 120 // |
| 101 // BUILTIN(name) { | 121 // BUILTIN(name) { |
| 102 // ... | 122 // ... |
| 103 // } | 123 // } |
| 104 // | 124 // |
| 105 // In the body of the builtin function the arguments can be accessed | 125 // In the body of the builtin function the arguments can be accessed |
| 106 // through the BuiltinArguments object args. | 126 // through the BuiltinArguments object args. |
| 107 | 127 |
| 108 #ifdef DEBUG | |
| 109 | |
| 110 #define BUILTIN(name) \ | 128 #define BUILTIN(name) \ |
| 111 MUST_USE_RESULT static Object* Builtin_Impl_##name( \ | 129 MUST_USE_RESULT static Object* Builtin_Impl_##name( \ |
| 112 name##ArgumentsType args, Isolate* isolate); \ | 130 name##ArgumentsType args, Isolate* isolate); \ |
| 113 MUST_USE_RESULT static Object* Builtin_##name( \ | 131 MUST_USE_RESULT static Object* Builtin_##name( \ |
| 114 int args_length, Object** args_object, Isolate* isolate) { \ | 132 int args_length, Object** args_object, Isolate* isolate) { \ |
| 115 name##ArgumentsType args(args_length, args_object); \ | 133 name##ArgumentsType args(args_length, args_object); \ |
| 116 args.Verify(); \ | |
| 117 return Builtin_Impl_##name(args, isolate); \ | 134 return Builtin_Impl_##name(args, isolate); \ |
| 118 } \ | 135 } \ |
| 119 MUST_USE_RESULT static Object* Builtin_Impl_##name( \ | 136 MUST_USE_RESULT static Object* Builtin_Impl_##name( \ |
| 120 name##ArgumentsType args, Isolate* isolate) | 137 name##ArgumentsType args, Isolate* isolate) |
| 121 | 138 |
| 122 #else // For release mode. | |
| 123 | |
| 124 #define BUILTIN(name) \ | |
| 125 static Object* Builtin_impl##name( \ | |
| 126 name##ArgumentsType args, Isolate* isolate); \ | |
| 127 static Object* Builtin_##name( \ | |
| 128 int args_length, Object** args_object, Isolate* isolate) { \ | |
| 129 name##ArgumentsType args(args_length, args_object); \ | |
| 130 return Builtin_impl##name(args, isolate); \ | |
| 131 } \ | |
| 132 static Object* Builtin_impl##name( \ | |
| 133 name##ArgumentsType args, Isolate* isolate) | |
| 134 #endif | |
| 135 | |
| 136 | |
| 137 #ifdef DEBUG | |
| 138 inline bool CalledAsConstructor(Isolate* isolate) { | |
| 139 // Calculate the result using a full stack frame iterator and check | |
| 140 // that the state of the stack is as we assume it to be in the | |
| 141 // code below. | |
| 142 StackFrameIterator it(isolate); | |
| 143 DCHECK(it.frame()->is_exit()); | |
| 144 it.Advance(); | |
| 145 StackFrame* frame = it.frame(); | |
| 146 bool reference_result = frame->is_construct(); | |
| 147 Address fp = Isolate::c_entry_fp(isolate->thread_local_top()); | |
| 148 // Because we know fp points to an exit frame we can use the relevant | |
| 149 // part of ExitFrame::ComputeCallerState directly. | |
| 150 const int kCallerOffset = ExitFrameConstants::kCallerFPOffset; | |
| 151 Address caller_fp = Memory::Address_at(fp + kCallerOffset); | |
| 152 // This inlines the part of StackFrame::ComputeType that grabs the | |
| 153 // type of the current frame. Note that StackFrame::ComputeType | |
| 154 // has been specialized for each architecture so if any one of them | |
| 155 // changes this code has to be changed as well. | |
| 156 const int kMarkerOffset = StandardFrameConstants::kMarkerOffset; | |
| 157 const Smi* kConstructMarker = Smi::FromInt(StackFrame::CONSTRUCT); | |
| 158 Object* marker = Memory::Object_at(caller_fp + kMarkerOffset); | |
| 159 bool result = (marker == kConstructMarker); | |
| 160 DCHECK_EQ(result, reference_result); | |
| 161 return result; | |
| 162 } | |
| 163 #endif | |
| 164 | |
| 165 | 139 |
| 166 // ---------------------------------------------------------------------------- | 140 // ---------------------------------------------------------------------------- |
| 167 | 141 |
| 168 | 142 |
| 169 inline bool ClampedToInteger(Object* object, int* out) { | 143 inline bool ClampedToInteger(Object* object, int* out) { |
| 170 // This is an extended version of ECMA-262 7.1.11 handling signed values | 144 // This is an extended version of ECMA-262 7.1.11 handling signed values |
| 171 // Try to convert object to a number and clamp values to [kMinInt, kMaxInt] | 145 // Try to convert object to a number and clamp values to [kMinInt, kMaxInt] |
| 172 if (object->IsSmi()) { | 146 if (object->IsSmi()) { |
| 173 *out = Smi::cast(object)->value(); | 147 *out = Smi::cast(object)->value(); |
| 174 return true; | 148 return true; |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 if (target_kind != origin_kind) { | 273 if (target_kind != origin_kind) { |
| 300 JSObject::TransitionElementsKind(array, target_kind); | 274 JSObject::TransitionElementsKind(array, target_kind); |
| 301 return handle(array->elements(), isolate); | 275 return handle(array->elements(), isolate); |
| 302 } | 276 } |
| 303 return elms; | 277 return elms; |
| 304 } | 278 } |
| 305 | 279 |
| 306 | 280 |
| 307 MUST_USE_RESULT static Object* CallJsIntrinsic( | 281 MUST_USE_RESULT static Object* CallJsIntrinsic( |
| 308 Isolate* isolate, Handle<JSFunction> function, | 282 Isolate* isolate, Handle<JSFunction> function, |
| 309 BuiltinArguments<NO_EXTRA_ARGUMENTS> args) { | 283 BuiltinArguments<BuiltinExtraArguments::kNone> args) { |
| 310 HandleScope handleScope(isolate); | 284 HandleScope handleScope(isolate); |
| 311 int argc = args.length() - 1; | 285 int argc = args.length() - 1; |
| 312 ScopedVector<Handle<Object> > argv(argc); | 286 ScopedVector<Handle<Object> > argv(argc); |
| 313 for (int i = 0; i < argc; ++i) { | 287 for (int i = 0; i < argc; ++i) { |
| 314 argv[i] = args.at<Object>(i + 1); | 288 argv[i] = args.at<Object>(i + 1); |
| 315 } | 289 } |
| 316 Handle<Object> result; | 290 Handle<Object> result; |
| 317 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 291 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
| 318 isolate, result, | 292 isolate, result, |
| 319 Execution::Call(isolate, | 293 Execution::Call(isolate, |
| (...skipping 1437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1757 } | 1731 } |
| 1758 return *result; | 1732 return *result; |
| 1759 } | 1733 } |
| 1760 | 1734 |
| 1761 | 1735 |
| 1762 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Construct]] case. | 1736 // ES6 section 19.4.1.1 Symbol ( [ description ] ) for the [[Construct]] case. |
| 1763 BUILTIN(SymbolConstructor_ConstructStub) { | 1737 BUILTIN(SymbolConstructor_ConstructStub) { |
| 1764 HandleScope scope(isolate); | 1738 HandleScope scope(isolate); |
| 1765 // The ConstructStub is executed in the context of the caller, so we need | 1739 // The ConstructStub is executed in the context of the caller, so we need |
| 1766 // to enter the callee context first before raising an exception. | 1740 // to enter the callee context first before raising an exception. |
| 1767 isolate->set_context(args.called_function()->context()); | 1741 isolate->set_context(args.target()->context()); |
| 1768 THROW_NEW_ERROR_RETURN_FAILURE( | 1742 THROW_NEW_ERROR_RETURN_FAILURE( |
| 1769 isolate, NewTypeError(MessageTemplate::kNotConstructor, | 1743 isolate, NewTypeError(MessageTemplate::kNotConstructor, |
| 1770 isolate->factory()->Symbol_string())); | 1744 isolate->factory()->Symbol_string())); |
| 1771 } | 1745 } |
| 1772 | 1746 |
| 1773 | 1747 |
| 1774 // ----------------------------------------------------------------------------- | 1748 // ----------------------------------------------------------------------------- |
| 1775 // Throwers for restricted function properties and strict arguments object | 1749 // Throwers for restricted function properties and strict arguments object |
| 1776 // properties | 1750 // properties |
| 1777 | 1751 |
| 1778 | 1752 |
| 1779 BUILTIN(RestrictedFunctionPropertiesThrower) { | 1753 BUILTIN(RestrictedFunctionPropertiesThrower) { |
| 1780 HandleScope scope(isolate); | 1754 HandleScope scope(isolate); |
| 1781 THROW_NEW_ERROR_RETURN_FAILURE( | 1755 THROW_NEW_ERROR_RETURN_FAILURE( |
| 1782 isolate, NewTypeError(MessageTemplate::kRestrictedFunctionProperties)); | 1756 isolate, NewTypeError(MessageTemplate::kRestrictedFunctionProperties)); |
| 1783 } | 1757 } |
| 1784 | 1758 |
| 1785 | 1759 |
| 1786 BUILTIN(RestrictedStrictArgumentsPropertiesThrower) { | 1760 BUILTIN(RestrictedStrictArgumentsPropertiesThrower) { |
| 1787 HandleScope scope(isolate); | 1761 HandleScope scope(isolate); |
| 1788 THROW_NEW_ERROR_RETURN_FAILURE( | 1762 THROW_NEW_ERROR_RETURN_FAILURE( |
| 1789 isolate, NewTypeError(MessageTemplate::kStrictPoisonPill)); | 1763 isolate, NewTypeError(MessageTemplate::kStrictPoisonPill)); |
| 1790 } | 1764 } |
| 1791 | 1765 |
| 1792 | 1766 |
| 1793 // ----------------------------------------------------------------------------- | 1767 // ----------------------------------------------------------------------------- |
| 1794 // | 1768 // |
| 1795 | 1769 |
| 1796 | 1770 |
| 1771 namespace { |
| 1772 |
| 1797 template <bool is_construct> | 1773 template <bool is_construct> |
| 1798 MUST_USE_RESULT static MaybeHandle<Object> HandleApiCallHelper( | 1774 MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper( |
| 1799 Isolate* isolate, BuiltinArguments<NEEDS_CALLED_FUNCTION>& args) { | 1775 Isolate* isolate, BuiltinArguments<BuiltinExtraArguments::kTarget> args) { |
| 1800 HandleScope scope(isolate); | 1776 HandleScope scope(isolate); |
| 1801 Handle<JSFunction> function = args.called_function(); | 1777 Handle<JSFunction> function = args.target(); |
| 1802 // TODO(ishell): turn this back to a DCHECK. | 1778 // TODO(ishell): turn this back to a DCHECK. |
| 1803 CHECK(function->shared()->IsApiFunction()); | 1779 CHECK(function->shared()->IsApiFunction()); |
| 1804 | 1780 |
| 1805 Handle<FunctionTemplateInfo> fun_data( | 1781 Handle<FunctionTemplateInfo> fun_data( |
| 1806 function->shared()->get_api_func_data(), isolate); | 1782 function->shared()->get_api_func_data(), isolate); |
| 1807 if (is_construct) { | 1783 if (is_construct) { |
| 1808 ASSIGN_RETURN_ON_EXCEPTION( | 1784 ASSIGN_RETURN_ON_EXCEPTION( |
| 1809 isolate, fun_data, | 1785 isolate, fun_data, |
| 1810 ApiNatives::ConfigureInstance(isolate, fun_data, | 1786 ApiNatives::ConfigureInstance(isolate, fun_data, |
| 1811 Handle<JSObject>::cast(args.receiver())), | 1787 Handle<JSObject>::cast(args.receiver())), |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1866 | 1842 |
| 1867 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 1843 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 1868 if (!is_construct || result->IsJSObject()) { | 1844 if (!is_construct || result->IsJSObject()) { |
| 1869 return scope.CloseAndEscape(result); | 1845 return scope.CloseAndEscape(result); |
| 1870 } | 1846 } |
| 1871 } | 1847 } |
| 1872 | 1848 |
| 1873 return scope.CloseAndEscape(args.receiver()); | 1849 return scope.CloseAndEscape(args.receiver()); |
| 1874 } | 1850 } |
| 1875 | 1851 |
| 1852 } // namespace |
| 1853 |
| 1876 | 1854 |
| 1877 BUILTIN(HandleApiCall) { | 1855 BUILTIN(HandleApiCall) { |
| 1878 HandleScope scope(isolate); | 1856 HandleScope scope(isolate); |
| 1879 DCHECK(!CalledAsConstructor(isolate)); | |
| 1880 Handle<Object> result; | 1857 Handle<Object> result; |
| 1881 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 1858 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
| 1882 HandleApiCallHelper<false>(isolate, args)); | 1859 HandleApiCallHelper<false>(isolate, args)); |
| 1883 return *result; | 1860 return *result; |
| 1884 } | 1861 } |
| 1885 | 1862 |
| 1886 | 1863 |
| 1887 BUILTIN(HandleApiCallConstruct) { | 1864 BUILTIN(HandleApiCallConstruct) { |
| 1888 HandleScope scope(isolate); | 1865 HandleScope scope(isolate); |
| 1889 DCHECK(CalledAsConstructor(isolate)); | |
| 1890 Handle<Object> result; | 1866 Handle<Object> result; |
| 1891 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 1867 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
| 1892 HandleApiCallHelper<true>(isolate, args)); | 1868 HandleApiCallHelper<true>(isolate, args)); |
| 1893 return *result; | 1869 return *result; |
| 1894 } | 1870 } |
| 1895 | 1871 |
| 1896 | 1872 |
| 1897 Handle<Code> Builtins::CallFunction(ConvertReceiverMode mode) { | 1873 Handle<Code> Builtins::CallFunction(ConvertReceiverMode mode) { |
| 1898 switch (mode) { | 1874 switch (mode) { |
| 1899 case ConvertReceiverMode::kNullOrUndefined: | 1875 case ConvertReceiverMode::kNullOrUndefined: |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1917 case ConvertReceiverMode::kAny: | 1893 case ConvertReceiverMode::kAny: |
| 1918 return Call_ReceiverIsAny(); | 1894 return Call_ReceiverIsAny(); |
| 1919 } | 1895 } |
| 1920 UNREACHABLE(); | 1896 UNREACHABLE(); |
| 1921 return Handle<Code>::null(); | 1897 return Handle<Code>::null(); |
| 1922 } | 1898 } |
| 1923 | 1899 |
| 1924 | 1900 |
| 1925 namespace { | 1901 namespace { |
| 1926 | 1902 |
| 1927 class RelocatableArguments : public BuiltinArguments<NEEDS_CALLED_FUNCTION>, | 1903 class RelocatableArguments |
| 1928 public Relocatable { | 1904 : public BuiltinArguments<BuiltinExtraArguments::kTarget>, |
| 1905 public Relocatable { |
| 1929 public: | 1906 public: |
| 1930 RelocatableArguments(Isolate* isolate, int length, Object** arguments) | 1907 RelocatableArguments(Isolate* isolate, int length, Object** arguments) |
| 1931 : BuiltinArguments<NEEDS_CALLED_FUNCTION>(length, arguments), | 1908 : BuiltinArguments<BuiltinExtraArguments::kTarget>(length, arguments), |
| 1932 Relocatable(isolate) {} | 1909 Relocatable(isolate) {} |
| 1933 | 1910 |
| 1934 virtual inline void IterateInstance(ObjectVisitor* v) { | 1911 virtual inline void IterateInstance(ObjectVisitor* v) { |
| 1935 if (length() == 0) return; | 1912 if (length() == 0) return; |
| 1936 v->VisitPointers(lowest_address(), highest_address() + 1); | 1913 v->VisitPointers(lowest_address(), highest_address() + 1); |
| 1937 } | 1914 } |
| 1938 | 1915 |
| 1939 private: | 1916 private: |
| 1940 DISALLOW_COPY_AND_ASSIGN(RelocatableArguments); | 1917 DISALLOW_COPY_AND_ASSIGN(RelocatableArguments); |
| 1941 }; | 1918 }; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1971 delete[] argv; | 1948 delete[] argv; |
| 1972 } | 1949 } |
| 1973 return result; | 1950 return result; |
| 1974 } | 1951 } |
| 1975 | 1952 |
| 1976 | 1953 |
| 1977 // Helper function to handle calls to non-function objects created through the | 1954 // Helper function to handle calls to non-function objects created through the |
| 1978 // API. The object can be called as either a constructor (using new) or just as | 1955 // API. The object can be called as either a constructor (using new) or just as |
| 1979 // a function (without new). | 1956 // a function (without new). |
| 1980 MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor( | 1957 MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor( |
| 1981 Isolate* isolate, | 1958 Isolate* isolate, bool is_construct_call, |
| 1982 bool is_construct_call, | 1959 BuiltinArguments<BuiltinExtraArguments::kNone> args) { |
| 1983 BuiltinArguments<NO_EXTRA_ARGUMENTS> args) { | |
| 1984 // Non-functions are never called as constructors. Even if this is an object | |
| 1985 // called as a constructor the delegate call is not a construct call. | |
| 1986 DCHECK(!CalledAsConstructor(isolate)); | |
| 1987 Heap* heap = isolate->heap(); | 1960 Heap* heap = isolate->heap(); |
| 1988 | 1961 |
| 1989 Handle<Object> receiver = args.receiver(); | 1962 Handle<Object> receiver = args.receiver(); |
| 1990 | 1963 |
| 1991 // Get the object called. | 1964 // Get the object called. |
| 1992 JSObject* obj = JSObject::cast(*receiver); | 1965 JSObject* obj = JSObject::cast(*receiver); |
| 1993 | 1966 |
| 1994 // Get the invocation callback from the function descriptor that was | 1967 // Get the invocation callback from the function descriptor that was |
| 1995 // used to create the called object. | 1968 // used to create the called object. |
| 1996 DCHECK(obj->map()->is_callable()); | 1969 DCHECK(obj->map()->is_callable()); |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2233 // We do this in a sort of roundabout way so that we can do the initialization | 2206 // We do this in a sort of roundabout way so that we can do the initialization |
| 2234 // within the lexical scope of Builtins:: and within a context where | 2207 // within the lexical scope of Builtins:: and within a context where |
| 2235 // Code::Flags names a non-abstract type. | 2208 // Code::Flags names a non-abstract type. |
| 2236 void Builtins::InitBuiltinFunctionTable() { | 2209 void Builtins::InitBuiltinFunctionTable() { |
| 2237 BuiltinDesc* functions = builtin_function_table.functions_; | 2210 BuiltinDesc* functions = builtin_function_table.functions_; |
| 2238 functions[builtin_count].generator = NULL; | 2211 functions[builtin_count].generator = NULL; |
| 2239 functions[builtin_count].c_code = NULL; | 2212 functions[builtin_count].c_code = NULL; |
| 2240 functions[builtin_count].s_name = NULL; | 2213 functions[builtin_count].s_name = NULL; |
| 2241 functions[builtin_count].name = builtin_count; | 2214 functions[builtin_count].name = builtin_count; |
| 2242 functions[builtin_count].flags = static_cast<Code::Flags>(0); | 2215 functions[builtin_count].flags = static_cast<Code::Flags>(0); |
| 2243 functions[builtin_count].extra_args = NO_EXTRA_ARGUMENTS; | 2216 functions[builtin_count].extra_args = BuiltinExtraArguments::kNone; |
| 2244 | 2217 |
| 2245 #define DEF_FUNCTION_PTR_C(aname, aextra_args) \ | 2218 #define DEF_FUNCTION_PTR_C(aname, aextra_args) \ |
| 2246 functions->generator = FUNCTION_ADDR(Generate_Adaptor); \ | 2219 functions->generator = FUNCTION_ADDR(Generate_Adaptor); \ |
| 2247 functions->c_code = FUNCTION_ADDR(Builtin_##aname); \ | 2220 functions->c_code = FUNCTION_ADDR(Builtin_##aname); \ |
| 2248 functions->s_name = #aname; \ | 2221 functions->s_name = #aname; \ |
| 2249 functions->name = c_##aname; \ | 2222 functions->name = c_##aname; \ |
| 2250 functions->flags = Code::ComputeFlags(Code::BUILTIN); \ | 2223 functions->flags = Code::ComputeFlags(Code::BUILTIN); \ |
| 2251 functions->extra_args = aextra_args; \ | 2224 functions->extra_args = BuiltinExtraArguments::aextra_args; \ |
| 2252 ++functions; | 2225 ++functions; |
| 2253 | 2226 |
| 2254 #define DEF_FUNCTION_PTR_A(aname, kind, state, extra) \ | 2227 #define DEF_FUNCTION_PTR_A(aname, kind, state, extra) \ |
| 2255 functions->generator = FUNCTION_ADDR(Generate_##aname); \ | 2228 functions->generator = FUNCTION_ADDR(Generate_##aname); \ |
| 2256 functions->c_code = NULL; \ | 2229 functions->c_code = NULL; \ |
| 2257 functions->s_name = #aname; \ | 2230 functions->s_name = #aname; \ |
| 2258 functions->name = k##aname; \ | 2231 functions->name = k##aname; \ |
| 2259 functions->flags = Code::ComputeFlags(Code::kind, \ | 2232 functions->flags = Code::ComputeFlags(Code::kind, state, extra); \ |
| 2260 state, \ | 2233 functions->extra_args = BuiltinExtraArguments::kNone; \ |
| 2261 extra); \ | 2234 ++functions; |
| 2262 functions->extra_args = NO_EXTRA_ARGUMENTS; \ | |
| 2263 ++functions; | |
| 2264 | 2235 |
| 2265 #define DEF_FUNCTION_PTR_H(aname, kind) \ | 2236 #define DEF_FUNCTION_PTR_H(aname, kind) \ |
| 2266 functions->generator = FUNCTION_ADDR(Generate_##aname); \ | 2237 functions->generator = FUNCTION_ADDR(Generate_##aname); \ |
| 2267 functions->c_code = NULL; \ | 2238 functions->c_code = NULL; \ |
| 2268 functions->s_name = #aname; \ | 2239 functions->s_name = #aname; \ |
| 2269 functions->name = k##aname; \ | 2240 functions->name = k##aname; \ |
| 2270 functions->flags = Code::ComputeHandlerFlags(Code::kind); \ | 2241 functions->flags = Code::ComputeHandlerFlags(Code::kind); \ |
| 2271 functions->extra_args = NO_EXTRA_ARGUMENTS; \ | 2242 functions->extra_args = BuiltinExtraArguments::kNone; \ |
| 2272 ++functions; | 2243 ++functions; |
| 2273 | 2244 |
| 2274 BUILTIN_LIST_C(DEF_FUNCTION_PTR_C) | 2245 BUILTIN_LIST_C(DEF_FUNCTION_PTR_C) |
| 2275 BUILTIN_LIST_A(DEF_FUNCTION_PTR_A) | 2246 BUILTIN_LIST_A(DEF_FUNCTION_PTR_A) |
| 2276 BUILTIN_LIST_H(DEF_FUNCTION_PTR_H) | 2247 BUILTIN_LIST_H(DEF_FUNCTION_PTR_H) |
| 2277 BUILTIN_LIST_DEBUG_A(DEF_FUNCTION_PTR_A) | 2248 BUILTIN_LIST_DEBUG_A(DEF_FUNCTION_PTR_A) |
| 2278 | 2249 |
| 2279 #undef DEF_FUNCTION_PTR_C | 2250 #undef DEF_FUNCTION_PTR_C |
| 2280 #undef DEF_FUNCTION_PTR_A | 2251 #undef DEF_FUNCTION_PTR_A |
| 2281 } | 2252 } |
| 2282 | 2253 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2404 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) | 2375 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) |
| 2405 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) | 2376 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) |
| 2406 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) | 2377 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) |
| 2407 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) | 2378 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |
| 2408 #undef DEFINE_BUILTIN_ACCESSOR_C | 2379 #undef DEFINE_BUILTIN_ACCESSOR_C |
| 2409 #undef DEFINE_BUILTIN_ACCESSOR_A | 2380 #undef DEFINE_BUILTIN_ACCESSOR_A |
| 2410 | 2381 |
| 2411 | 2382 |
| 2412 } // namespace internal | 2383 } // namespace internal |
| 2413 } // namespace v8 | 2384 } // namespace v8 |
| OLD | NEW |