tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

ABIFunctions.h (2888B)


      1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
      2 * vim: set ts=8 sts=2 et sw=2 tw=80:
      3 * This Source Code Form is subject to the terms of the Mozilla Public
      4 * License, v. 2.0. If a copy of the MPL was not distributed with this
      5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      6 
      7 #ifndef jit_ABIFunctions_h
      8 #define jit_ABIFunctions_h
      9 
     10 #include "jstypes.h"  // JS_FUNC_TO_DATA_PTR
     11 
     12 struct JS_PUBLIC_API JSContext;
     13 
     14 namespace JS {
     15 class JS_PUBLIC_API Value;
     16 }
     17 
     18 namespace js {
     19 namespace jit {
     20 
     21 // This class is used to ensure that all known targets of callWithABI are
     22 // registered here. Otherwise, this would raise a static assertion at compile
     23 // time.
     24 template <typename Sig, Sig fun>
     25 struct ABIFunctionData {
     26  static const bool registered = false;
     27 };
     28 
     29 template <typename Sig, Sig fun>
     30 struct ABIFunction {
     31  void* address() const { return JS_FUNC_TO_DATA_PTR(void*, fun); }
     32 
     33  // If this assertion fails, you are likely in the context of a
     34  // `callWithABI<Sig, fn>()` call. This error indicates that ABIFunction has
     35  // not been specialized for `<Sig, fn>` by the time of this call.
     36  //
     37  // This can be fixed by adding the function signature to either
     38  // ABIFUNCTION_LIST or ABIFUNCTION_AND_TYPE_LIST (if overloaded) within
     39  // `ABIFunctionList-inl.h` and to add an `#include` statement of this header
     40  // in the file which is making the call to `callWithABI<Sig, fn>()`.
     41  static_assert(ABIFunctionData<Sig, fun>::registered,
     42                "ABI function is not registered.");
     43 };
     44 
     45 template <typename Sig>
     46 struct ABIFunctionSignatureData {
     47  static const bool registered = false;
     48 };
     49 
     50 template <typename Sig>
     51 struct ABIFunctionSignature {
     52  void* address(Sig fun) const { return JS_FUNC_TO_DATA_PTR(void*, fun); }
     53 
     54  // If this assertion fails, you are likely in the context of a
     55  // `DynamicFunction<Sig>(fn)` call. This error indicates that
     56  // ABIFunctionSignature has not been specialized for `Sig` by the time of this
     57  // call.
     58  //
     59  // This can be fixed by adding the function signature to ABIFUNCTIONSIG_LIST
     60  // within `ABIFunctionList-inl.h` and to add an `#include` statement of this
     61  // header in the file which is making the call to `DynamicFunction<Sig>(fn)`.
     62  static_assert(ABIFunctionSignatureData<Sig>::registered,
     63                "ABI function signature is not registered.");
     64 };
     65 
     66 // This is a structure created to ensure that the dynamically computed
     67 // function pointer is well typed.
     68 //
     69 // It is meant to be created only through DynamicFunction function calls. In
     70 // extremelly rare cases, such as VMFunctions, it might be produced as a result
     71 // of GetVMFunctionTarget.
     72 struct DynFn {
     73  void* address;
     74 };
     75 
     76 #ifdef JS_SIMULATOR
     77 bool CallAnyNative(JSContext* cx, unsigned argc, JS::Value* vp);
     78 const void* RedirectedCallAnyNative();
     79 #endif
     80 
     81 }  // namespace jit
     82 }  // namespace js
     83 
     84 #endif /* jit_VMFunctions_h */