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