Skip to content

Commit

Permalink
RAII wrapper for JSValue initial
Browse files Browse the repository at this point in the history
  • Loading branch information
andrjohns committed Jul 17, 2024
1 parent 1e54b41 commit e981ea0
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 32 deletions.
2 changes: 1 addition & 1 deletion inst/include/quickjsr.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
#include <quickjsr/JSValue_to_JSON.hpp>
#include <quickjsr/type_traits.hpp>
#include <quickjsr/JS_PropertyRecursive.hpp>
#include <quickjsr/JS_RtCtxContainer.hpp>
#include <quickjsr/JS_Containers.hpp>

#endif
42 changes: 42 additions & 0 deletions inst/include/quickjsr/JS_Containers.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#ifndef QUICKJSR_JS_CONTAINERS_HPP
#define QUICKJSR_JS_CONTAINERS_HPP

#include <cpp11/external_pointer.hpp>
#include <quickjs-libc.h>
#include <quickjs_helpers.hpp>

namespace quickjsr {

struct JS_RtCtxContainer {
public:
JSRuntime* rt;
JSContext* ctx;

JS_RtCtxContainer(int stack_size = 0)
: rt(JS_NewCustomRuntime(stack_size)), ctx(JS_NewCustomContext(rt)) {}

~JS_RtCtxContainer() {
JS_FreeContext(ctx);
js_std_free_handlers(rt);
JS_FreeRuntime(rt);
}
};

template <typename JSValT>
struct JS_ValContainer {
using RtCtxXPtr = cpp11::external_pointer<JS_RtCtxContainer>;
public:
RtCtxXPtr rt_ctx;
JSValT val;

JS_ValContainer(RtCtxXPtr in_rt_ctx, JSValT&& in_val)
: rt_ctx(in_rt_ctx), val(std::forward<JSValT>(in_val)) {}

~JS_ValContainer() {
JS_FreeValue(rt_ctx->ctx, val);
}
};

} // namespace quickjsr

#endif
28 changes: 0 additions & 28 deletions inst/include/quickjsr/JS_RtCtxContainer.hpp

This file was deleted.

6 changes: 3 additions & 3 deletions src/quickjsr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <quickjsr.hpp>

using quickjsr::JS_RtCtxContainer;
using quickjsr::JS_ValContainer;
using RtCtxXPtr = cpp11::external_pointer<JS_RtCtxContainer>;

extern "C" {
Expand Down Expand Up @@ -56,11 +57,10 @@ extern "C" {

JSValue global = JS_GetGlobalObject(rt_ctx->ctx);
JSValue fun = quickjsr::JS_GetPropertyRecursive(rt_ctx->ctx, global, Rf_translateCharUTF8(STRING_ELT(fun_name_, 0)));
JSValue result_js = JS_Call(rt_ctx->ctx, fun, global, args.size(), args.data());
JS_ValContainer result_js(rt_ctx, JS_Call(rt_ctx->ctx, fun, global, args.size(), args.data()));

SEXP result = quickjsr::JSValue_to_SEXP(rt_ctx->ctx, result_js);
SEXP result = quickjsr::JSValue_to_SEXP(rt_ctx->ctx, result_js.val);

JS_FreeValue(rt_ctx->ctx, result_js);
for (auto&& arg : args) {
JS_FreeValue(rt_ctx->ctx, arg);
}
Expand Down

0 comments on commit e981ea0

Please sign in to comment.