mirror of
https://github.com/matrix-construct/construct
synced 2024-11-29 02:02:38 +01:00
ircd::js: Add barebones accoutrements.
This commit is contained in:
parent
191258cea5
commit
c1fd6391c6
6 changed files with 202 additions and 8 deletions
54
include/ircd/js/compartment_guard.h
Normal file
54
include/ircd/js/compartment_guard.h
Normal file
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* Copyright (C) 2016 Charybdis Development Team
|
||||
* Copyright (C) 2016 Jason Volk <jason@zemos.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice is present in all copies.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#define HAVE_IRCD_JS_COMPARTMENT_GUARD_H
|
||||
|
||||
namespace ircd {
|
||||
namespace js {
|
||||
|
||||
class compartment_guard
|
||||
{
|
||||
JSContext *cx;
|
||||
JSCompartment *cp;
|
||||
|
||||
public:
|
||||
compartment_guard(JSContext &, JSObject &);
|
||||
~compartment_guard() noexcept;
|
||||
};
|
||||
|
||||
inline
|
||||
compartment_guard::compartment_guard(JSContext &cx,
|
||||
JSObject &obj)
|
||||
:cx{&cx}
|
||||
,cp{JS_EnterCompartment(&cx, &obj)}
|
||||
{
|
||||
}
|
||||
|
||||
inline
|
||||
compartment_guard::~compartment_guard()
|
||||
noexcept
|
||||
{
|
||||
JS_LeaveCompartment(cx, cp);
|
||||
}
|
||||
|
||||
} // namespace js
|
||||
} // namespace ircd
|
|
@ -28,8 +28,15 @@ namespace js {
|
|||
struct context
|
||||
:custom_ptr<JSContext>
|
||||
{
|
||||
operator const JSContext *() const { return get(); }
|
||||
operator JSContext *() { return get(); }
|
||||
struct privdata
|
||||
{
|
||||
virtual ~privdata() noexcept = 0;
|
||||
};
|
||||
|
||||
operator JSContext *() const { return get(); }
|
||||
operator JSContext &() const { return custom_ptr<JSContext>::operator*(); }
|
||||
|
||||
void reset() { custom_ptr<JSContext>::reset(nullptr); }
|
||||
|
||||
template<class... args> context(JSRuntime *const &, args&&...);
|
||||
context() = default;
|
||||
|
@ -39,16 +46,71 @@ struct context
|
|||
// for misc/utility/system purposes if necessary.
|
||||
extern context mc;
|
||||
|
||||
// Get/Set your privdata managed by this object, casting to your expected type.
|
||||
template<size_t at, class T = context::privdata> const T *priv(const JSContext &);
|
||||
template<size_t at, class T = context::privdata> T *priv(JSContext &);
|
||||
template<size_t at, class T> void priv(JSContext &, T *);
|
||||
|
||||
|
||||
template<class... args>
|
||||
context::context(JSRuntime *const &runtime,
|
||||
args&&... a)
|
||||
:custom_ptr<JSContext>
|
||||
{
|
||||
JS_NewContext(runtime, std::forward<args>(a)...),
|
||||
JS_DestroyContext
|
||||
[](JSContext *const ctx)
|
||||
{
|
||||
if(likely(ctx))
|
||||
{
|
||||
delete priv<0>(*ctx);
|
||||
delete priv<1>(*ctx);
|
||||
JS_DestroyContext(ctx);
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
}
|
||||
|
||||
template<size_t at,
|
||||
class T>
|
||||
void
|
||||
priv(JSContext &c,
|
||||
T *const &ptr)
|
||||
{
|
||||
delete priv<at>(c);
|
||||
switch(at)
|
||||
{
|
||||
default:
|
||||
case 0: JS_SetContextPrivate(&c, ptr); break;
|
||||
case 1: JS_SetSecondContextPrivate(&c, ptr); break;
|
||||
}
|
||||
}
|
||||
|
||||
template<size_t at,
|
||||
class T>
|
||||
T *
|
||||
priv(JSContext &c)
|
||||
{
|
||||
switch(at)
|
||||
{
|
||||
default:
|
||||
case 0: return dynamic_cast<T *>(static_cast<context::privdata *>(JS_GetContextPrivate(&c)));
|
||||
case 1: return dynamic_cast<T *>(static_cast<context::privdata *>(JS_GetSecondContextPrivate(&c)));
|
||||
}
|
||||
}
|
||||
|
||||
template<size_t at,
|
||||
class T>
|
||||
const T *
|
||||
priv(const JSContext &c)
|
||||
{
|
||||
switch(at)
|
||||
{
|
||||
default:
|
||||
case 0: return dynamic_cast<const T *>(static_cast<const context::privdata *>(JS_GetContextPrivate(&c)));
|
||||
case 1: return dynamic_cast<const T *>(static_cast<const context::privdata *>(JS_GetSecondContextPrivate(&c)));
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace js
|
||||
} // namespace ircd
|
||||
|
|
|
@ -46,3 +46,5 @@ namespace js {
|
|||
|
||||
#include "runtime.h"
|
||||
#include "context.h"
|
||||
#include "request_guard.h"
|
||||
#include "compartment_guard.h"
|
||||
|
|
52
include/ircd/js/request_guard.h
Normal file
52
include/ircd/js/request_guard.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright (C) 2016 Charybdis Development Team
|
||||
* Copyright (C) 2016 Jason Volk <jason@zemos.net>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice is present in all copies.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#define HAVE_IRCD_JS_REQUEST_GUARD_H
|
||||
|
||||
namespace ircd {
|
||||
namespace js {
|
||||
|
||||
class request_guard
|
||||
{
|
||||
JSContext *c;
|
||||
|
||||
public:
|
||||
request_guard(JSContext &);
|
||||
~request_guard() noexcept;
|
||||
};
|
||||
|
||||
inline
|
||||
request_guard::request_guard(JSContext &c)
|
||||
:c(&c)
|
||||
{
|
||||
JS_BeginRequest(&c);
|
||||
}
|
||||
|
||||
inline
|
||||
request_guard::~request_guard()
|
||||
noexcept
|
||||
{
|
||||
JS_EndRequest(c);
|
||||
}
|
||||
|
||||
} // namespace js
|
||||
} // namespace ircd
|
|
@ -25,11 +25,16 @@
|
|||
namespace ircd {
|
||||
namespace js {
|
||||
|
||||
struct runtime
|
||||
class runtime
|
||||
:custom_ptr<JSRuntime>
|
||||
{
|
||||
operator const JSRuntime *() const { return get(); }
|
||||
operator JSRuntime *() { return get(); }
|
||||
static void handle_error(JSContext *, const char *msg, JSErrorReport *);
|
||||
|
||||
public:
|
||||
operator JSRuntime *() const { return get(); }
|
||||
operator JSRuntime &() const { return custom_ptr<JSRuntime>::operator*(); }
|
||||
|
||||
void reset() { custom_ptr<JSRuntime>::reset(nullptr); }
|
||||
|
||||
template<class... args> runtime(args&&...);
|
||||
runtime() = default;
|
||||
|
@ -47,6 +52,7 @@ runtime::runtime(args&&... a)
|
|||
JS_DestroyRuntime
|
||||
}
|
||||
{
|
||||
JS_SetErrorReporter(get(), handle_error);
|
||||
}
|
||||
|
||||
} // namespace js
|
||||
|
|
22
ircd/js.cc
22
ircd/js.cc
|
@ -73,8 +73,8 @@ ircd::js::init::~init()
|
|||
noexcept
|
||||
{
|
||||
log.info("Terminating the main JS Runtime");
|
||||
mc.reset(nullptr);
|
||||
main.reset(nullptr);
|
||||
mc.reset();
|
||||
main.reset();
|
||||
|
||||
log.info("Terminating the JS engine");
|
||||
JS_ShutDown();
|
||||
|
@ -97,3 +97,21 @@ ircd::js::version(const ver &type)
|
|||
//
|
||||
// ircd/js/js.h - With 3rd party (JSAPI) symbols
|
||||
//
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// ircd/js/context.h
|
||||
//
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// ircd/js/runtime.h
|
||||
//
|
||||
|
||||
void
|
||||
ircd::js::runtime::handle_error(JSContext *const ctx,
|
||||
const char *const msg,
|
||||
JSErrorReport *const report)
|
||||
{
|
||||
log.error("JSContext(%p): %s", ctx, msg);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue