From 88b4827d8753657c62ae143a64f8d8c668680d70 Mon Sep 17 00:00:00 2001 From: Simon Marchetto Date: Thu, 15 Dec 2016 23:57:30 +0100 Subject: [PATCH] scilab: SWIG_ptr() accepts mlist typed pointers and converts them to pointers --- ...lab_pointer_conversion_functions_runme.sci | 6 +++ .../scilab_pointer_conversion_functions.i | 15 ++++++- Lib/scilab/scirun.swg | 43 +++++++++++-------- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/Examples/test-suite/scilab/scilab_pointer_conversion_functions_runme.sci b/Examples/test-suite/scilab/scilab_pointer_conversion_functions_runme.sci index d24f60eb9..3e1ffc5e5 100644 --- a/Examples/test-suite/scilab/scilab_pointer_conversion_functions_runme.sci +++ b/Examples/test-suite/scilab/scilab_pointer_conversion_functions_runme.sci @@ -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); diff --git a/Examples/test-suite/scilab_pointer_conversion_functions.i b/Examples/test-suite/scilab_pointer_conversion_functions.i index 5e29926c1..339627c1a 100644 --- a/Examples/test-suite/scilab_pointer_conversion_functions.i +++ b/Examples/test-suite/scilab_pointer_conversion_functions.i @@ -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; +}; + +%} diff --git a/Lib/scilab/scirun.swg b/Lib/scilab/scirun.swg index ad3a7fa1f..10d18ac9d 100644 --- a/Lib/scilab/scirun.swg +++ b/Lib/scilab/scirun.swg @@ -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; + } } }