mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
ocaml: Use caml_alloc_initialized_string instead of memcpy.
See this commit in libguestfs-common:
398dc56a6c
This commit is contained in:
2
common
2
common
Submodule common updated: 08c4504d7a...ea10827b4c
@@ -509,12 +509,11 @@ copy_table (char * const * argv)
|
||||
| name, FString ->
|
||||
pr " v = caml_copy_string (%s->%s);\n" typ name
|
||||
| name, FBuffer ->
|
||||
pr " v = caml_alloc_string (%s->%s_len);\n" typ name;
|
||||
pr " memcpy (String_val (v), %s->%s, %s->%s_len);\n"
|
||||
pr " v = caml_alloc_initialized_string (%s->%s_len, %s->%s);\n"
|
||||
typ name typ name
|
||||
| name, FUUID ->
|
||||
pr " v = caml_alloc_string (32);\n";
|
||||
pr " memcpy (String_val (v), %s->%s, 32);\n" typ name
|
||||
pr " v = caml_alloc_initialized_string (32, %s->%s);\n"
|
||||
typ name
|
||||
| name, (FBytes|FInt64|FUInt64) ->
|
||||
pr " v = caml_copy_int64 (%s->%s);\n" typ name
|
||||
| name, (FInt32|FUInt32) ->
|
||||
@@ -762,8 +761,7 @@ copy_table (char * const * argv)
|
||||
pr " for (i = 0; r[i] != NULL; ++i) free (r[i]);\n";
|
||||
pr " free (r);\n";
|
||||
| RBufferOut _ ->
|
||||
pr " rv = caml_alloc_string (size);\n";
|
||||
pr " memcpy (String_val (rv), r, size);\n";
|
||||
pr " rv = caml_alloc_initialized_string (size, r);\n";
|
||||
pr " free (r);\n"
|
||||
);
|
||||
|
||||
|
||||
@@ -213,6 +213,24 @@ EOF
|
||||
AM_CONDITIONAL([HAVE_BYTES_COMPAT_ML],
|
||||
[test "x$have_Bytes_module" = "xno"])
|
||||
|
||||
dnl Check if OCaml has caml_alloc_initialized_string (added 2017).
|
||||
AS_IF([test "x$OCAMLC" != "xno" && test "x$OCAMLFIND" != "xno" && \
|
||||
test "x$enable_ocaml" = "xyes"],[
|
||||
AC_MSG_CHECKING([for caml_alloc_initialized_string])
|
||||
cat >conftest.c <<'EOF'
|
||||
#include <caml/alloc.h>
|
||||
int main () { char *p = (void *) caml_alloc_initialized_string; return 0; }
|
||||
EOF
|
||||
AS_IF([$OCAMLC conftest.c >&AS_MESSAGE_LOG_FD 2>&1],[
|
||||
AC_MSG_RESULT([yes])
|
||||
AC_DEFINE([HAVE_CAML_ALLOC_INITIALIZED_STRING],[1],
|
||||
[caml_alloc_initialized_string found at compile time.])
|
||||
],[
|
||||
AC_MSG_RESULT([no])
|
||||
])
|
||||
rm -f conftest.c conftest.o
|
||||
])
|
||||
|
||||
dnl Flags we want to pass to every OCaml compiler call.
|
||||
OCAML_WARN_ERROR="-warn-error CDEFLMPSUVYZX+52-3"
|
||||
AC_SUBST([OCAML_WARN_ERROR])
|
||||
|
||||
@@ -360,8 +360,7 @@ event_callback_wrapper_locked (guestfs_h *g,
|
||||
|
||||
ehv = Val_int (event_handle);
|
||||
|
||||
bufv = caml_alloc_string (buf_len);
|
||||
memcpy (String_val (bufv), buf, buf_len);
|
||||
bufv = caml_alloc_initialized_string (buf_len, buf);
|
||||
|
||||
arrayv = caml_alloc (array_len, 0);
|
||||
for (i = 0; i < array_len; ++i) {
|
||||
|
||||
@@ -19,6 +19,24 @@
|
||||
#ifndef GUESTFS_OCAML_C_H
|
||||
#define GUESTFS_OCAML_C_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <caml/alloc.h>
|
||||
#include <caml/mlvalues.h>
|
||||
|
||||
/* Replacement if caml_alloc_initialized_string is missing, added
|
||||
* to OCaml runtime in 2017.
|
||||
*/
|
||||
#ifndef HAVE_CAML_ALLOC_INITIALIZED_STRING
|
||||
static inline value
|
||||
caml_alloc_initialized_string (mlsize_t len, const char *p)
|
||||
{
|
||||
value sv = caml_alloc_string (len);
|
||||
memcpy ((char *) String_val (sv), p, len);
|
||||
return sv;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define Guestfs_val(v) (*((guestfs_h **)Data_custom_val(v)))
|
||||
extern void guestfs_int_ocaml_raise_error (guestfs_h *g, const char *func)
|
||||
Noreturn;
|
||||
|
||||
Reference in New Issue
Block a user