From 1cadde18a23d53f1366fb1957d51b1e9d5ebfbc1 Mon Sep 17 00:00:00 2001 From: Vladimir Ivan Date: Tue, 14 Mar 2017 16:03:13 +0000 Subject: [PATCH 1/4] Dynamically allocate char buffers when converting from Matlab strings --- Lib/matlab/matlabprimtypes.swg | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Lib/matlab/matlabprimtypes.swg b/Lib/matlab/matlabprimtypes.swg index 73d5cce3782..ccdd7c5c2c0 100644 --- a/Lib/matlab/matlabprimtypes.swg +++ b/Lib/matlab/matlabprimtypes.swg @@ -231,18 +231,22 @@ SWIGINTERN int SWIG_AsCharPtrAndSize(mxArray* pm, char** cptr, size_t* psize, int *alloc) { if(!mxIsChar(pm) || (mxGetNumberOfElements(pm) != 0 && mxGetM(pm)!=1)) return SWIG_TypeError; - size_t len=mxGetN(pm); - static char buf[256]; - int flag = mxGetString(pm,buf,(mwSize)sizeof(buf)); - if(flag) return SWIG_TypeError; + size_t len=mxGetM(pm) * mxGetN(pm) + 1; + char* buf = new char[len]; + int flag = mxGetString(pm,buf,len); + if(flag) { + delete[] buf; + return SWIG_TypeError; + } if (alloc) { - *cptr = %new_copy_array(buf, len + 1, char); + *cptr = %new_copy_array(buf, len, char); *alloc = SWIG_NEWOBJ; + delete[] buf; } else if (cptr) *cptr = buf; if (psize) - *psize = len + 1; + *psize = len; return SWIG_OK; } } From 6a405f77403af52146d050dd7f0e1d5fddaff130 Mon Sep 17 00:00:00 2001 From: Vladimir Ivan Date: Wed, 15 Mar 2017 18:17:59 +0000 Subject: [PATCH 2/4] Added long string test case --- Examples/test-suite/matlab/li_std_string_extra_runme.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Examples/test-suite/matlab/li_std_string_extra_runme.m b/Examples/test-suite/matlab/li_std_string_extra_runme.m index 37f07dc325a..3b8785277c5 100644 --- a/Examples/test-suite/matlab/li_std_string_extra_runme.m +++ b/Examples/test-suite/matlab/li_std_string_extra_runme.m @@ -158,3 +158,10 @@ %if (li_std_string_extra.c_null() ~= None) % error %end + +% Long strings +s = repmat('hello',1,100); +sout = li_std_string_extra.test_reference_inout(s); +if (s ~= sout) + error +end From d39d1437e776ebd6d55c9794f63c0caf4157c8d5 Mon Sep 17 00:00:00 2001 From: Vladimir Ivan Date: Wed, 19 Apr 2017 17:03:14 +0100 Subject: [PATCH 3/4] Switched to malloc --- Lib/matlab/matlabprimtypes.swg | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/matlab/matlabprimtypes.swg b/Lib/matlab/matlabprimtypes.swg index ccdd7c5c2c0..c2705659bb9 100644 --- a/Lib/matlab/matlabprimtypes.swg +++ b/Lib/matlab/matlabprimtypes.swg @@ -232,17 +232,17 @@ SWIG_AsCharPtrAndSize(mxArray* pm, char** cptr, size_t* psize, int *alloc) { if(!mxIsChar(pm) || (mxGetNumberOfElements(pm) != 0 && mxGetM(pm)!=1)) return SWIG_TypeError; size_t len=mxGetM(pm) * mxGetN(pm) + 1; - char* buf = new char[len]; + char* buf = (char*)malloc(sizeof(char) * len); int flag = mxGetString(pm,buf,len); if(flag) { - delete[] buf; + free(buf); return SWIG_TypeError; } if (alloc) { *cptr = %new_copy_array(buf, len, char); *alloc = SWIG_NEWOBJ; - delete[] buf; + free(buf); } else if (cptr) *cptr = buf; if (psize) From 2866a5719388d17341320d24219b61a1ca516ca9 Mon Sep 17 00:00:00 2001 From: Vladimir Ivan Date: Mon, 24 Apr 2017 17:41:48 +0100 Subject: [PATCH 4/4] Free string buffer --- Lib/matlab/matlabprimtypes.swg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/matlab/matlabprimtypes.swg b/Lib/matlab/matlabprimtypes.swg index c2705659bb9..b73ecb5a05a 100644 --- a/Lib/matlab/matlabprimtypes.swg +++ b/Lib/matlab/matlabprimtypes.swg @@ -243,8 +243,10 @@ SWIG_AsCharPtrAndSize(mxArray* pm, char** cptr, size_t* psize, int *alloc) *cptr = %new_copy_array(buf, len, char); *alloc = SWIG_NEWOBJ; free(buf); - } else if (cptr) + } else if (cptr) { *cptr = buf; + } else + free(buf); if (psize) *psize = len; return SWIG_OK;