From 774dddca00df908ce0dbdfbfe93e42068ea1b563 Mon Sep 17 00:00:00 2001 From: Simon Marchetto Date: Fri, 2 Aug 2013 12:09:11 +0200 Subject: [PATCH] Scilab: fix li_std_vector & ignore_template_constructor test case fix: return a runtime error for not supported type containers --- Lib/scilab/scisequence.swg | 56 ++++++++++++++++++++++++++----- Lib/scilab/scisequencepointer.swg | 10 +++--- 2 files changed, 53 insertions(+), 13 deletions(-) diff --git a/Lib/scilab/scisequence.swg b/Lib/scilab/scisequence.swg index 2319f811c..9eefd94fb 100644 --- a/Lib/scilab/scisequence.swg +++ b/Lib/scilab/scisequence.swg @@ -23,7 +23,6 @@ #define SWIG_From_SequenceItem_frag(Type...) %fragment_name(From_SequenceItem, Type) #define SWIG_From_SequenceItem_dec(Type...) %symbol_name(From_SequenceItem, Type) - %include %include %include @@ -39,10 +38,35 @@ fragment=SWIG_AsGet_Sequence_frag(ptr), fragment=SWIG_AsSize_Sequence_frag(ptr), fragment=SWIG_FromCreate_Sequence_frag(ptr), - fragment=SWIG_FromSet_Sequence_frag(ptr)) { + fragment=SWIG_FromSet_Sequence_frag(ptr), + fragment="StdTraits") { namespace swig { + // Returns an error for default (not specialized) value containers + template struct traits_as_sequence { + static int check(SciObject obj) { + SWIG_Error(SWIG_TypeError, type_name()); + } + static int get(SciObject obj, void **sequence) { + SWIG_Error(SWIG_TypeError, type_name()); + } + static int size(SciObject obj, int *size) { + SWIG_Error(SWIG_TypeError, type_name()); + } + }; + template struct traits_from_sequence { + static int create(int size, void **sequence) { + SWIG_Error(SWIG_TypeError, type_name()); + } + static SciObject set(int size, void *sequence) { + SWIG_Error(SWIG_TypeError, type_name()); + } + }; + + // But supports containers of pointers + + template struct traits_as_sequence { static int check(SciObject obj) { return SWIG_AsCheck_Sequence_dec(ptr)(obj); } @@ -53,12 +77,12 @@ namespace swig { return SWIG_AsSize_Sequence_dec(ptr)(obj, size); } }; - template struct traits_from_sequence { + template struct traits_from_sequence { static int create(int size, void **sequence) { - return SWIG_FromCreate_Sequence_dec(ptr)(size, (int ***)sequence); + return SWIG_FromCreate_Sequence_dec(ptr)(size, (long long **)sequence); } static SciObject set(int size, void *sequence) { - return SWIG_FromSet_Sequence_dec(ptr)(size, (int **)sequence); + return SWIG_FromSet_Sequence_dec(ptr)(size, (long long *)sequence); } }; } @@ -104,19 +128,35 @@ namespace swig { %fragment(SWIG_Traits_SequenceItem_frag(ptr), "header", fragment=SWIG_AsVal_SequenceItem_frag(ptr), - fragment=SWIG_From_SequenceItem_frag(ptr)) { + fragment=SWIG_From_SequenceItem_frag(ptr), + fragment="StdTraits") { namespace swig { + // Returns an error for default (not specialized) value containers + template struct traits_asval_sequenceitem { static int asval(SciObject obj, void *pSequence, int iItemIndex, T *pItemValue) { - return SWIG_AsVal_SequenceItem_dec(ptr)(obj, (int *)pSequence, iItemIndex, (int **)pItemValue); + SWIG_Error(SWIG_TypeError, type_name()); } }; template struct traits_from_sequenceitem { static int from(void *pSequence, int iItemIndex, T itemValue) { - return SWIG_From_SequenceItem_dec(ptr)((int **)pSequence, iItemIndex, (int*)itemValue); + SWIG_Error(SWIG_TypeError, type_name()); } }; + + // But supports containers of pointers + + template struct traits_asval_sequenceitem { + static int asval(SciObject obj, void *pSequence, int iItemIndex, T **pItemValue) { + return SWIG_AsVal_SequenceItem_dec(ptr)(obj, (int *)pSequence, iItemIndex, (void **)pItemValue); + } + }; + template struct traits_from_sequenceitem { + static int from(void *pSequence, int iItemIndex, T *itemValue) { + return SWIG_From_SequenceItem_dec(ptr)((long long *)pSequence, iItemIndex, (long long) itemValue); + } + }; } } diff --git a/Lib/scilab/scisequencepointer.swg b/Lib/scilab/scisequencepointer.swg index 36f6ca2d5..332b5fb7e 100644 --- a/Lib/scilab/scisequencepointer.swg +++ b/Lib/scilab/scisequencepointer.swg @@ -36,8 +36,8 @@ SWIG_AsSize_Sequence_dec(ptr)(SciObject _obj, int *_piSize) { %fragment(SWIG_FromCreate_Sequence_frag(ptr), "header") { SWIGINTERN int -SWIG_FromCreate_Sequence_dec(ptr)(int _size, int ***_sequence) { - *_sequence = new int*[_size]; +SWIG_FromCreate_Sequence_dec(ptr)(int _size, long long **_sequence) { + *_sequence = new long long[_size]; return *_sequence != NULL ? SWIG_OK : SWIG_ERROR; } } @@ -45,7 +45,7 @@ SWIG_FromCreate_Sequence_dec(ptr)(int _size, int ***_sequence) { %fragment(SWIG_FromSet_Sequence_frag(ptr), "header") { SWIGINTERN SciObject -SWIG_FromSet_Sequence_dec(ptr)(int _size, int **_sequence) { +SWIG_FromSet_Sequence_dec(ptr)(int _size, long long *_sequence) { SciErr sciErr; int *piListAddr; @@ -75,7 +75,7 @@ SWIG_FromSet_Sequence_dec(ptr)(int _size, int **_sequence) { %fragment(SWIG_AsVal_SequenceItem_frag(ptr), "header") { SWIGINTERN int -SWIG_AsVal_SequenceItem_dec(ptr)(SciObject _obj, int* _piSequence, int _itemIndex, int **_pItemValue) +SWIG_AsVal_SequenceItem_dec(ptr)(SciObject _obj, int *_piSequence, int _itemIndex, void **_pItemValue) { SciErr sciErr; int *piItemAddr; @@ -115,7 +115,7 @@ SWIG_AsVal_SequenceItem_dec(ptr)(SciObject _obj, int* _piSequence, int _itemInde %fragment(SWIG_From_SequenceItem_frag(ptr), "header") { SWIGINTERN int -SWIG_From_SequenceItem_dec(ptr)(int **_pSequence, int _iItemIndex, int *_itemValue) { +SWIG_From_SequenceItem_dec(ptr)(long long *_pSequence, int _iItemIndex, long long _itemValue) { _pSequence[_iItemIndex] = _itemValue; } }