Merge remote-tracking branch 'upstream/master' into OCaml-INPUT-OUTPUT-INOUT-primitives

This commit is contained in:
Zackery Spytz 2019-02-18 20:41:13 -07:00
commit 5a58f9a87b
25 changed files with 354 additions and 23 deletions

View file

@ -62,7 +62,7 @@ extern "C" {
SWIG_TypeCheckStruct(source_type, dest_type );
#ifdef TYPE_CAST_VERBOSE
fprintf( stderr, "Typecheck -> %s\n",
tc ? tc->str : "<none>" );
tc ? tc->type->str : "<none>" );
#endif
if( tc ) {
int newmemory = 0;

View file

@ -7,6 +7,7 @@
%include <std/std_except.i>
%apply size_t { std::size_t };
%apply const size_t& { const std::size_t& };
%{
#include <string>

View file

@ -86,6 +86,7 @@ class wstring;
%typemap(out) string * {
$result = caml_val_string_len((*$1).c_str(),(*$1).size());
}
%typemap(typecheck) string, const string & = char *;
}
#ifdef ENABLE_CHARPTR_ARRAY

View file

@ -72,7 +72,8 @@
long, signed long, unsigned long,
long long, signed long long, unsigned long long,
const long &, const signed long &, const unsigned long &,
const long long &, const signed long long &, const unsigned long long &
const long long &, const signed long long &, const unsigned long long &,
size_t, const size_t &
{
if( !Is_block($input) ) $1 = 0;
else {
@ -135,24 +136,42 @@
}
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [] {
void *ptr;
$1 = !caml_ptr_val_internal($input, &ptr,$descriptor);
if (!Is_block($input) || !(SWIG_Tag_val($input) == C_obj || SWIG_Tag_val($input) == C_ptr)) {
$1 = 0;
} else {
void *ptr;
$1 = !caml_ptr_val_internal($input, &ptr, $descriptor);
}
}
#if 0
%typecheck(SWIG_TYPECHECK_POINTER) SWIGTYPE {
void *ptr;
$1 = !caml_ptr_val_internal($input, &ptr, $&1_descriptor);
swig_type_info *typeinfo;
if (!Is_block($input)) {
$1 = 0;
} else {
switch (SWIG_Tag_val($input)) {
case C_obj: {
void *ptr;
$1 = !caml_ptr_val_internal($input, &ptr, $&1_descriptor);
break;
}
case C_ptr: {
typeinfo = (swig_type_info *)SWIG_Int64_val(SWIG_Field($input, 1));
$1 = SWIG_TypeCheck("$1_type", typeinfo) != NULL;
break;
}
default: $1 = 0; break;
}
}
}
#endif
%typecheck(SWIG_TYPECHECK_VOIDPTR) void * {
void *ptr;
$1 = !caml_ptr_val_internal($input, &ptr, 0);
}
%typecheck(SWIG_TYPECHECK_SWIGOBJECT) CAML_VALUE "$1 = 1;"
%define INPUT_OUTPUT_INOUT_TYPEMAPS(type, c_to_ocaml, ocaml_to_c)
%typemap(in) type *INPUT(type temp), type &INPUT(type temp) {
temp = (type)ocaml_to_c($input);

View file

@ -132,11 +132,11 @@
%typemap(varin) C_NAME {
$1 = OCAML_TO_C($input);
}
%typemap(in) C_NAME & ($*1_ltype temp) {
%typemap(in) const C_NAME & ($*1_ltype temp) {
temp = ($*1_ltype) OCAML_TO_C($input);
$1 = &temp;
}
%typemap(varin) C_NAME & {
%typemap(varin) const C_NAME & {
$1 = OCAML_TO_C($input);
}
%typemap(directorout) C_NAME {
@ -149,10 +149,10 @@
%typemap(varout) C_NAME {
$result = C_TO_OCAML($1);
}
%typemap(varout) C_NAME & {
%typemap(varout) const C_NAME & {
$result = C_TO_OCAML($1);
}
%typemap(out) C_NAME & {
%typemap(out) const C_NAME & {
$result = C_TO_OCAML(*$1);
}
%typemap(directorin) C_NAME {