{-# LINE 1 "src/Quickjs/Types.hsc" #-}
{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings, MultiParamTypeClasses, FlexibleInstances, GeneralizedNewtypeDeriving #-}

module Quickjs.Types where

import qualified Data.Map                  as Map
import           Data.Bits                 (Bits)
import           Foreign.C.Types
import           Foreign.Ptr               (plusPtr)
import           Foreign.Storable          (Storable(..))
import qualified Language.Haskell.TH       as TH
import           Language.C.Inline
import           Language.C.Inline.Context
import qualified Language.C.Types          as C



data JSValue = JSValue
  { JSValue -> CDouble
u :: {-# UNPACK #-} !CDouble
  , JSValue -> CLong
tag :: {-# UNPACK #-} !CLong
  } deriving (Int -> JSValue -> ShowS
[JSValue] -> ShowS
JSValue -> String
(Int -> JSValue -> ShowS)
-> (JSValue -> String) -> ([JSValue] -> ShowS) -> Show JSValue
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JSValue] -> ShowS
$cshowList :: [JSValue] -> ShowS
show :: JSValue -> String
$cshow :: JSValue -> String
showsPrec :: Int -> JSValue -> ShowS
$cshowsPrec :: Int -> JSValue -> ShowS
Show, JSValue -> JSValue -> Bool
(JSValue -> JSValue -> Bool)
-> (JSValue -> JSValue -> Bool) -> Eq JSValue
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JSValue -> JSValue -> Bool
$c/= :: JSValue -> JSValue -> Bool
== :: JSValue -> JSValue -> Bool
$c== :: JSValue -> JSValue -> Bool
Eq)

instance Storable JSValue where
  sizeOf :: JSValue -> Int
sizeOf JSValue
_ = (Int
16)
{-# LINE 24 "src/Quickjs/Types.hsc" #-}
  alignment _ = 8
{-# LINE 25 "src/Quickjs/Types.hsc" #-}
  peek ptr = do
    u <- peek ((\hsc_ptr -> hsc_ptr `plusPtr` 0) ptr)
{-# LINE 27 "src/Quickjs/Types.hsc" #-}
    tag <- peek ((\hsc_ptr -> hsc_ptr `plusPtr` 8) ptr)
{-# LINE 28 "src/Quickjs/Types.hsc" #-}
    Prelude.pure (JSValue u tag)
  poke :: Ptr JSValue -> JSValue -> IO ()
poke Ptr JSValue
ptr (JSValue CDouble
u CLong
tag) = do
    Ptr CDouble -> CDouble -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((\Ptr JSValue
hsc_ptr -> Ptr JSValue
hsc_ptr Ptr JSValue -> Int -> Ptr CDouble
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0) Ptr JSValue
ptr) CDouble
u
{-# LINE 31 "src/Quickjs/Types.hsc" #-}
    poke ((\hsc_ptr -> hsc_ptr `plusPtr` 8) ptr) tag
{-# LINE 32 "src/Quickjs/Types.hsc" #-}

type JSValueConst = JSValue

newtype JSRuntime = JSRuntime { JSRuntime -> CUChar
_unusedRuntime :: CUChar }

newtype JSContext = JSContext { JSContext -> CUChar
_unusedContext :: CUChar }


type JSBool = CInt

type JSAtom = CUInt


data JSPropertyEnum = JSPropertyEnum
  { JSPropertyEnum -> JSBool
is_enumerable :: {-# UNPACK #-} !JSBool
  , JSPropertyEnum -> JSAtom
atom :: {-# UNPACK #-} !JSAtom
  } deriving (Int -> JSPropertyEnum -> ShowS
[JSPropertyEnum] -> ShowS
JSPropertyEnum -> String
(Int -> JSPropertyEnum -> ShowS)
-> (JSPropertyEnum -> String)
-> ([JSPropertyEnum] -> ShowS)
-> Show JSPropertyEnum
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JSPropertyEnum] -> ShowS
$cshowList :: [JSPropertyEnum] -> ShowS
show :: JSPropertyEnum -> String
$cshow :: JSPropertyEnum -> String
showsPrec :: Int -> JSPropertyEnum -> ShowS
$cshowsPrec :: Int -> JSPropertyEnum -> ShowS
Show, JSPropertyEnum -> JSPropertyEnum -> Bool
(JSPropertyEnum -> JSPropertyEnum -> Bool)
-> (JSPropertyEnum -> JSPropertyEnum -> Bool) -> Eq JSPropertyEnum
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JSPropertyEnum -> JSPropertyEnum -> Bool
$c/= :: JSPropertyEnum -> JSPropertyEnum -> Bool
== :: JSPropertyEnum -> JSPropertyEnum -> Bool
$c== :: JSPropertyEnum -> JSPropertyEnum -> Bool
Eq)

instance Storable JSPropertyEnum where
  sizeOf :: JSPropertyEnum -> Int
sizeOf JSPropertyEnum
_ = (Int
8)
{-# LINE 52 "src/Quickjs/Types.hsc" #-}
  alignment _ = 4
{-# LINE 53 "src/Quickjs/Types.hsc" #-}
  peek ptr = do
    is_enumerable <- peek ((\hsc_ptr -> hsc_ptr `plusPtr` 0) ptr)
{-# LINE 55 "src/Quickjs/Types.hsc" #-}
    atom <- peek ((\hsc_ptr -> hsc_ptr `plusPtr` 4) ptr)
{-# LINE 56 "src/Quickjs/Types.hsc" #-}
    Prelude.pure (JSPropertyEnum is_enumerable atom)
  poke :: Ptr JSPropertyEnum -> JSPropertyEnum -> IO ()
poke Ptr JSPropertyEnum
ptr (JSPropertyEnum JSBool
is_enumerable JSAtom
atom) = do
    Ptr JSBool -> JSBool -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((\Ptr JSPropertyEnum
hsc_ptr -> Ptr JSPropertyEnum
hsc_ptr Ptr JSPropertyEnum -> Int -> Ptr JSBool
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0) Ptr JSPropertyEnum
ptr) JSBool
is_enumerable
{-# LINE 59 "src/Quickjs/Types.hsc" #-}
    poke ((\hsc_ptr -> hsc_ptr `plusPtr` 4) ptr) atom
{-# LINE 60 "src/Quickjs/Types.hsc" #-}



data JSRefCountHeader = JSRefCountHeader
  { JSRefCountHeader -> JSBool
ref_count :: {-# UNPACK #-} !CInt
  } deriving (Int -> JSRefCountHeader -> ShowS
[JSRefCountHeader] -> ShowS
JSRefCountHeader -> String
(Int -> JSRefCountHeader -> ShowS)
-> (JSRefCountHeader -> String)
-> ([JSRefCountHeader] -> ShowS)
-> Show JSRefCountHeader
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JSRefCountHeader] -> ShowS
$cshowList :: [JSRefCountHeader] -> ShowS
show :: JSRefCountHeader -> String
$cshow :: JSRefCountHeader -> String
showsPrec :: Int -> JSRefCountHeader -> ShowS
$cshowsPrec :: Int -> JSRefCountHeader -> ShowS
Show, JSRefCountHeader -> JSRefCountHeader -> Bool
(JSRefCountHeader -> JSRefCountHeader -> Bool)
-> (JSRefCountHeader -> JSRefCountHeader -> Bool)
-> Eq JSRefCountHeader
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JSRefCountHeader -> JSRefCountHeader -> Bool
$c/= :: JSRefCountHeader -> JSRefCountHeader -> Bool
== :: JSRefCountHeader -> JSRefCountHeader -> Bool
$c== :: JSRefCountHeader -> JSRefCountHeader -> Bool
Eq)

instance Storable JSRefCountHeader where
  sizeOf :: JSRefCountHeader -> Int
sizeOf JSRefCountHeader
_ = (Int
4)
{-# LINE 69 "src/Quickjs/Types.hsc" #-}
  alignment _ = 4
{-# LINE 70 "src/Quickjs/Types.hsc" #-}
  peek ptr = do
    ref_count <- peek ((\hsc_ptr -> hsc_ptr `plusPtr` 0) ptr)
{-# LINE 72 "src/Quickjs/Types.hsc" #-}
    Prelude.pure (JSRefCountHeader ref_count)
  poke :: Ptr JSRefCountHeader -> JSRefCountHeader -> IO ()
poke Ptr JSRefCountHeader
ptr (JSRefCountHeader JSBool
ref_count) = do
    Ptr JSBool -> JSBool -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke ((\Ptr JSRefCountHeader
hsc_ptr -> Ptr JSRefCountHeader
hsc_ptr Ptr JSRefCountHeader -> Int -> Ptr JSBool
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
0) Ptr JSRefCountHeader
ptr) JSBool
ref_count
{-# LINE 75 "src/Quickjs/Types.hsc" #-}



class ToCType ty cty where
  toCType :: ty -> cty


class FromCType ty cty where
  fromCType :: cty -> Maybe ty


data JSTagEnum = JSTagFirst
               | JSTagBigDecimal
               | JSTagBigInt
               | JSTagBigFloat
               | JSTagSymbol
               | JSTagString
               | JSTagModule
               | JSTagFunctionBytecode
               | JSTagObject
               | JSTagInt
               | JSTagBool
               | JSTagNull
               | JSTagUndefined
               | JSTagUninitialized
               | JSTagCatchOffset
               | JSTagException
               | JSTagFloat64
  deriving (Int -> JSTagEnum -> ShowS
[JSTagEnum] -> ShowS
JSTagEnum -> String
(Int -> JSTagEnum -> ShowS)
-> (JSTagEnum -> String)
-> ([JSTagEnum] -> ShowS)
-> Show JSTagEnum
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JSTagEnum] -> ShowS
$cshowList :: [JSTagEnum] -> ShowS
show :: JSTagEnum -> String
$cshow :: JSTagEnum -> String
showsPrec :: Int -> JSTagEnum -> ShowS
$cshowsPrec :: Int -> JSTagEnum -> ShowS
Show, JSTagEnum -> JSTagEnum -> Bool
(JSTagEnum -> JSTagEnum -> Bool)
-> (JSTagEnum -> JSTagEnum -> Bool) -> Eq JSTagEnum
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JSTagEnum -> JSTagEnum -> Bool
$c/= :: JSTagEnum -> JSTagEnum -> Bool
== :: JSTagEnum -> JSTagEnum -> Bool
$c== :: JSTagEnum -> JSTagEnum -> Bool
Eq)
  
instance Num a => ToCType JSTagEnum a where
  toCType :: JSTagEnum -> a
toCType JSTagEnum
JSTagFirst            = -a
11
{-# LINE 107 "src/Quickjs/Types.hsc" #-}
  toCType JSTagBigDecimal       = -11
{-# LINE 108 "src/Quickjs/Types.hsc" #-}
  toCType JSTagBigInt           = -10
{-# LINE 109 "src/Quickjs/Types.hsc" #-}
  toCType JSTagBigFloat         = -9
{-# LINE 110 "src/Quickjs/Types.hsc" #-}
  toCType JSTagSymbol           = -8
{-# LINE 111 "src/Quickjs/Types.hsc" #-}
  toCType JSTagString           = -7
{-# LINE 112 "src/Quickjs/Types.hsc" #-}
  toCType JSTagModule           = -3
{-# LINE 113 "src/Quickjs/Types.hsc" #-}
  toCType JSTagFunctionBytecode = -2
{-# LINE 114 "src/Quickjs/Types.hsc" #-}
  toCType JSTagObject           = -1
{-# LINE 115 "src/Quickjs/Types.hsc" #-}
  toCType JSTagInt              = 0
{-# LINE 116 "src/Quickjs/Types.hsc" #-}
  toCType JSTagBool             = 1
{-# LINE 117 "src/Quickjs/Types.hsc" #-}
  toCType JSTagNull             = 2
{-# LINE 118 "src/Quickjs/Types.hsc" #-}
  toCType JSTagUndefined        = 3
{-# LINE 119 "src/Quickjs/Types.hsc" #-}
  toCType JSTagUninitialized    = 4
{-# LINE 120 "src/Quickjs/Types.hsc" #-}
  toCType JSTagCatchOffset      = 5
{-# LINE 121 "src/Quickjs/Types.hsc" #-}
  toCType JSTagException        = 6
{-# LINE 122 "src/Quickjs/Types.hsc" #-}
  toCType JSTagFloat64          = 7
{-# LINE 123 "src/Quickjs/Types.hsc" #-}


instance (Eq a, Num a) => FromCType JSTagEnum a where
  fromCType :: a -> Maybe JSTagEnum
fromCType (-11) = JSTagEnum -> Maybe JSTagEnum
forall a. a -> Maybe a
Just JSTagEnum
JSTagBigDecimal
{-# LINE 127 "src/Quickjs/Types.hsc" #-}
  fromCType (-10) = Just JSTagBigInt
{-# LINE 128 "src/Quickjs/Types.hsc" #-}
  fromCType (-9) = Just JSTagBigFloat
{-# LINE 129 "src/Quickjs/Types.hsc" #-}
  fromCType (-8) = Just JSTagSymbol
{-# LINE 130 "src/Quickjs/Types.hsc" #-}
  fromCType (-7) = Just JSTagString
{-# LINE 131 "src/Quickjs/Types.hsc" #-}
  fromCType (-3) = Just JSTagModule
{-# LINE 132 "src/Quickjs/Types.hsc" #-}
  fromCType (-2) = Just JSTagFunctionBytecode
{-# LINE 133 "src/Quickjs/Types.hsc" #-}
  fromCType (-1) = Just JSTagObject
{-# LINE 134 "src/Quickjs/Types.hsc" #-}
  fromCType (0) = Just JSTagInt
{-# LINE 135 "src/Quickjs/Types.hsc" #-}
  fromCType (1) = Just JSTagBool
{-# LINE 136 "src/Quickjs/Types.hsc" #-}
  fromCType (2) = Just JSTagNull
{-# LINE 137 "src/Quickjs/Types.hsc" #-}
  fromCType (3) = Just JSTagUndefined
{-# LINE 138 "src/Quickjs/Types.hsc" #-}
  fromCType (4) = Just JSTagUninitialized
{-# LINE 139 "src/Quickjs/Types.hsc" #-}
  fromCType (5) = Just JSTagCatchOffset
{-# LINE 140 "src/Quickjs/Types.hsc" #-}
  fromCType (6) = Just JSTagException 
{-# LINE 141 "src/Quickjs/Types.hsc" #-}
  fromCType (7) = Just JSTagFloat64
{-# LINE 142 "src/Quickjs/Types.hsc" #-}
  fromCType _ = Nothing

data JSTypeEnum = JSTypeFromTag JSTagEnum
                | JSIsNumber
                | JSIsArray
                | JSIsDate
                | JSIsError
  deriving Int -> JSTypeEnum -> ShowS
[JSTypeEnum] -> ShowS
JSTypeEnum -> String
(Int -> JSTypeEnum -> ShowS)
-> (JSTypeEnum -> String)
-> ([JSTypeEnum] -> ShowS)
-> Show JSTypeEnum
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JSTypeEnum] -> ShowS
$cshowList :: [JSTypeEnum] -> ShowS
show :: JSTypeEnum -> String
$cshow :: JSTypeEnum -> String
showsPrec :: Int -> JSTypeEnum -> ShowS
$cshowsPrec :: Int -> JSTypeEnum -> ShowS
Show

data JSEvalType = Global | Module

  
instance Num a => ToCType JSEvalType a where
  toCType :: JSEvalType -> a
toCType JSEvalType
Global = a
0
{-# LINE 156 "src/Quickjs/Types.hsc" #-}
  toCType Module = 1
{-# LINE 157 "src/Quickjs/Types.hsc" #-}


newtype JSGPNMask = JSGPNMask { JSGPNMask -> JSBool
unJSGPNMask :: CInt }
  deriving (JSGPNMask -> JSGPNMask -> Bool
(JSGPNMask -> JSGPNMask -> Bool)
-> (JSGPNMask -> JSGPNMask -> Bool) -> Eq JSGPNMask
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JSGPNMask -> JSGPNMask -> Bool
$c/= :: JSGPNMask -> JSGPNMask -> Bool
== :: JSGPNMask -> JSGPNMask -> Bool
$c== :: JSGPNMask -> JSGPNMask -> Bool
Eq, Eq JSGPNMask
JSGPNMask
Eq JSGPNMask
-> (JSGPNMask -> JSGPNMask -> JSGPNMask)
-> (JSGPNMask -> JSGPNMask -> JSGPNMask)
-> (JSGPNMask -> JSGPNMask -> JSGPNMask)
-> (JSGPNMask -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> JSGPNMask
-> (Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> Bool)
-> (JSGPNMask -> Maybe Int)
-> (JSGPNMask -> Int)
-> (JSGPNMask -> Bool)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int -> JSGPNMask)
-> (JSGPNMask -> Int)
-> Bits JSGPNMask
Int -> JSGPNMask
JSGPNMask -> Bool
JSGPNMask -> Int
JSGPNMask -> Maybe Int
JSGPNMask -> JSGPNMask
JSGPNMask -> Int -> Bool
JSGPNMask -> Int -> JSGPNMask
JSGPNMask -> JSGPNMask -> JSGPNMask
forall a.
Eq a
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> a
-> (Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> Bool)
-> (a -> Maybe Int)
-> (a -> Int)
-> (a -> Bool)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int -> a)
-> (a -> Int)
-> Bits a
popCount :: JSGPNMask -> Int
$cpopCount :: JSGPNMask -> Int
rotateR :: JSGPNMask -> Int -> JSGPNMask
$crotateR :: JSGPNMask -> Int -> JSGPNMask
rotateL :: JSGPNMask -> Int -> JSGPNMask
$crotateL :: JSGPNMask -> Int -> JSGPNMask
unsafeShiftR :: JSGPNMask -> Int -> JSGPNMask
$cunsafeShiftR :: JSGPNMask -> Int -> JSGPNMask
shiftR :: JSGPNMask -> Int -> JSGPNMask
$cshiftR :: JSGPNMask -> Int -> JSGPNMask
unsafeShiftL :: JSGPNMask -> Int -> JSGPNMask
$cunsafeShiftL :: JSGPNMask -> Int -> JSGPNMask
shiftL :: JSGPNMask -> Int -> JSGPNMask
$cshiftL :: JSGPNMask -> Int -> JSGPNMask
isSigned :: JSGPNMask -> Bool
$cisSigned :: JSGPNMask -> Bool
bitSize :: JSGPNMask -> Int
$cbitSize :: JSGPNMask -> Int
bitSizeMaybe :: JSGPNMask -> Maybe Int
$cbitSizeMaybe :: JSGPNMask -> Maybe Int
testBit :: JSGPNMask -> Int -> Bool
$ctestBit :: JSGPNMask -> Int -> Bool
complementBit :: JSGPNMask -> Int -> JSGPNMask
$ccomplementBit :: JSGPNMask -> Int -> JSGPNMask
clearBit :: JSGPNMask -> Int -> JSGPNMask
$cclearBit :: JSGPNMask -> Int -> JSGPNMask
setBit :: JSGPNMask -> Int -> JSGPNMask
$csetBit :: JSGPNMask -> Int -> JSGPNMask
bit :: Int -> JSGPNMask
$cbit :: Int -> JSGPNMask
zeroBits :: JSGPNMask
$czeroBits :: JSGPNMask
rotate :: JSGPNMask -> Int -> JSGPNMask
$crotate :: JSGPNMask -> Int -> JSGPNMask
shift :: JSGPNMask -> Int -> JSGPNMask
$cshift :: JSGPNMask -> Int -> JSGPNMask
complement :: JSGPNMask -> JSGPNMask
$ccomplement :: JSGPNMask -> JSGPNMask
xor :: JSGPNMask -> JSGPNMask -> JSGPNMask
$cxor :: JSGPNMask -> JSGPNMask -> JSGPNMask
.|. :: JSGPNMask -> JSGPNMask -> JSGPNMask
$c.|. :: JSGPNMask -> JSGPNMask -> JSGPNMask
.&. :: JSGPNMask -> JSGPNMask -> JSGPNMask
$c.&. :: JSGPNMask -> JSGPNMask -> JSGPNMask
$cp1Bits :: Eq JSGPNMask
Bits)

jsGPNStringMask   :: JSGPNMask
jsGPNStringMask :: JSGPNMask
jsGPNStringMask   = JSBool -> JSGPNMask
JSGPNMask JSBool
1
jsGPNSymbolMask   :: JSGPNMask
jsGPNSymbolMask :: JSGPNMask
jsGPNSymbolMask   = JSBool -> JSGPNMask
JSGPNMask JSBool
2
jsGPNPrivateMask  :: JSGPNMask
jsGPNPrivateMask :: JSGPNMask
jsGPNPrivateMask  = JSBool -> JSGPNMask
JSGPNMask JSBool
4
jsGPNEnumOnly     :: JSGPNMask
jsGPNEnumOnly :: JSGPNMask
jsGPNEnumOnly     = JSBool -> JSGPNMask
JSGPNMask JSBool
16
jsGPNSetEnum      :: JSGPNMask
jsGPNSetEnum :: JSGPNMask
jsGPNSetEnum      = JSBool -> JSGPNMask
JSGPNMask JSBool
32

{-# LINE 169 "src/Quickjs/Types.hsc" #-}


quickjsCtx :: Context
quickjsCtx = baseCtx <> fptrCtx <> ctx
  where
    ctx = mempty
      { ctxTypesTable = quickjsTypesTable
      }

quickjsTypesTable :: Map.Map C.TypeSpecifier TH.TypeQ
quickjsTypesTable :: TypesTable
quickjsTypesTable = [(TypeSpecifier, TypeQ)] -> TypesTable
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
  [ 
    (CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"JSValue", [t| JSValue |])
  , (CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"JSValueConst", [t| JSValueConst |])
  , (CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"JSRuntime", [t| JSRuntime |])
  , (CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"JSContext", [t| JSContext |])
  , (CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"JSBool", [t| JSBool |])
  , (CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"JSAtom", [t| JSAtom |])
  , (CIdentifier -> TypeSpecifier
C.TypeName CIdentifier
"JSPropertyEnum", [t| JSPropertyEnum |])
  ]