Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(136)

Side by Side Diff: src/builtins.cc

Issue 2074063002: [builtins] Always pass target and new target to C++ builtins (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/builtins.h ('k') | src/counters.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/ieee754.h" 10 #include "src/base/ieee754.h"
(...skipping 16 matching lines...) Expand all
27 #include "src/string-builder.h" 27 #include "src/string-builder.h"
28 #include "src/uri.h" 28 #include "src/uri.h"
29 #include "src/vm-state-inl.h" 29 #include "src/vm-state-inl.h"
30 30
31 namespace v8 { 31 namespace v8 {
32 namespace internal { 32 namespace internal {
33 33
34 namespace { 34 namespace {
35 35
36 // Arguments object passed to C++ builtins. 36 // Arguments object passed to C++ builtins.
37 template <BuiltinExtraArguments extra_args>
38 class BuiltinArguments : public Arguments { 37 class BuiltinArguments : public Arguments {
39 public: 38 public:
40 BuiltinArguments(int length, Object** arguments) 39 BuiltinArguments(int length, Object** arguments)
41 : Arguments(length, arguments) { 40 : Arguments(length, arguments) {
42 // Check we have at least the receiver. 41 // Check we have at least the receiver.
43 DCHECK_LE(1, this->length()); 42 DCHECK_LE(1, this->length());
44 } 43 }
45 44
46 Object*& operator[] (int index) { 45 Object*& operator[] (int index) {
47 DCHECK_LT(index, length()); 46 DCHECK_LT(index, length());
(...skipping 10 matching lines...) Expand all
58 return isolate->factory()->undefined_value(); 57 return isolate->factory()->undefined_value();
59 } 58 }
60 return at<Object>(index); 59 return at<Object>(index);
61 } 60 }
62 61
63 Handle<Object> receiver() { 62 Handle<Object> receiver() {
64 return Arguments::at<Object>(0); 63 return Arguments::at<Object>(0);
65 } 64 }
66 65
67 template <class S> 66 template <class S>
68 Handle<S> target(); 67 Handle<S> target() {
69 Handle<HeapObject> new_target(); 68 return Arguments::at<S>(Arguments::length() - 2);
69 }
70 Handle<HeapObject> new_target() {
71 return Arguments::at<HeapObject>(Arguments::length() - 1);
72 }
70 73
71 // Gets the total number of arguments including the receiver (but 74 // Gets the total number of arguments including the receiver (but
72 // excluding extra arguments). 75 // excluding extra arguments).
73 int length() const; 76 int length() const { return Arguments::length() - 2; }
74 }; 77 };
75 78
76 79
77 // Specialize BuiltinArguments for the extra arguments.
78
79 template <>
80 int BuiltinArguments<BuiltinExtraArguments::kNone>::length() const {
81 return Arguments::length();
82 }
83
84 template <>
85 int BuiltinArguments<BuiltinExtraArguments::kTarget>::length() const {
86 return Arguments::length() - 1;
87 }
88
89 template <>
90 template <class S>
91 Handle<S> BuiltinArguments<BuiltinExtraArguments::kTarget>::target() {
92 return Arguments::at<S>(Arguments::length() - 1);
93 }
94
95 template <>
96 int BuiltinArguments<BuiltinExtraArguments::kNewTarget>::length() const {
97 return Arguments::length() - 1;
98 }
99
100 template <>
101 Handle<HeapObject>
102 BuiltinArguments<BuiltinExtraArguments::kNewTarget>::new_target() {
103 return Arguments::at<HeapObject>(Arguments::length() - 1);
104 }
105
106 template <>
107 int BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::length()
108 const {
109 return Arguments::length() - 2;
110 }
111
112 template <>
113 template <class S>
114 Handle<S>
115 BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::target() {
116 return Arguments::at<S>(Arguments::length() - 2);
117 }
118
119 template <>
120 Handle<HeapObject>
121 BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>::new_target() {
122 return Arguments::at<HeapObject>(Arguments::length() - 1);
123 }
124
125
126 #define DEF_ARG_TYPE(name, spec) \
127 typedef BuiltinArguments<BuiltinExtraArguments::spec> name##ArgumentsType;
128 BUILTIN_LIST_C(DEF_ARG_TYPE)
129 #undef DEF_ARG_TYPE
130
131
132 // ---------------------------------------------------------------------------- 80 // ----------------------------------------------------------------------------
133 // Support macro for defining builtins in C++. 81 // Support macro for defining builtins in C++.
134 // ---------------------------------------------------------------------------- 82 // ----------------------------------------------------------------------------
135 // 83 //
136 // A builtin function is defined by writing: 84 // A builtin function is defined by writing:
137 // 85 //
138 // BUILTIN(name) { 86 // BUILTIN(name) {
139 // ... 87 // ...
140 // } 88 // }
141 // 89 //
142 // In the body of the builtin function the arguments can be accessed 90 // In the body of the builtin function the arguments can be accessed
143 // through the BuiltinArguments object args. 91 // through the BuiltinArguments object args.
144 // TODO(cbruni): add global flag to check whether any tracing events have been 92 // TODO(cbruni): add global flag to check whether any tracing events have been
145 // enabled. 93 // enabled.
146 #define BUILTIN(name) \ 94 #define BUILTIN(name) \
147 MUST_USE_RESULT static Object* Builtin_Impl_##name(name##ArgumentsType args, \ 95 MUST_USE_RESULT static Object* Builtin_Impl_##name(BuiltinArguments args, \
148 Isolate* isolate); \ 96 Isolate* isolate); \
149 \ 97 \
150 V8_NOINLINE static Object* Builtin_Impl_Stats_##name( \ 98 V8_NOINLINE static Object* Builtin_Impl_Stats_##name( \
151 int args_length, Object** args_object, Isolate* isolate) { \ 99 int args_length, Object** args_object, Isolate* isolate) { \
152 name##ArgumentsType args(args_length, args_object); \ 100 BuiltinArguments args(args_length, args_object); \
153 RuntimeCallTimerScope timer(isolate, &RuntimeCallStats::Builtin_##name); \ 101 RuntimeCallTimerScope timer(isolate, &RuntimeCallStats::Builtin_##name); \
154 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), \ 102 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), \
155 "V8.Builtin_" #name); \ 103 "V8.Builtin_" #name); \
156 return Builtin_Impl_##name(args, isolate); \ 104 return Builtin_Impl_##name(args, isolate); \
157 } \ 105 } \
158 \ 106 \
159 MUST_USE_RESULT static Object* Builtin_##name( \ 107 MUST_USE_RESULT static Object* Builtin_##name( \
160 int args_length, Object** args_object, Isolate* isolate) { \ 108 int args_length, Object** args_object, Isolate* isolate) { \
161 if (FLAG_runtime_call_stats) { \ 109 if (FLAG_runtime_call_stats) { \
162 return Builtin_Impl_Stats_##name(args_length, args_object, isolate); \ 110 return Builtin_Impl_Stats_##name(args_length, args_object, isolate); \
163 } \ 111 } \
164 name##ArgumentsType args(args_length, args_object); \ 112 BuiltinArguments args(args_length, args_object); \
165 return Builtin_Impl_##name(args, isolate); \ 113 return Builtin_Impl_##name(args, isolate); \
166 } \ 114 } \
167 \ 115 \
168 MUST_USE_RESULT static Object* Builtin_Impl_##name(name##ArgumentsType args, \ 116 MUST_USE_RESULT static Object* Builtin_Impl_##name(BuiltinArguments args, \
169 Isolate* isolate) 117 Isolate* isolate)
170 118
171 // ---------------------------------------------------------------------------- 119 // ----------------------------------------------------------------------------
172 120
173 #define CHECK_RECEIVER(Type, name, method) \ 121 #define CHECK_RECEIVER(Type, name, method) \
174 if (!args.receiver()->Is##Type()) { \ 122 if (!args.receiver()->Is##Type()) { \
175 THROW_NEW_ERROR_RETURN_FAILURE( \ 123 THROW_NEW_ERROR_RETURN_FAILURE( \
176 isolate, \ 124 isolate, \
177 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, \ 125 NewTypeError(MessageTemplate::kIncompatibleMethodReceiver, \
178 isolate->factory()->NewStringFromAsciiChecked(method), \ 126 isolate->factory()->NewStringFromAsciiChecked(method), \
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 JSObject* current = iter.GetCurrent<JSObject>(); 227 JSObject* current = iter.GetCurrent<JSObject>();
280 if (!HasSimpleElements(current)) return false; 228 if (!HasSimpleElements(current)) return false;
281 } 229 }
282 return true; 230 return true;
283 } 231 }
284 232
285 // Returns |false| if not applicable. 233 // Returns |false| if not applicable.
286 MUST_USE_RESULT 234 MUST_USE_RESULT
287 inline bool EnsureJSArrayWithWritableFastElements(Isolate* isolate, 235 inline bool EnsureJSArrayWithWritableFastElements(Isolate* isolate,
288 Handle<Object> receiver, 236 Handle<Object> receiver,
289 Arguments* args, 237 BuiltinArguments* args,
290 int first_added_arg) { 238 int first_added_arg) {
291 if (!receiver->IsJSArray()) return false; 239 if (!receiver->IsJSArray()) return false;
292 Handle<JSArray> array = Handle<JSArray>::cast(receiver); 240 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
293 ElementsKind origin_kind = array->GetElementsKind(); 241 ElementsKind origin_kind = array->GetElementsKind();
294 if (IsDictionaryElementsKind(origin_kind)) return false; 242 if (IsDictionaryElementsKind(origin_kind)) return false;
295 if (!array->map()->is_extensible()) return false; 243 if (!array->map()->is_extensible()) return false;
296 if (args == nullptr) return true; 244 if (args == nullptr) return true;
297 245
298 // If there may be elements accessors in the prototype chain, the fast path 246 // If there may be elements accessors in the prototype chain, the fast path
299 // cannot be used if there arguments to add to the array. 247 // cannot be used if there arguments to add to the array.
(...skipping 26 matching lines...) Expand all
326 } 274 }
327 if (target_kind != origin_kind) { 275 if (target_kind != origin_kind) {
328 // Use a short-lived HandleScope to avoid creating several copies of the 276 // Use a short-lived HandleScope to avoid creating several copies of the
329 // elements handle which would cause issues when left-trimming later-on. 277 // elements handle which would cause issues when left-trimming later-on.
330 HandleScope scope(isolate); 278 HandleScope scope(isolate);
331 JSObject::TransitionElementsKind(array, target_kind); 279 JSObject::TransitionElementsKind(array, target_kind);
332 } 280 }
333 return true; 281 return true;
334 } 282 }
335 283
336 284 MUST_USE_RESULT static Object* CallJsIntrinsic(Isolate* isolate,
337 MUST_USE_RESULT static Object* CallJsIntrinsic( 285 Handle<JSFunction> function,
338 Isolate* isolate, Handle<JSFunction> function, 286 BuiltinArguments args) {
339 BuiltinArguments<BuiltinExtraArguments::kNone> args) {
340 HandleScope handleScope(isolate); 287 HandleScope handleScope(isolate);
341 int argc = args.length() - 1; 288 int argc = args.length() - 1;
342 ScopedVector<Handle<Object> > argv(argc); 289 ScopedVector<Handle<Object> > argv(argc);
343 for (int i = 0; i < argc; ++i) { 290 for (int i = 0; i < argc; ++i) {
344 argv[i] = args.at<Object>(i + 1); 291 argv[i] = args.at<Object>(i + 1);
345 } 292 }
346 RETURN_RESULT_OR_FAILURE( 293 RETURN_RESULT_OR_FAILURE(
347 isolate, 294 isolate,
348 Execution::Call(isolate, function, args.receiver(), argc, argv.start())); 295 Execution::Call(isolate, function, args.receiver(), argc, argv.start()));
349 } 296 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 assembler->Bind(&return_false); 381 assembler->Bind(&return_false);
435 assembler->Return(assembler->BooleanConstant(false)); 382 assembler->Return(assembler->BooleanConstant(false));
436 383
437 assembler->Bind(&call_runtime); 384 assembler->Bind(&call_runtime);
438 assembler->Return(assembler->CallRuntime(Runtime::kObjectHasOwnProperty, 385 assembler->Return(assembler->CallRuntime(Runtime::kObjectHasOwnProperty,
439 context, object, key)); 386 context, object, key));
440 } 387 }
441 388
442 namespace { 389 namespace {
443 390
444 Object* DoArrayPush(Isolate* isolate, 391 Object* DoArrayPush(Isolate* isolate, BuiltinArguments args) {
445 BuiltinArguments<BuiltinExtraArguments::kNone> args) {
446 HandleScope scope(isolate); 392 HandleScope scope(isolate);
447 Handle<Object> receiver = args.receiver(); 393 Handle<Object> receiver = args.receiver();
448 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1)) { 394 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, &args, 1)) {
449 return CallJsIntrinsic(isolate, isolate->array_push(), args); 395 return CallJsIntrinsic(isolate, isolate->array_push(), args);
450 } 396 }
451 // Fast Elements Path 397 // Fast Elements Path
452 int to_add = args.length() - 1; 398 int to_add = args.length() - 1;
453 Handle<JSArray> array = Handle<JSArray>::cast(receiver); 399 Handle<JSArray> array = Handle<JSArray>::cast(receiver);
454 int len = Smi::cast(array->length())->value(); 400 int len = Smi::cast(array->length())->value();
455 if (to_add == 0) return Smi::FromInt(len); 401 if (to_add == 0) return Smi::FromInt(len);
(...skipping 13 matching lines...) Expand all
469 } // namespace 415 } // namespace
470 416
471 BUILTIN(ArrayPush) { return DoArrayPush(isolate, args); } 417 BUILTIN(ArrayPush) { return DoArrayPush(isolate, args); }
472 418
473 // TODO(verwaest): This is a temporary helper until the FastArrayPush stub can 419 // TODO(verwaest): This is a temporary helper until the FastArrayPush stub can
474 // tailcall to the builtin directly. 420 // tailcall to the builtin directly.
475 RUNTIME_FUNCTION(Runtime_ArrayPush) { 421 RUNTIME_FUNCTION(Runtime_ArrayPush) {
476 DCHECK_EQ(2, args.length()); 422 DCHECK_EQ(2, args.length());
477 Arguments* incoming = reinterpret_cast<Arguments*>(args[0]); 423 Arguments* incoming = reinterpret_cast<Arguments*>(args[0]);
478 // Rewrap the arguments as builtins arguments. 424 // Rewrap the arguments as builtins arguments.
479 BuiltinArguments<BuiltinExtraArguments::kNone> caller_args( 425 BuiltinArguments caller_args(incoming->length() + 3,
480 incoming->length() + 1, incoming->arguments() + 1); 426 incoming->arguments() + 1);
481 return DoArrayPush(isolate, caller_args); 427 return DoArrayPush(isolate, caller_args);
482 } 428 }
483 429
484 BUILTIN(ArrayPop) { 430 BUILTIN(ArrayPop) {
485 HandleScope scope(isolate); 431 HandleScope scope(isolate);
486 Handle<Object> receiver = args.receiver(); 432 Handle<Object> receiver = args.receiver();
487 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, nullptr, 0)) { 433 if (!EnsureJSArrayWithWritableFastElements(isolate, receiver, nullptr, 0)) {
488 return CallJsIntrinsic(isolate, isolate->array_pop(), args); 434 return CallJsIntrinsic(isolate, isolate->array_pop(), args);
489 } 435 }
490 436
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1234 Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol()); 1180 Handle<Symbol> key(isolate->factory()->is_concat_spreadable_symbol());
1235 Handle<Object> value; 1181 Handle<Object> value;
1236 MaybeHandle<Object> maybeValue = 1182 MaybeHandle<Object> maybeValue =
1237 i::Runtime::GetObjectProperty(isolate, obj, key); 1183 i::Runtime::GetObjectProperty(isolate, obj, key);
1238 if (!maybeValue.ToHandle(&value)) return Nothing<bool>(); 1184 if (!maybeValue.ToHandle(&value)) return Nothing<bool>();
1239 if (!value->IsUndefined(isolate)) return Just(value->BooleanValue()); 1185 if (!value->IsUndefined(isolate)) return Just(value->BooleanValue());
1240 } 1186 }
1241 return Object::IsArray(obj); 1187 return Object::IsArray(obj);
1242 } 1188 }
1243 1189
1244 1190 Object* Slow_ArrayConcat(BuiltinArguments* args, Handle<Object> species,
1245 Object* Slow_ArrayConcat(Arguments* args, Handle<Object> species,
1246 Isolate* isolate) { 1191 Isolate* isolate) {
1247 int argument_count = args->length(); 1192 int argument_count = args->length();
1248 1193
1249 bool is_array_species = *species == isolate->context()->array_function(); 1194 bool is_array_species = *species == isolate->context()->array_function();
1250 1195
1251 // Pass 1: estimate the length and number of elements of the result. 1196 // Pass 1: estimate the length and number of elements of the result.
1252 // The actual length can be larger if any of the arguments have getters 1197 // The actual length can be larger if any of the arguments have getters
1253 // that mutate other arguments (but will otherwise be precise). 1198 // that mutate other arguments (but will otherwise be precise).
1254 // The number of elements is precise if there are no inherited elements. 1199 // The number of elements is precise if there are no inherited elements.
1255 1200
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1432 if (map->prototype() == 1377 if (map->prototype() ==
1433 isolate->native_context()->initial_array_prototype() && 1378 isolate->native_context()->initial_array_prototype() &&
1434 map->NumberOfOwnDescriptors() == 1) { 1379 map->NumberOfOwnDescriptors() == 1) {
1435 return true; 1380 return true;
1436 } 1381 }
1437 // TODO(cbruni): slower lookup for array subclasses and support slow 1382 // TODO(cbruni): slower lookup for array subclasses and support slow
1438 // @@IsConcatSpreadable lookup. 1383 // @@IsConcatSpreadable lookup.
1439 return false; 1384 return false;
1440 } 1385 }
1441 1386
1442 MaybeHandle<JSArray> Fast_ArrayConcat(Isolate* isolate, Arguments* args) { 1387 MaybeHandle<JSArray> Fast_ArrayConcat(Isolate* isolate,
1388 BuiltinArguments* args) {
1443 if (!isolate->IsIsConcatSpreadableLookupChainIntact()) { 1389 if (!isolate->IsIsConcatSpreadableLookupChainIntact()) {
1444 return MaybeHandle<JSArray>(); 1390 return MaybeHandle<JSArray>();
1445 } 1391 }
1446 // We shouldn't overflow when adding another len. 1392 // We shouldn't overflow when adding another len.
1447 const int kHalfOfMaxInt = 1 << (kBitsPerInt - 2); 1393 const int kHalfOfMaxInt = 1 << (kBitsPerInt - 2);
1448 STATIC_ASSERT(FixedArray::kMaxLength < kHalfOfMaxInt); 1394 STATIC_ASSERT(FixedArray::kMaxLength < kHalfOfMaxInt);
1449 STATIC_ASSERT(FixedDoubleArray::kMaxLength < kHalfOfMaxInt); 1395 STATIC_ASSERT(FixedDoubleArray::kMaxLength < kHalfOfMaxInt);
1450 USE(kHalfOfMaxInt); 1396 USE(kHalfOfMaxInt);
1451 1397
1452 int n_arguments = args->length(); 1398 int n_arguments = args->length();
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
1897 JSReceiver::GetOwnPropertyDescriptor(isolate, receiver, key, &desc); 1843 JSReceiver::GetOwnPropertyDescriptor(isolate, receiver, key, &desc);
1898 MAYBE_RETURN(found, isolate->heap()->exception()); 1844 MAYBE_RETURN(found, isolate->heap()->exception());
1899 // 4. Return FromPropertyDescriptor(desc). 1845 // 4. Return FromPropertyDescriptor(desc).
1900 if (!found.FromJust()) return isolate->heap()->undefined_value(); 1846 if (!found.FromJust()) return isolate->heap()->undefined_value();
1901 return *desc.ToObject(isolate); 1847 return *desc.ToObject(isolate);
1902 } 1848 }
1903 1849
1904 1850
1905 namespace { 1851 namespace {
1906 1852
1907 Object* GetOwnPropertyKeys(Isolate* isolate, 1853 Object* GetOwnPropertyKeys(Isolate* isolate, BuiltinArguments args,
1908 BuiltinArguments<BuiltinExtraArguments::kNone> args,
1909 PropertyFilter filter) { 1854 PropertyFilter filter) {
1910 HandleScope scope(isolate); 1855 HandleScope scope(isolate);
1911 Handle<Object> object = args.atOrUndefined(isolate, 1); 1856 Handle<Object> object = args.atOrUndefined(isolate, 1);
1912 Handle<JSReceiver> receiver; 1857 Handle<JSReceiver> receiver;
1913 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver, 1858 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
1914 Object::ToObject(isolate, object)); 1859 Object::ToObject(isolate, object));
1915 Handle<FixedArray> keys; 1860 Handle<FixedArray> keys;
1916 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 1861 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1917 isolate, keys, 1862 isolate, keys,
1918 KeyAccumulator::GetKeys(receiver, KeyCollectionMode::kOwnOnly, filter, 1863 KeyAccumulator::GetKeys(receiver, KeyCollectionMode::kOwnOnly, filter,
(...skipping 2363 matching lines...) Expand 10 before | Expand all | Expand 10 after
4282 4227
4283 // static 4228 // static
4284 void Builtins::Generate_DatePrototypeGetUTCSeconds(MacroAssembler* masm) { 4229 void Builtins::Generate_DatePrototypeGetUTCSeconds(MacroAssembler* masm) {
4285 Generate_DatePrototype_GetField(masm, JSDate::kSecondUTC); 4230 Generate_DatePrototype_GetField(masm, JSDate::kSecondUTC);
4286 } 4231 }
4287 4232
4288 4233
4289 namespace { 4234 namespace {
4290 4235
4291 // ES6 section 19.2.1.1.1 CreateDynamicFunction 4236 // ES6 section 19.2.1.1.1 CreateDynamicFunction
4292 MaybeHandle<JSFunction> CreateDynamicFunction( 4237 MaybeHandle<JSFunction> CreateDynamicFunction(Isolate* isolate,
4293 Isolate* isolate, 4238 BuiltinArguments args,
4294 BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget> args, 4239 const char* token) {
4295 const char* token) {
4296 // Compute number of arguments, ignoring the receiver. 4240 // Compute number of arguments, ignoring the receiver.
4297 DCHECK_LE(1, args.length()); 4241 DCHECK_LE(1, args.length());
4298 int const argc = args.length() - 1; 4242 int const argc = args.length() - 1;
4299 4243
4300 // Build the source string. 4244 // Build the source string.
4301 Handle<String> source; 4245 Handle<String> source;
4302 { 4246 {
4303 IncrementalStringBuilder builder(isolate); 4247 IncrementalStringBuilder builder(isolate);
4304 builder.AppendCharacter('('); 4248 builder.AppendCharacter('(');
4305 builder.AppendCString(token); 4249 builder.AppendCString(token);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
4405 BUILTIN(FunctionConstructor) { 4349 BUILTIN(FunctionConstructor) {
4406 HandleScope scope(isolate); 4350 HandleScope scope(isolate);
4407 Handle<JSFunction> result; 4351 Handle<JSFunction> result;
4408 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 4352 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
4409 isolate, result, CreateDynamicFunction(isolate, args, "function")); 4353 isolate, result, CreateDynamicFunction(isolate, args, "function"));
4410 return *result; 4354 return *result;
4411 } 4355 }
4412 4356
4413 namespace { 4357 namespace {
4414 4358
4415 Object* DoFunctionBind(Isolate* isolate, 4359 Object* DoFunctionBind(Isolate* isolate, BuiltinArguments args) {
4416 BuiltinArguments<BuiltinExtraArguments::kNone> args) {
4417 HandleScope scope(isolate); 4360 HandleScope scope(isolate);
4418 DCHECK_LE(1, args.length()); 4361 DCHECK_LE(1, args.length());
4419 if (!args.receiver()->IsCallable()) { 4362 if (!args.receiver()->IsCallable()) {
4420 THROW_NEW_ERROR_RETURN_FAILURE( 4363 THROW_NEW_ERROR_RETURN_FAILURE(
4421 isolate, NewTypeError(MessageTemplate::kFunctionBind)); 4364 isolate, NewTypeError(MessageTemplate::kFunctionBind));
4422 } 4365 }
4423 4366
4424 // Allocate the bound function with the given {this_arg} and {args}. 4367 // Allocate the bound function with the given {this_arg} and {args}.
4425 Handle<JSReceiver> target = args.at<JSReceiver>(0); 4368 Handle<JSReceiver> target = args.at<JSReceiver>(0);
4426 Handle<Object> this_arg = isolate->factory()->undefined_value(); 4369 Handle<Object> this_arg = isolate->factory()->undefined_value();
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
4501 4444
4502 // ES6 section 19.2.3.2 Function.prototype.bind ( thisArg, ...args ) 4445 // ES6 section 19.2.3.2 Function.prototype.bind ( thisArg, ...args )
4503 BUILTIN(FunctionPrototypeBind) { return DoFunctionBind(isolate, args); } 4446 BUILTIN(FunctionPrototypeBind) { return DoFunctionBind(isolate, args); }
4504 4447
4505 // TODO(verwaest): This is a temporary helper until the FastFunctionBind stub 4448 // TODO(verwaest): This is a temporary helper until the FastFunctionBind stub
4506 // can tailcall to the builtin directly. 4449 // can tailcall to the builtin directly.
4507 RUNTIME_FUNCTION(Runtime_FunctionBind) { 4450 RUNTIME_FUNCTION(Runtime_FunctionBind) {
4508 DCHECK_EQ(2, args.length()); 4451 DCHECK_EQ(2, args.length());
4509 Arguments* incoming = reinterpret_cast<Arguments*>(args[0]); 4452 Arguments* incoming = reinterpret_cast<Arguments*>(args[0]);
4510 // Rewrap the arguments as builtins arguments. 4453 // Rewrap the arguments as builtins arguments.
4511 BuiltinArguments<BuiltinExtraArguments::kNone> caller_args( 4454 BuiltinArguments caller_args(incoming->length() + 3,
4512 incoming->length() + 1, incoming->arguments() + 1); 4455 incoming->arguments() + 1);
4513 return DoFunctionBind(isolate, caller_args); 4456 return DoFunctionBind(isolate, caller_args);
4514 } 4457 }
4515 4458
4516 // ES6 section 19.2.3.5 Function.prototype.toString ( ) 4459 // ES6 section 19.2.3.5 Function.prototype.toString ( )
4517 BUILTIN(FunctionPrototypeToString) { 4460 BUILTIN(FunctionPrototypeToString) {
4518 HandleScope scope(isolate); 4461 HandleScope scope(isolate);
4519 Handle<Object> receiver = args.receiver(); 4462 Handle<Object> receiver = args.receiver();
4520 if (receiver->IsJSBoundFunction()) { 4463 if (receiver->IsJSBoundFunction()) {
4521 return *JSBoundFunction::ToString(Handle<JSBoundFunction>::cast(receiver)); 4464 return *JSBoundFunction::ToString(Handle<JSBoundFunction>::cast(receiver));
4522 } else if (receiver->IsJSFunction()) { 4465 } else if (receiver->IsJSFunction()) {
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
5079 isolate, NewTypeError(MessageTemplate::kStrictPoisonPill)); 5022 isolate, NewTypeError(MessageTemplate::kStrictPoisonPill));
5080 } 5023 }
5081 5024
5082 5025
5083 // ----------------------------------------------------------------------------- 5026 // -----------------------------------------------------------------------------
5084 // 5027 //
5085 5028
5086 5029
5087 namespace { 5030 namespace {
5088 5031
5089 MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper( 5032 MUST_USE_RESULT MaybeHandle<Object> HandleApiCallHelper(Isolate* isolate,
5090 Isolate* isolate, 5033 BuiltinArguments args) {
5091 BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget> args) {
5092 HandleScope scope(isolate); 5034 HandleScope scope(isolate);
5093 Handle<HeapObject> function = args.target<HeapObject>(); 5035 Handle<HeapObject> function = args.target<HeapObject>();
5094 Handle<HeapObject> new_target = args.new_target(); 5036 Handle<HeapObject> new_target = args.new_target();
5095 bool is_construct = !new_target->IsUndefined(isolate); 5037 bool is_construct = !new_target->IsUndefined(isolate);
5096 Handle<JSReceiver> receiver; 5038 Handle<JSReceiver> receiver;
5097 5039
5098 DCHECK(function->IsFunctionTemplateInfo() || 5040 DCHECK(function->IsFunctionTemplateInfo() ||
5099 Handle<JSFunction>::cast(function)->shared()->IsApiFunction()); 5041 Handle<JSFunction>::cast(function)->shared()->IsApiFunction());
5100 5042
5101 Handle<FunctionTemplateInfo> fun_data = 5043 Handle<FunctionTemplateInfo> fun_data =
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
5252 return InterpreterPushArgsAndCall(); 5194 return InterpreterPushArgsAndCall();
5253 case TailCallMode::kAllow: 5195 case TailCallMode::kAllow:
5254 return InterpreterPushArgsAndTailCall(); 5196 return InterpreterPushArgsAndTailCall();
5255 } 5197 }
5256 UNREACHABLE(); 5198 UNREACHABLE();
5257 return Handle<Code>::null(); 5199 return Handle<Code>::null();
5258 } 5200 }
5259 5201
5260 namespace { 5202 namespace {
5261 5203
5262 class RelocatableArguments 5204 class RelocatableArguments : public BuiltinArguments, public Relocatable {
5263 : public BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>,
5264 public Relocatable {
5265 public: 5205 public:
5266 RelocatableArguments(Isolate* isolate, int length, Object** arguments) 5206 RelocatableArguments(Isolate* isolate, int length, Object** arguments)
5267 : BuiltinArguments<BuiltinExtraArguments::kTargetAndNewTarget>(length, 5207 : BuiltinArguments(length, arguments), Relocatable(isolate) {}
5268 arguments),
5269 Relocatable(isolate) {}
5270 5208
5271 virtual inline void IterateInstance(ObjectVisitor* v) { 5209 virtual inline void IterateInstance(ObjectVisitor* v) {
5272 if (length() == 0) return; 5210 if (length() == 0) return;
5273 v->VisitPointers(lowest_address(), highest_address() + 1); 5211 v->VisitPointers(lowest_address(), highest_address() + 1);
5274 } 5212 }
5275 5213
5276 private: 5214 private:
5277 DISALLOW_COPY_AND_ASSIGN(RelocatableArguments); 5215 DISALLOW_COPY_AND_ASSIGN(RelocatableArguments);
5278 }; 5216 };
5279 5217
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
5319 delete[] argv; 5257 delete[] argv;
5320 } 5258 }
5321 return result; 5259 return result;
5322 } 5260 }
5323 5261
5324 5262
5325 // Helper function to handle calls to non-function objects created through the 5263 // Helper function to handle calls to non-function objects created through the
5326 // API. The object can be called as either a constructor (using new) or just as 5264 // API. The object can be called as either a constructor (using new) or just as
5327 // a function (without new). 5265 // a function (without new).
5328 MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor( 5266 MUST_USE_RESULT static Object* HandleApiCallAsFunctionOrConstructor(
5329 Isolate* isolate, bool is_construct_call, 5267 Isolate* isolate, bool is_construct_call, BuiltinArguments args) {
5330 BuiltinArguments<BuiltinExtraArguments::kNone> args) {
5331 Handle<Object> receiver = args.receiver(); 5268 Handle<Object> receiver = args.receiver();
5332 5269
5333 // Get the object called. 5270 // Get the object called.
5334 JSObject* obj = JSObject::cast(*receiver); 5271 JSObject* obj = JSObject::cast(*receiver);
5335 5272
5336 // Set the new target. 5273 // Set the new target.
5337 HeapObject* new_target; 5274 HeapObject* new_target;
5338 if (is_construct_call) { 5275 if (is_construct_call) {
5339 // TODO(adamk): This should be passed through in args instead of 5276 // TODO(adamk): This should be passed through in args instead of
5340 // being patched in here. We need to set a non-undefined value 5277 // being patched in here. We need to set a non-undefined value
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
5516 5453
5517 Builtins::Builtins() : initialized_(false) { 5454 Builtins::Builtins() : initialized_(false) {
5518 memset(builtins_, 0, sizeof(builtins_[0]) * builtin_count); 5455 memset(builtins_, 0, sizeof(builtins_[0]) * builtin_count);
5519 memset(names_, 0, sizeof(names_[0]) * builtin_count); 5456 memset(names_, 0, sizeof(names_[0]) * builtin_count);
5520 } 5457 }
5521 5458
5522 5459
5523 Builtins::~Builtins() { 5460 Builtins::~Builtins() {
5524 } 5461 }
5525 5462
5526 5463 #define DEF_ENUM_C(name) FUNCTION_ADDR(Builtin_##name),
5527 #define DEF_ENUM_C(name, ignore) FUNCTION_ADDR(Builtin_##name),
5528 Address const Builtins::c_functions_[cfunction_count] = { 5464 Address const Builtins::c_functions_[cfunction_count] = {
5529 BUILTIN_LIST_C(DEF_ENUM_C) 5465 BUILTIN_LIST_C(DEF_ENUM_C)
5530 }; 5466 };
5531 #undef DEF_ENUM_C 5467 #undef DEF_ENUM_C
5532 5468
5533 5469
5534 struct BuiltinDesc { 5470 struct BuiltinDesc {
5535 Handle<Code> (*builder)(Isolate*, struct BuiltinDesc const*); 5471 Handle<Code> (*builder)(Isolate*, struct BuiltinDesc const*);
5536 byte* generator; 5472 byte* generator;
5537 byte* c_code; 5473 byte* c_code;
5538 const char* s_name; // name is only used for generating log information. 5474 const char* s_name; // name is only used for generating log information.
5539 int name; 5475 int name;
5540 Code::Flags flags; 5476 Code::Flags flags;
5541 BuiltinExtraArguments extra_args;
5542 int argc; 5477 int argc;
5543 }; 5478 };
5544 5479
5545 #define BUILTIN_FUNCTION_TABLE_INIT { V8_ONCE_INIT, {} } 5480 #define BUILTIN_FUNCTION_TABLE_INIT { V8_ONCE_INIT, {} }
5546 5481
5547 class BuiltinFunctionTable { 5482 class BuiltinFunctionTable {
5548 public: 5483 public:
5549 BuiltinDesc* functions() { 5484 BuiltinDesc* functions() {
5550 base::CallOnce(&once_, &Builtins::InitBuiltinFunctionTable); 5485 base::CallOnce(&once_, &Builtins::InitBuiltinFunctionTable);
5551 return functions_; 5486 return functions_;
(...skipping 24 matching lines...) Expand all
5576 const size_t buffer_size = 8 * KB; 5511 const size_t buffer_size = 8 * KB;
5577 #endif 5512 #endif
5578 union { 5513 union {
5579 int force_alignment; 5514 int force_alignment;
5580 byte buffer[buffer_size]; // NOLINT(runtime/arrays) 5515 byte buffer[buffer_size]; // NOLINT(runtime/arrays)
5581 } u; 5516 } u;
5582 5517
5583 MacroAssembler masm(isolate, u.buffer, sizeof(u.buffer), 5518 MacroAssembler masm(isolate, u.buffer, sizeof(u.buffer),
5584 CodeObjectRequired::kYes); 5519 CodeObjectRequired::kYes);
5585 // Generate the code/adaptor. 5520 // Generate the code/adaptor.
5586 typedef void (*Generator)(MacroAssembler*, int, BuiltinExtraArguments); 5521 typedef void (*Generator)(MacroAssembler*, int);
5587 Generator g = FUNCTION_CAST<Generator>(builtin_desc->generator); 5522 Generator g = FUNCTION_CAST<Generator>(builtin_desc->generator);
5588 // We pass all arguments to the generator, but it may not use all of 5523 // We pass all arguments to the generator, but it may not use all of
5589 // them. This works because the first arguments are on top of the 5524 // them. This works because the first arguments are on top of the
5590 // stack. 5525 // stack.
5591 DCHECK(!masm.has_frame()); 5526 DCHECK(!masm.has_frame());
5592 g(&masm, builtin_desc->name, builtin_desc->extra_args); 5527 g(&masm, builtin_desc->name);
5593 // Move the code into the object heap. 5528 // Move the code into the object heap.
5594 CodeDesc desc; 5529 CodeDesc desc;
5595 masm.GetCode(&desc); 5530 masm.GetCode(&desc);
5596 Code::Flags flags = builtin_desc->flags; 5531 Code::Flags flags = builtin_desc->flags;
5597 return isolate->factory()->NewCode(desc, flags, masm.CodeObject()); 5532 return isolate->factory()->NewCode(desc, flags, masm.CodeObject());
5598 } 5533 }
5599 5534
5600 // Builder for builtins implemented in TurboFan with JS linkage. 5535 // Builder for builtins implemented in TurboFan with JS linkage.
5601 Handle<Code> CodeStubAssemblerBuilderJS(Isolate* isolate, 5536 Handle<Code> CodeStubAssemblerBuilderJS(Isolate* isolate,
5602 BuiltinDesc const* builtin_desc) { 5537 BuiltinDesc const* builtin_desc) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5636 // within the lexical scope of Builtins:: and within a context where 5571 // within the lexical scope of Builtins:: and within a context where
5637 // Code::Flags names a non-abstract type. 5572 // Code::Flags names a non-abstract type.
5638 void Builtins::InitBuiltinFunctionTable() { 5573 void Builtins::InitBuiltinFunctionTable() {
5639 BuiltinDesc* functions = builtin_function_table.functions_; 5574 BuiltinDesc* functions = builtin_function_table.functions_;
5640 functions[builtin_count].builder = nullptr; 5575 functions[builtin_count].builder = nullptr;
5641 functions[builtin_count].generator = nullptr; 5576 functions[builtin_count].generator = nullptr;
5642 functions[builtin_count].c_code = nullptr; 5577 functions[builtin_count].c_code = nullptr;
5643 functions[builtin_count].s_name = nullptr; 5578 functions[builtin_count].s_name = nullptr;
5644 functions[builtin_count].name = builtin_count; 5579 functions[builtin_count].name = builtin_count;
5645 functions[builtin_count].flags = static_cast<Code::Flags>(0); 5580 functions[builtin_count].flags = static_cast<Code::Flags>(0);
5646 functions[builtin_count].extra_args = BuiltinExtraArguments::kNone;
5647 functions[builtin_count].argc = 0; 5581 functions[builtin_count].argc = 0;
5648 5582
5649 #define DEF_FUNCTION_PTR_C(aname, aextra_args) \ 5583 #define DEF_FUNCTION_PTR_C(aname) \
5650 functions->builder = &MacroAssemblerBuilder; \ 5584 functions->builder = &MacroAssemblerBuilder; \
5651 functions->generator = FUNCTION_ADDR(Generate_Adaptor); \ 5585 functions->generator = FUNCTION_ADDR(Generate_Adaptor); \
5652 functions->c_code = FUNCTION_ADDR(Builtin_##aname); \ 5586 functions->c_code = FUNCTION_ADDR(Builtin_##aname); \
5653 functions->s_name = #aname; \ 5587 functions->s_name = #aname; \
5654 functions->name = c_##aname; \ 5588 functions->name = c_##aname; \
5655 functions->flags = Code::ComputeFlags(Code::BUILTIN); \ 5589 functions->flags = Code::ComputeFlags(Code::BUILTIN); \
5656 functions->extra_args = BuiltinExtraArguments::aextra_args; \ 5590 functions->argc = 0; \
5657 functions->argc = 0; \
5658 ++functions; 5591 ++functions;
5659 5592
5660 #define DEF_FUNCTION_PTR_A(aname, kind, extra) \ 5593 #define DEF_FUNCTION_PTR_A(aname, kind, extra) \
5661 functions->builder = &MacroAssemblerBuilder; \ 5594 functions->builder = &MacroAssemblerBuilder; \
5662 functions->generator = FUNCTION_ADDR(Generate_##aname); \ 5595 functions->generator = FUNCTION_ADDR(Generate_##aname); \
5663 functions->c_code = NULL; \ 5596 functions->c_code = NULL; \
5664 functions->s_name = #aname; \ 5597 functions->s_name = #aname; \
5665 functions->name = k##aname; \ 5598 functions->name = k##aname; \
5666 functions->flags = Code::ComputeFlags(Code::kind, extra); \ 5599 functions->flags = Code::ComputeFlags(Code::kind, extra); \
5667 functions->extra_args = BuiltinExtraArguments::kNone; \
5668 functions->argc = 0; \ 5600 functions->argc = 0; \
5669 ++functions; 5601 ++functions;
5670 5602
5671 #define DEF_FUNCTION_PTR_T(aname, aargc) \ 5603 #define DEF_FUNCTION_PTR_T(aname, aargc) \
5672 functions->builder = &CodeStubAssemblerBuilderJS; \ 5604 functions->builder = &CodeStubAssemblerBuilderJS; \
5673 functions->generator = FUNCTION_ADDR(Generate_##aname); \ 5605 functions->generator = FUNCTION_ADDR(Generate_##aname); \
5674 functions->c_code = NULL; \ 5606 functions->c_code = NULL; \
5675 functions->s_name = #aname; \ 5607 functions->s_name = #aname; \
5676 functions->name = k##aname; \ 5608 functions->name = k##aname; \
5677 functions->flags = Code::ComputeFlags(Code::BUILTIN); \ 5609 functions->flags = Code::ComputeFlags(Code::BUILTIN); \
5678 functions->extra_args = BuiltinExtraArguments::kNone; \
5679 functions->argc = aargc; \ 5610 functions->argc = aargc; \
5680 ++functions; 5611 ++functions;
5681 5612
5682 #define DEF_FUNCTION_PTR_S(aname, kind, extra, interface_descriptor) \ 5613 #define DEF_FUNCTION_PTR_S(aname, kind, extra, interface_descriptor) \
5683 functions->builder = &CodeStubAssemblerBuilderCS; \ 5614 functions->builder = &CodeStubAssemblerBuilderCS; \
5684 functions->generator = FUNCTION_ADDR(Generate_##aname); \ 5615 functions->generator = FUNCTION_ADDR(Generate_##aname); \
5685 functions->c_code = NULL; \ 5616 functions->c_code = NULL; \
5686 functions->s_name = #aname; \ 5617 functions->s_name = #aname; \
5687 functions->name = k##aname; \ 5618 functions->name = k##aname; \
5688 functions->flags = Code::ComputeFlags(Code::kind, extra); \ 5619 functions->flags = Code::ComputeFlags(Code::kind, extra); \
5689 functions->extra_args = BuiltinExtraArguments::kNone; \
5690 functions->argc = CallDescriptors::interface_descriptor; \ 5620 functions->argc = CallDescriptors::interface_descriptor; \
5691 ++functions; 5621 ++functions;
5692 5622
5693 #define DEF_FUNCTION_PTR_H(aname, kind) \ 5623 #define DEF_FUNCTION_PTR_H(aname, kind) \
5694 functions->builder = &MacroAssemblerBuilder; \ 5624 functions->builder = &MacroAssemblerBuilder; \
5695 functions->generator = FUNCTION_ADDR(Generate_##aname); \ 5625 functions->generator = FUNCTION_ADDR(Generate_##aname); \
5696 functions->c_code = NULL; \ 5626 functions->c_code = NULL; \
5697 functions->s_name = #aname; \ 5627 functions->s_name = #aname; \
5698 functions->name = k##aname; \ 5628 functions->name = k##aname; \
5699 functions->flags = Code::ComputeHandlerFlags(Code::kind); \ 5629 functions->flags = Code::ComputeHandlerFlags(Code::kind); \
5700 functions->extra_args = BuiltinExtraArguments::kNone; \
5701 functions->argc = 0; \ 5630 functions->argc = 0; \
5702 ++functions; 5631 ++functions;
5703 5632
5704 BUILTIN_LIST_C(DEF_FUNCTION_PTR_C) 5633 BUILTIN_LIST_C(DEF_FUNCTION_PTR_C)
5705 BUILTIN_LIST_A(DEF_FUNCTION_PTR_A) 5634 BUILTIN_LIST_A(DEF_FUNCTION_PTR_A)
5706 BUILTIN_LIST_T(DEF_FUNCTION_PTR_T) 5635 BUILTIN_LIST_T(DEF_FUNCTION_PTR_T)
5707 BUILTIN_LIST_S(DEF_FUNCTION_PTR_S) 5636 BUILTIN_LIST_S(DEF_FUNCTION_PTR_S)
5708 BUILTIN_LIST_H(DEF_FUNCTION_PTR_H) 5637 BUILTIN_LIST_H(DEF_FUNCTION_PTR_H)
5709 BUILTIN_LIST_DEBUG_A(DEF_FUNCTION_PTR_A) 5638 BUILTIN_LIST_DEBUG_A(DEF_FUNCTION_PTR_A)
5710 5639
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
6024 a->Bind(&u32); 5953 a->Bind(&u32);
6025 a->AtomicStore(MachineRepresentation::kWord32, backing_store, 5954 a->AtomicStore(MachineRepresentation::kWord32, backing_store,
6026 a->WordShl(index_word, 2), value_word32); 5955 a->WordShl(index_word, 2), value_word32);
6027 a->Return(value_integer); 5956 a->Return(value_integer);
6028 5957
6029 // This shouldn't happen, we've already validated the type. 5958 // This shouldn't happen, we've already validated the type.
6030 a->Bind(&other); 5959 a->Bind(&other);
6031 a->Return(a->Int32Constant(0)); 5960 a->Return(a->Int32Constant(0));
6032 } 5961 }
6033 5962
6034 #define DEFINE_BUILTIN_ACCESSOR_C(name, ignore) \ 5963 #define DEFINE_BUILTIN_ACCESSOR_C(name) \
6035 Handle<Code> Builtins::name() { \ 5964 Handle<Code> Builtins::name() { \
6036 Code** code_address = \ 5965 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \
6037 reinterpret_cast<Code**>(builtin_address(k##name)); \ 5966 return Handle<Code>(code_address); \
6038 return Handle<Code>(code_address); \ 5967 }
6039 }
6040 #define DEFINE_BUILTIN_ACCESSOR_A(name, kind, extra) \ 5968 #define DEFINE_BUILTIN_ACCESSOR_A(name, kind, extra) \
6041 Handle<Code> Builtins::name() { \ 5969 Handle<Code> Builtins::name() { \
6042 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \ 5970 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \
6043 return Handle<Code>(code_address); \ 5971 return Handle<Code>(code_address); \
6044 } 5972 }
6045 #define DEFINE_BUILTIN_ACCESSOR_T(name, argc) \ 5973 #define DEFINE_BUILTIN_ACCESSOR_T(name, argc) \
6046 Handle<Code> Builtins::name() { \ 5974 Handle<Code> Builtins::name() { \
6047 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \ 5975 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \
6048 return Handle<Code>(code_address); \ 5976 return Handle<Code>(code_address); \
6049 } 5977 }
(...skipping 15 matching lines...) Expand all
6065 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 5993 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
6066 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 5994 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
6067 #undef DEFINE_BUILTIN_ACCESSOR_C 5995 #undef DEFINE_BUILTIN_ACCESSOR_C
6068 #undef DEFINE_BUILTIN_ACCESSOR_A 5996 #undef DEFINE_BUILTIN_ACCESSOR_A
6069 #undef DEFINE_BUILTIN_ACCESSOR_T 5997 #undef DEFINE_BUILTIN_ACCESSOR_T
6070 #undef DEFINE_BUILTIN_ACCESSOR_S 5998 #undef DEFINE_BUILTIN_ACCESSOR_S
6071 #undef DEFINE_BUILTIN_ACCESSOR_H 5999 #undef DEFINE_BUILTIN_ACCESSOR_H
6072 6000
6073 } // namespace internal 6001 } // namespace internal
6074 } // namespace v8 6002 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins.h ('k') | src/counters.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698