Skip to content

Commit 63d646b

Browse files
committed
Patch curl to avoid using FORMALS
1 parent aa96c3c commit 63d646b

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

src/library/curl.patch

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
diff --git a/src/multi.c b/src/multi.c
2+
index 2e0be9c..3cf9332 100644
3+
--- a/src/library/curl/src/multi.c
4+
+++ b/src/library/curl/src/multi.c
5+
@@ -1,6 +1,11 @@
6+
#include "curl-common.h"
7+
#include <time.h>
8+
9+
+#include <Rversion.h>
10+
+#if R_VERSION < R_Version(4, 5, 0)
11+
+# define R_ClosureFormals(x) FORMALS(x)
12+
+#endif
13+
+
14+
/* Notes:
15+
* - First check for unhandled messages in curl_multi_info_read() before curl_multi_perform()
16+
* - Use Rf_eval() to callback instead of R_tryEval() to propagate interrupt or error back to C
17+
@@ -146,7 +151,7 @@ SEXP R_multi_run(SEXP pool_ptr, SEXP timeout, SEXP max){
18+
if(status == CURLE_OK){
19+
total_success++;
20+
if(Rf_isFunction(cb_complete)){
21+
- int arglen = Rf_length(FORMALS(cb_complete));
22+
+ int arglen = Rf_length(R_ClosureFormals(cb_complete));
23+
SEXP out = PROTECT(make_handle_response(ref));
24+
SET_VECTOR_ELT(out, 6, buf);
25+
SEXP call = PROTECT(Rf_lcons(cb_complete, arglen ? Rf_lcons(out, R_NilValue) : R_NilValue));
26+
@@ -157,7 +162,7 @@ SEXP R_multi_run(SEXP pool_ptr, SEXP timeout, SEXP max){
27+
} else {
28+
total_fail++;
29+
if(Rf_isFunction(cb_error)){
30+
- int arglen = Rf_length(FORMALS(cb_error));
31+
+ int arglen = Rf_length(R_ClosureFormals(cb_error));
32+
SEXP buf = PROTECT(Rf_mkString(strlen(ref->errbuf) ? ref->errbuf : curl_easy_strerror(status)));
33+
SEXP call = PROTECT(Rf_lcons(cb_error, arglen ? Rf_lcons(buf, R_NilValue) : R_NilValue));
34+
//R_tryEval(call, R_GlobalEnv, &cbfail);

src/library/curl/src/multi.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
#include "curl-common.h"
22
#include <time.h>
33

4+
#include <Rversion.h>
5+
#if R_VERSION < R_Version(4, 5, 0)
6+
# define R_ClosureFormals(x) FORMALS(x)
7+
#endif
8+
49
/* Notes:
510
* - First check for unhandled messages in curl_multi_info_read() before curl_multi_perform()
611
* - Use Rf_eval() to callback instead of R_tryEval() to propagate interrupt or error back to C
@@ -146,7 +151,7 @@ SEXP R_multi_run(SEXP pool_ptr, SEXP timeout, SEXP max){
146151
if(status == CURLE_OK){
147152
total_success++;
148153
if(Rf_isFunction(cb_complete)){
149-
int arglen = Rf_length(FORMALS(cb_complete));
154+
int arglen = Rf_length(R_ClosureFormals(cb_complete));
150155
SEXP out = PROTECT(make_handle_response(ref));
151156
SET_VECTOR_ELT(out, 6, buf);
152157
SEXP call = PROTECT(Rf_lcons(cb_complete, arglen ? Rf_lcons(out, R_NilValue) : R_NilValue));
@@ -157,7 +162,7 @@ SEXP R_multi_run(SEXP pool_ptr, SEXP timeout, SEXP max){
157162
} else {
158163
total_fail++;
159164
if(Rf_isFunction(cb_error)){
160-
int arglen = Rf_length(FORMALS(cb_error));
165+
int arglen = Rf_length(R_ClosureFormals(cb_error));
161166
SEXP buf = PROTECT(Rf_mkString(strlen(ref->errbuf) ? ref->errbuf : curl_easy_strerror(status)));
162167
SEXP call = PROTECT(Rf_lcons(cb_error, arglen ? Rf_lcons(buf, R_NilValue) : R_NilValue));
163168
//R_tryEval(call, R_GlobalEnv, &cbfail);

0 commit comments

Comments
 (0)