Skip to content

Commit

Permalink
Fix valgrind errors
Browse files Browse the repository at this point in the history
  • Loading branch information
andrjohns committed May 14, 2024
1 parent 687fe49 commit c21e6ab
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 30 deletions.
5 changes: 4 additions & 1 deletion inst/include/quickjsr/JSValue_to_Cpp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ namespace quickjsr {

template <typename T, std::enable_if_t<std::is_same<T, std::string>::value>* = nullptr>
T JSValue_to_Cpp(JSContext* ctx, JSValue val) {
return JS_ToCString(ctx, val);
const char* res_str = JS_ToCString(ctx, val);
std::string result = res_str;
JS_FreeCString(ctx, res_str);
return result;
}

template <typename T, std::enable_if_t<is_std_vector<T>::value>* = nullptr>
Expand Down
2 changes: 1 addition & 1 deletion inst/include/quickjsr/JSValue_to_JSON.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ std::string JS_ValToJSON(JSContext* ctx, JSValue* val) {
js_std_dump_error(ctx);
result = "Error!";
} else {
result = JS_ToCString(ctx, result_js);
result = JSValue_to_Cpp<std::string>(ctx, result_js);
}

JS_FreeValue(ctx, result_js);
Expand Down
39 changes: 11 additions & 28 deletions src/quickjsr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,14 @@
#include <quickjs-libc.h>
#include <quickjsr.hpp>

void JS_FreeRuntimeStdHandlers(JSRuntime* rt) {
js_std_free_handlers(rt);
JS_FreeRuntime(rt);
}

// Register the cpp11 external pointer types with the correct cleanup/finaliser functions
using ContextXPtr = cpp11::external_pointer<JSContext, JS_FreeContext>;
using RuntimeXPtr = cpp11::external_pointer<JSRuntime, JS_FreeRuntime>;
using RuntimeXPtr = cpp11::external_pointer<JSRuntime, JS_FreeRuntimeStdHandlers>;

extern "C" SEXP qjs_context_(SEXP stack_size_) {
BEGIN_CPP11
Expand Down Expand Up @@ -53,28 +58,6 @@ extern "C" SEXP qjs_validate_(SEXP ctx_ptr_, SEXP code_string_) {
END_CPP11
}

const char* JS_ValToJSON(JSContext* ctx, JSValue* val) {
JSValue global = JS_GetGlobalObject(ctx);
JSValue json = JS_GetPropertyStr(ctx, global, "JSON");
JSValue stringify = JS_GetPropertyStr(ctx, json, "stringify");

JSValue result_js = JS_Call(ctx, stringify, global, 1, val);
const char* result;
if (JS_IsException(result_js)) {
js_std_dump_error(ctx);
result = "Error!";
} else {
result = JS_ToCString(ctx, result_js);
}

JS_FreeValue(ctx, result_js);
JS_FreeValue(ctx, stringify);
JS_FreeValue(ctx, json);
JS_FreeValue(ctx, global);

return result;
}

extern "C" SEXP qjs_call_(SEXP ctx_ptr_, SEXP function_name_, SEXP args_json_) {
BEGIN_CPP11
JSContext* ctx = ContextXPtr(ctx_ptr_).get();
Expand Down Expand Up @@ -102,12 +85,12 @@ extern "C" SEXP qjs_call_(SEXP ctx_ptr_, SEXP function_name_, SEXP args_json_) {
};

JSValue result_js = JS_Call(ctx, function_wrapper, global, 1, args);
const char* result;
std::string result;
if (JS_IsException(result_js)) {
js_std_dump_error(ctx);
result = "Error!";
} else {
result = JS_ValToJSON(ctx, &result_js);
result = quickjsr::JS_ValToJSON(ctx, &result_js);
}

JS_FreeValue(ctx, result_js);
Expand All @@ -126,12 +109,12 @@ extern "C" SEXP qjs_eval_(SEXP eval_string_) {
JSContext* ctx = JS_NewContext(rt);

JSValue val = JS_Eval(ctx, eval_string.c_str(), eval_string.size(), "", 0);
const char* result;
std::string result;
if (JS_IsException(val)) {
js_std_dump_error(ctx);
result = "Error!";
} else {
result = JS_ValToJSON(ctx, &val);
result = quickjsr::JS_ValToJSON(ctx, &val);
}

JS_FreeValue(ctx, val);
Expand Down Expand Up @@ -167,7 +150,7 @@ extern "C" SEXP qjs_passthrough_(SEXP args_, SEXP jsonlite_rtn_) {
result = cpp11::as_sexp("Error!");
} else {
if (cpp11::as_cpp<bool>(jsonlite_rtn_)) {
result = cpp11::as_sexp(JS_ValToJSON(ctx, &result_js));
result = cpp11::as_sexp(quickjsr::JS_ValToJSON(ctx, &result_js));
} else {
result = quickjsr::JSValue_to_SEXP(ctx, result_js);
}
Expand Down

0 comments on commit c21e6ab

Please sign in to comment.