Skip to content

Commit 0cb3795

Browse files
committed
Protects, cross
1 parent 0ac307d commit 0cb3795

File tree

2 files changed

+20
-7
lines changed

2 files changed

+20
-7
lines changed

.github/workflows/R-CMD-check-cross.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ jobs:
1818
- { platform: armhf }
1919
- { platform: ppc64le }
2020
- { platform: s390x }
21+
- { platform: riscv64 }
2122
- { platform: FreeBSD }
2223

2324
env:

src/quickjsr.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ extern "C" {
5353
const char* code_string = Rf_translateCharUTF8(STRING_ELT(code_string_, 0));
5454
JSValue val = JS_Eval(ctx.get(), code_string, strlen(code_string), "<input>", JS_EVAL_TYPE_GLOBAL);
5555
SEXP rtn = cpp11::as_sexp(!JS_IsException(val));
56+
PROTECT(rtn);
5657
JS_FreeValue(ctx.get(), val);
58+
UNPROTECT(1);
5759
return rtn;
5860
END_CPP11
5961
}
@@ -76,10 +78,12 @@ extern "C" {
7678
JS_FreeValue(ctx.get(), arg);
7779
}
7880

79-
SEXP result = cpp11::sexp(quickjsr::JSValue_to_SEXP(ctx.get(), result_js));
81+
SEXP result = quickjsr::JSValue_to_SEXP(ctx.get(), result_js);
82+
PROTECT(result);
8083
JS_FreeValue(ctx.get(), fun);
8184
JS_FreeValue(ctx.get(), global);
8285
JS_FreeValue(ctx.get(), result_js);
86+
UNPROTECT(1);
8387

8488
return result;
8589
END_CPP11
@@ -90,9 +94,11 @@ extern "C" {
9094
ContextXPtr ctx(ctx_ptr_);
9195
JSValue global = JS_GetGlobalObject(ctx.get());
9296
JSValue result = quickjsr::JS_GetPropertyRecursive(ctx.get(), global, Rf_translateCharUTF8(STRING_ELT(js_obj_name, 0)));
93-
SEXP rtn = cpp11::sexp(quickjsr::JSValue_to_SEXP(ctx.get(), result));
97+
SEXP rtn = quickjsr::JSValue_to_SEXP(ctx.get(), result);
98+
PROTECT(rtn);
9499
JS_FreeValue(ctx.get(), result);
95100
JS_FreeValue(ctx.get(), global);
101+
UNPROTECT(1);
96102
return rtn;
97103
END_CPP11
98104
}
@@ -118,11 +124,12 @@ extern "C" {
118124
JSContext* rt_ctx = quickjsr::JS_NewCustomContext(rt);
119125

120126
JSValue val = JS_Eval(rt_ctx, eval_string, strlen(eval_string), "<input>", JS_EVAL_TYPE_GLOBAL);
121-
SEXP rtn = cpp11::sexp(quickjsr::JSValue_to_SEXP(rt_ctx, val));
122-
127+
SEXP rtn = quickjsr::JSValue_to_SEXP(rt_ctx, val);
128+
PROTECT(rtn);
123129
JS_FreeValue(rt_ctx, val);
124130
JS_FreeContext(rt_ctx);
125131
JS_FreeRuntime(rt);
132+
UNPROTECT(1);
126133

127134
return rtn;
128135
END_CPP11
@@ -136,14 +143,17 @@ extern "C" {
136143
JSValue arg = quickjsr::SEXP_to_JSValue(rt_ctx, arg_, LOGICAL_ELT(auto_unbox_, 0));
137144
JSValue result_js = JS_JSONStringify(rt_ctx, arg, JS_UNDEFINED, JS_UNDEFINED);
138145
const char* res_str = JS_ToCString(rt_ctx, result_js);
139-
std::string json = res_str ? res_str : "";
146+
SEXP json = cpp11::as_sexp(res_str ? res_str : "");
147+
PROTECT(json);
140148

141149
JS_FreeCString(rt_ctx, res_str);
142150
JS_FreeValue(rt_ctx, result_js);
143151
JS_FreeValue(rt_ctx, arg);
144152
JS_FreeContext(rt_ctx);
145153
JS_FreeRuntime(rt);
146-
return cpp11::as_sexp(json);
154+
UNPROTECT(1);
155+
156+
return json;
147157
END_CPP11
148158
}
149159

@@ -154,10 +164,12 @@ extern "C" {
154164

155165
const char* json = Rf_translateCharUTF8(STRING_ELT(json_, 0));
156166
JSValue result = JS_ParseJSON(rt_ctx, json, strlen(json), "<input>");
157-
SEXP rtn = cpp11::sexp(quickjsr::JSValue_to_SEXP(rt_ctx, result));
167+
SEXP rtn = quickjsr::JSValue_to_SEXP(rt_ctx, result);
168+
PROTECT(rtn);
158169
JS_FreeValue(rt_ctx, result);
159170
JS_FreeContext(rt_ctx);
160171
JS_FreeRuntime(rt);
172+
UNPROTECT(1);
161173

162174
return rtn;
163175
END_CPP11

0 commit comments

Comments
 (0)