scilab: SWIG_ptr() accepts mlist typed pointers and converts them to pointers

This commit is contained in:
Simon Marchetto 2016-12-15 23:57:30 +01:00
commit 88b4827d87
3 changed files with 46 additions and 18 deletions

View file

@ -15,4 +15,10 @@ checkequal(foo_addr, expected_foo_addr, "SWIG_this(pfoo_get())");
pfoo = SWIG_ptr(foo_addr);
checkequal(equalFooPointer(pfoo), %T, "equalFooPointer(pfoo)");
// Test conversion of mlist type pointers
stA = new_structA();
assert_checkequal(typeof(stA), "_p_structA");
p = SWIG_ptr(stA);
assert_checkequal(typeof(p), "pointer");
exec("swigtest.quit", -1);

View file

@ -4,7 +4,7 @@
%inline %{
void* getNull() { return NULL; }
void *getNull() { return NULL; }
bool isNull(void *p) { return p == NULL; }
int foo = 3;
@ -15,4 +15,17 @@ bool equalFooPointer(void *p) { return p == pfoo; }
%}
%typemap(out, noblock=1) struct structA* {
if (SwigScilabPtrFromObject(pvApiCtx, SWIG_Scilab_GetOutputPosition(), $1, SWIG_Scilab_TypeQuery("struct structA *"), 0, NULL) != SWIG_OK) {
return SWIG_ERROR;
}
SWIG_Scilab_SetOutput(pvApiCtx, SWIG_NbInputArgument(pvApiCtx) + SWIG_Scilab_GetOutputPosition());
}
%inline %{
struct structA {
int x;
};
%}

View file

@ -448,27 +448,36 @@ int SWIG_this(SWIG_GatewayParameters) {
extern "C"
#endif
int SWIG_ptr(SWIG_GatewayParameters) {
void *ptrValue = NULL;
double dValue = 0;
int *piAddr;
SciErr sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
if(sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;
}
if (getScalarDouble(pvApiCtx, piAddr, &dValue) == 0) {
if (dValue != (uintptr_t)dValue) {
Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1);
return SWIG_ValueError;
}
if ((dValue < 0) || (dValue > ULONG_MAX)) {
Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1);
return SWIG_OverflowError;
}
if (SwigScilabPtrToObject(pvApiCtx, 1, &ptrValue, NULL, 0, fname) == SWIG_OK) {
SWIG_Scilab_SetOutputPosition(1);
return SWIG_Scilab_SetOutput(pvApiCtx,
SwigScilabPtrFromObject(pvApiCtx, 1, (void *) (uintptr_t)dValue, NULL, 0, NULL));
SwigScilabPtrFromObject(pvApiCtx, 1, ptrValue, NULL, 0, NULL));
}
else {
return SWIG_ERROR;
int *piAddr;
SciErr sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
if(sciErr.iErr) {
printError(&sciErr, 0);
return SWIG_ERROR;
}
if (getScalarDouble(pvApiCtx, piAddr, &dValue) == 0) {
if (dValue != (uintptr_t)dValue) {
Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Incorrect value for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1);
return SWIG_ValueError;
}
if ((dValue < 0) || (dValue > ULONG_MAX)) {
Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Overflow error for input argument #%d: The double value cannot be converted to a pointer.\n"), fname, 1);
return SWIG_OverflowError;
}
SWIG_Scilab_SetOutputPosition(1);
return SWIG_Scilab_SetOutput(pvApiCtx,
SwigScilabPtrFromObject(pvApiCtx, 1, (void *) (uintptr_t)dValue, NULL, 0, NULL));
}
else {
Scierror(SCILAB_API_ARGUMENT_ERROR, _("%s: Wrong type for input argument #%d: A pointer or a double expected.\n"), "SWIG_ptr", 1);
return SWIG_TypeError;
}
}
}