1 // Copyright 2013 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "src/v8.h" 6 #include "src/arguments.h" 7 8 #include "src/vm-state-inl.h" 9 10 namespace v8 { 11 namespace internal { 12 13 14 template<typename T> 15 template<typename V> 16 v8::Handle<V> CustomArguments<T>::GetReturnValue(Isolate* isolate) { 17 // Check the ReturnValue. 18 Object** handle = &this->begin()[kReturnValueOffset]; 19 // Nothing was set, return empty handle as per previous behaviour. 20 if ((*handle)->IsTheHole()) return v8::Handle<V>(); 21 return Utils::Convert<Object, V>(Handle<Object>(handle)); 22 } 23 24 25 v8::Handle<v8::Value> FunctionCallbackArguments::Call(FunctionCallback f) { 26 Isolate* isolate = this->isolate(); 27 VMState<EXTERNAL> state(isolate); 28 ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f)); 29 FunctionCallbackInfo<v8::Value> info(begin(), 30 argv_, 31 argc_, 32 is_construct_call_); 33 f(info); 34 return GetReturnValue<v8::Value>(isolate); 35 } 36 37 38 #define WRITE_CALL_0(Function, ReturnValue) \ 39 v8::Handle<ReturnValue> PropertyCallbackArguments::Call(Function f) { \ 40 Isolate* isolate = this->isolate(); \ 41 VMState<EXTERNAL> state(isolate); \ 42 ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f)); \ 43 PropertyCallbackInfo<ReturnValue> info(begin()); \ 44 f(info); \ 45 return GetReturnValue<ReturnValue>(isolate); \ 46 } 47 48 49 #define WRITE_CALL_1(Function, ReturnValue, Arg1) \ 50 v8::Handle<ReturnValue> PropertyCallbackArguments::Call(Function f, \ 51 Arg1 arg1) { \ 52 Isolate* isolate = this->isolate(); \ 53 VMState<EXTERNAL> state(isolate); \ 54 ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f)); \ 55 PropertyCallbackInfo<ReturnValue> info(begin()); \ 56 f(arg1, info); \ 57 return GetReturnValue<ReturnValue>(isolate); \ 58 } 59 60 61 #define WRITE_CALL_2(Function, ReturnValue, Arg1, Arg2) \ 62 v8::Handle<ReturnValue> PropertyCallbackArguments::Call(Function f, \ 63 Arg1 arg1, \ 64 Arg2 arg2) { \ 65 Isolate* isolate = this->isolate(); \ 66 VMState<EXTERNAL> state(isolate); \ 67 ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f)); \ 68 PropertyCallbackInfo<ReturnValue> info(begin()); \ 69 f(arg1, arg2, info); \ 70 return GetReturnValue<ReturnValue>(isolate); \ 71 } 72 73 74 #define WRITE_CALL_2_VOID(Function, ReturnValue, Arg1, Arg2) \ 75 void PropertyCallbackArguments::Call(Function f, \ 76 Arg1 arg1, \ 77 Arg2 arg2) { \ 78 Isolate* isolate = this->isolate(); \ 79 VMState<EXTERNAL> state(isolate); \ 80 ExternalCallbackScope call_scope(isolate, FUNCTION_ADDR(f)); \ 81 PropertyCallbackInfo<ReturnValue> info(begin()); \ 82 f(arg1, arg2, info); \ 83 } 84 85 86 FOR_EACH_CALLBACK_TABLE_MAPPING_0(WRITE_CALL_0) 87 FOR_EACH_CALLBACK_TABLE_MAPPING_1(WRITE_CALL_1) 88 FOR_EACH_CALLBACK_TABLE_MAPPING_2(WRITE_CALL_2) 89 FOR_EACH_CALLBACK_TABLE_MAPPING_2_VOID_RETURN(WRITE_CALL_2_VOID) 90 91 #undef WRITE_CALL_0 92 #undef WRITE_CALL_1 93 #undef WRITE_CALL_2 94 #undef WRITE_CALL_2_VOID 95 96 97 double ClobberDoubleRegisters(double x1, double x2, double x3, double x4) { 98 // TODO(ulan): This clobbers only subset of registers depending on compiler, 99 // Rewrite this in assembly to really clobber all registers. 100 // GCC for ia32 uses the FPU and does not touch XMM registers. 101 return x1 * 1.01 + x2 * 2.02 + x3 * 3.03 + x4 * 4.04; 102 } 103 104 105 } } // namespace v8::internal 106