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-arguments.h" | 8 #include "src/api-arguments.h" |
9 #include "src/api-natives.h" | 9 #include "src/api-natives.h" |
10 #include "src/base/once.h" | 10 #include "src/base/once.h" |
(...skipping 4344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4355 private: | 4355 private: |
4356 DISALLOW_COPY_AND_ASSIGN(RelocatableArguments); | 4356 DISALLOW_COPY_AND_ASSIGN(RelocatableArguments); |
4357 }; | 4357 }; |
4358 | 4358 |
4359 } // namespace | 4359 } // namespace |
4360 | 4360 |
4361 MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function, | 4361 MaybeHandle<Object> Builtins::InvokeApiFunction(Handle<HeapObject> function, |
4362 Handle<Object> receiver, | 4362 Handle<Object> receiver, |
4363 int argc, | 4363 int argc, |
4364 Handle<Object> args[]) { | 4364 Handle<Object> args[]) { |
| 4365 Isolate* isolate = function->GetIsolate(); |
| 4366 // Do proper receiver conversion for non-strict mode api functions. |
| 4367 if (!receiver->IsJSReceiver()) { |
| 4368 DCHECK(function->IsFunctionTemplateInfo() || function->IsJSFunction()); |
| 4369 if (function->IsFunctionTemplateInfo() || |
| 4370 is_sloppy(JSFunction::cast(*function)->shared()->language_mode())) { |
| 4371 if (receiver->IsUndefined() || receiver->IsNull()) { |
| 4372 receiver = handle(isolate->global_proxy(), isolate); |
| 4373 } else { |
| 4374 ASSIGN_RETURN_ON_EXCEPTION(isolate, receiver, |
| 4375 Object::ToObject(isolate, receiver), Object); |
| 4376 } |
| 4377 } |
| 4378 } |
4365 // Construct BuiltinArguments object: function, arguments reversed, receiver. | 4379 // Construct BuiltinArguments object: function, arguments reversed, receiver. |
4366 const int kBufferSize = 32; | 4380 const int kBufferSize = 32; |
4367 Object* small_argv[kBufferSize]; | 4381 Object* small_argv[kBufferSize]; |
4368 Object** argv; | 4382 Object** argv; |
4369 if (argc + 2 <= kBufferSize) { | 4383 if (argc + 2 <= kBufferSize) { |
4370 argv = small_argv; | 4384 argv = small_argv; |
4371 } else { | 4385 } else { |
4372 argv = new Object* [argc + 2]; | 4386 argv = new Object* [argc + 2]; |
4373 } | 4387 } |
4374 argv[argc + 1] = *receiver; | 4388 argv[argc + 1] = *receiver; |
4375 for (int i = 0; i < argc; ++i) { | 4389 for (int i = 0; i < argc; ++i) { |
4376 argv[argc - i] = *args[i]; | 4390 argv[argc - i] = *args[i]; |
4377 } | 4391 } |
4378 argv[0] = *function; | 4392 argv[0] = *function; |
4379 MaybeHandle<Object> result; | 4393 MaybeHandle<Object> result; |
4380 { | 4394 { |
4381 auto isolate = function->GetIsolate(); | |
4382 RelocatableArguments arguments(isolate, argc + 2, &argv[argc + 1]); | 4395 RelocatableArguments arguments(isolate, argc + 2, &argv[argc + 1]); |
4383 result = HandleApiCallHelper<false>(isolate, arguments); | 4396 result = HandleApiCallHelper<false>(isolate, arguments); |
4384 } | 4397 } |
4385 if (argv != small_argv) { | 4398 if (argv != small_argv) { |
4386 delete[] argv; | 4399 delete[] argv; |
4387 } | 4400 } |
4388 return result; | 4401 return result; |
4389 } | 4402 } |
4390 | 4403 |
4391 | 4404 |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4841 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) | 4854 BUILTIN_LIST_T(DEFINE_BUILTIN_ACCESSOR_T) |
4842 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) | 4855 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) |
4843 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) | 4856 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |
4844 #undef DEFINE_BUILTIN_ACCESSOR_C | 4857 #undef DEFINE_BUILTIN_ACCESSOR_C |
4845 #undef DEFINE_BUILTIN_ACCESSOR_A | 4858 #undef DEFINE_BUILTIN_ACCESSOR_A |
4846 #undef DEFINE_BUILTIN_ACCESSOR_T | 4859 #undef DEFINE_BUILTIN_ACCESSOR_T |
4847 #undef DEFINE_BUILTIN_ACCESSOR_H | 4860 #undef DEFINE_BUILTIN_ACCESSOR_H |
4848 | 4861 |
4849 } // namespace internal | 4862 } // namespace internal |
4850 } // namespace v8 | 4863 } // namespace v8 |
OLD | NEW |