1bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org// Copyright 2013 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
74b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arguments.h"
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/vm-state-inl.h"
91510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
10bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgnamespace v8 {
11bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgnamespace internal {
12bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
13bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
14bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename T>
15bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgtemplate<typename V>
16bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgv8::Handle<V> CustomArguments<T>::GetReturnValue(Isolate* isolate) {
17bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  // Check the ReturnValue.
18fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  Object** handle = &this->begin()[kReturnValueOffset];
19bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  // Nothing was set, return empty handle as per previous behaviour.
20bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  if ((*handle)->IsTheHole()) return v8::Handle<V>();
21f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org  return Utils::Convert<Object, V>(Handle<Object>(handle));
22bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
23bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
24bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
25662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgv8::Handle<v8::Value> FunctionCallbackArguments::Call(FunctionCallback f) {
26bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  Isolate* isolate = this->isolate();
271510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  VMState<EXTERNAL> state(isolate);
281510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f));
29fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  FunctionCallbackInfo<v8::Value> info(begin(),
30662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org                                       argv_,
31662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org                                       argc_,
32662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org                                       is_construct_call_);
33662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  f(info);
34bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return GetReturnValue<v8::Value>(isolate);
35bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
36bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
37bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
38662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org#define WRITE_CALL_0(Function, ReturnValue)                                    \
39662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgv8::Handle<ReturnValue> PropertyCallbackArguments::Call(Function f) {          \
40bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  Isolate* isolate = this->isolate();                                          \
411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  VMState<EXTERNAL> state(isolate);                                            \
421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f));                 \
43fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  PropertyCallbackInfo<ReturnValue> info(begin());                             \
44662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  f(info);                                                                     \
45bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return GetReturnValue<ReturnValue>(isolate);                                 \
46bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
47bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
48662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
49662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org#define WRITE_CALL_1(Function, ReturnValue, Arg1)                              \
50662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgv8::Handle<ReturnValue> PropertyCallbackArguments::Call(Function f,            \
51bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                                        Arg1 arg1) {           \
52bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  Isolate* isolate = this->isolate();                                          \
531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  VMState<EXTERNAL> state(isolate);                                            \
541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f));                 \
55fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  PropertyCallbackInfo<ReturnValue> info(begin());                             \
56662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  f(arg1, info);                                                               \
57bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return GetReturnValue<ReturnValue>(isolate);                                 \
58bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
59bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
60662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
61662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org#define WRITE_CALL_2(Function, ReturnValue, Arg1, Arg2)                        \
62662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgv8::Handle<ReturnValue> PropertyCallbackArguments::Call(Function f,            \
63bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                                        Arg1 arg1,             \
64bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                                        Arg2 arg2) {           \
65bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  Isolate* isolate = this->isolate();                                          \
661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  VMState<EXTERNAL> state(isolate);                                            \
671510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f));                 \
68fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  PropertyCallbackInfo<ReturnValue> info(begin());                             \
69662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  f(arg1, arg2, info);                                                         \
70bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  return GetReturnValue<ReturnValue>(isolate);                                 \
71bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
72bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
73662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
74662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org#define WRITE_CALL_2_VOID(Function, ReturnValue, Arg1, Arg2)                   \
75662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid PropertyCallbackArguments::Call(Function f,                               \
76bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                     Arg1 arg1,                                \
77bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org                                     Arg2 arg2) {                              \
78bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org  Isolate* isolate = this->isolate();                                          \
791510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  VMState<EXTERNAL> state(isolate);                                            \
801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f));                 \
81fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  PropertyCallbackInfo<ReturnValue> info(begin());                             \
82662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  f(arg1, arg2, info);                                                         \
83bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org}
84bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
85662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
86bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgFOR_EACH_CALLBACK_TABLE_MAPPING_0(WRITE_CALL_0)
87bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgFOR_EACH_CALLBACK_TABLE_MAPPING_1(WRITE_CALL_1)
88bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgFOR_EACH_CALLBACK_TABLE_MAPPING_2(WRITE_CALL_2)
89bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.orgFOR_EACH_CALLBACK_TABLE_MAPPING_2_VOID_RETURN(WRITE_CALL_2_VOID)
90bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
91bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org#undef WRITE_CALL_0
92bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org#undef WRITE_CALL_1
93bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org#undef WRITE_CALL_2
94bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org#undef WRITE_CALL_2_VOID
95bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
96bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org
97f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.orgdouble ClobberDoubleRegisters(double x1, double x2, double x3, double x4) {
98f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  // TODO(ulan): This clobbers only subset of registers depending on compiler,
99f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  // Rewrite this in assembly to really clobber all registers.
1008ebe7d5dc00fdc3d4d3706fdca83108866633563danno@chromium.org  // GCC for ia32 uses the FPU and does not touch XMM registers.
101f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org  return x1 * 1.01 + x2 * 2.02 + x3 * 3.03 + x4 * 4.04;
102f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org}
103f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org
104f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org
105bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org} }  // namespace v8::internal
106