1 /* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #ifndef V8BindingMacros_h 32 #define V8BindingMacros_h 33 34 namespace blink { 35 36 // Naming scheme: 37 // TO*_RETURNTYPE[_ARGTYPE]... 38 // ...using _DEFAULT instead of _ANY..._ANY when returing a default value. 39 40 #define TONATIVE_EXCEPTION(type, var, value) \ 41 type var; \ 42 { \ 43 v8::TryCatch block; \ 44 var = (value); \ 45 if (UNLIKELY(block.HasCaught())) \ 46 return block.ReThrow(); \ 47 } 48 49 #define TONATIVE_VOID_INTERNAL(var, value) \ 50 var = (value); \ 51 if (UNLIKELY(block.HasCaught())) \ 52 return; 53 54 #define TONATIVE_VOID(type, var, value) \ 55 type var; \ 56 { \ 57 v8::TryCatch block; \ 58 V8RethrowTryCatchScope rethrow(block); \ 59 TONATIVE_VOID_INTERNAL(var, value); \ 60 } 61 62 #define TONATIVE_DEFAULT(type, var, value, retVal) \ 63 type var; \ 64 { \ 65 v8::TryCatch block; \ 66 var = (value); \ 67 if (UNLIKELY(block.HasCaught())) { \ 68 block.ReThrow(); \ 69 return retVal; \ 70 } \ 71 } 72 73 // We need to cancel the exception propergation when we return a rejected 74 // Promise. 75 #define TONATIVE_VOID_PROMISE_INTERNAL(var, value, info) \ 76 var = (value); \ 77 if (UNLIKELY(block.HasCaught())) { \ 78 v8SetReturnValue(info, ScriptPromise::rejectRaw(info.GetIsolate(), block.Exception())); \ 79 block.Reset(); \ 80 return; \ 81 } 82 83 #define TONATIVE_VOID_PROMISE(type, var, value, info) \ 84 type var; \ 85 { \ 86 v8::TryCatch block; \ 87 TONATIVE_VOID_PROMISE_INTERNAL(var, value, info); \ 88 } 89 90 91 #define TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(var, value, exceptionState) \ 92 var = (value); \ 93 if (UNLIKELY(exceptionState.throwIfNeeded())) \ 94 return; \ 95 96 #define TONATIVE_VOID_EXCEPTIONSTATE(type, var, value, exceptionState) \ 97 type var; \ 98 var = (value); \ 99 if (UNLIKELY(exceptionState.throwIfNeeded())) \ 100 return; 101 102 #define TONATIVE_DEFAULT_EXCEPTIONSTATE(type, var, value, exceptionState, retVal) \ 103 type var = (value); \ 104 if (UNLIKELY(exceptionState.throwIfNeeded())) \ 105 return retVal; 106 107 // We need to cancel the exception propergation when we return a rejected 108 // Promise. 109 #define TONATIVE_VOID_EXCEPTIONSTATE_PROMISE_INTERNAL(var, value, exceptionState, info, scriptState) \ 110 var = (value); \ 111 if (UNLIKELY(exceptionState.hadException())) { \ 112 v8SetReturnValue(info, exceptionState.reject(scriptState).v8Value()); \ 113 return; \ 114 } 115 116 #define TONATIVE_VOID_EXCEPTIONSTATE_PROMISE(type, var, value, exceptionState, info, scriptState) \ 117 type var; \ 118 TONATIVE_VOID_EXCEPTIONSTATE_PROMISE_INTERNAL(var, value, exceptionState, info, scriptState); 119 120 // type is an instance of class template V8StringResource<>, 121 // but Mode argument varies; using type (not Mode) for consistency 122 // with other macros and ease of code generation 123 #define TOSTRING_VOID(type, var, value) \ 124 type var(value); \ 125 if (UNLIKELY(!var.prepare())) \ 126 return; 127 128 #define TOSTRING_VOID_INTERNAL(var, value) \ 129 var = (value); \ 130 if (UNLIKELY(!var.prepare())) \ 131 return; 132 133 #define TOSTRING_DEFAULT(type, var, value, retVal) \ 134 type var(value); \ 135 if (UNLIKELY(!var.prepare())) \ 136 return retVal; 137 138 // We need to cancel the exception propagation when we return a rejected 139 // Promise. 140 #define TOSTRING_VOID_EXCEPTIONSTATE_PROMISE_INTERNAL(var, value, exceptionState, info, scriptState) \ 141 var = (value); \ 142 if (UNLIKELY(!var.prepare(exceptionState))) { \ 143 v8SetReturnValue(info, exceptionState.reject(scriptState).v8Value()); \ 144 return; \ 145 } 146 147 } // namespace blink 148 149 #endif // V8BindingMacros_h 150