From f95763da96a70e7f066dc0ce916e2dc85542d433 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cl=C3=A9ment=20DAVID?= Date: Tue, 19 Apr 2011 16:55:42 +0200 Subject: [PATCH] * bug 8630 fixed - Scopes crashed Scilab on simulation when they had the same window id. Change-Id: Icd4921538c5e15a2ef98ff9d5febf19a0bcef1e1 --- scilab/CHANGES_5.3.X | 3 ++ scilab/modules/scicos_blocks/src/c/cevscpe.c | 11 ++++--- scilab/modules/scicos_blocks/src/c/cmscope.c | 10 ++++-- scilab/modules/scicos_blocks/src/c/cscope.c | 6 ++-- scilab/modules/scicos_blocks/src/c/cscopxy.c | 11 +++++-- .../modules/scicos_blocks/src/c/scoWindowScope.c | 20 ++++++------ .../xcos/tests/nonreg_tests/bug_8630.dia.ref | 25 +++++++++++++++ .../modules/xcos/tests/nonreg_tests/bug_8630.tst | 32 ++++++++++++++++++++ .../modules/xcos/tests/nonreg_tests/bug_8630.xcos | Bin 0 -> 65731 bytes 9 files changed, 96 insertions(+), 22 deletions(-) create mode 100644 scilab/modules/xcos/tests/nonreg_tests/bug_8630.dia.ref create mode 100644 scilab/modules/xcos/tests/nonreg_tests/bug_8630.tst create mode 100644 scilab/modules/xcos/tests/nonreg_tests/bug_8630.xcos diff --git a/scilab/CHANGES_5.3.X b/scilab/CHANGES_5.3.X index 696bdb6..ecbde54 100644 --- a/scilab/CHANGES_5.3.X +++ b/scilab/CHANGES_5.3.X @@ -86,6 +86,9 @@ Xcos: * bug 7479 fixed - The diagram did not update its origin on block moving. +* bug 8630 fixed - Scopes crashed Scilab on simulation when they had the same + window id. + * bug 8692 fixed - Null block parameters was not checked before encoding. * bug 8735 fixed - Mixed (Implicit-Explicit) superblocks I/O blocks produced diff --git a/scilab/modules/scicos_blocks/src/c/cevscpe.c b/scilab/modules/scicos_blocks/src/c/cevscpe.c index 288e106..275c30e 100755 --- a/scilab/modules/scicos_blocks/src/c/cevscpe.c +++ b/scilab/modules/scicos_blocks/src/c/cevscpe.c @@ -111,8 +111,10 @@ SCICOS_BLOCKS_IMPEXP void cevscpe_draw(scicos_block * block, ScopeMemory ** pSco } scicos_free(colors); - /* use only single buffering to be sure to draw on the screen */ - sciSetJavaUseSingleBuffer(scoGetPointerScopeWindow(*pScopeMemory), TRUE); + /* use only single buffering to be sure to draw on the screen */ + if (scoGetPointerScopeWindow(*pScopeMemory) != NULL) { + sciSetJavaUseSingleBuffer(scoGetPointerScopeWindow(*pScopeMemory), TRUE); + } } /*--------------------------------------------------------------------------*/ /** \fn void cevscpe(scicos_block * block, int flag) @@ -207,8 +209,9 @@ SCICOS_BLOCKS_IMPEXP void cevscpe(scicos_block * block, int flag) /* pFIGURE_FEATURE(pShortDraw)->user_data = NULL; */ /* pFIGURE_FEATURE(pShortDraw)->size_of_user_data = 0; */ /* restore double buffering */ - sciSetJavaUseSingleBuffer(pShortDraw, FALSE); - scoDelCoupleOfSegments(pScopeMemory); + if (pShortDraw) { + sciSetJavaUseSingleBuffer(pShortDraw, FALSE); + } } } scoFreeScopeMemory(block->work,&pScopeMemory); diff --git a/scilab/modules/scicos_blocks/src/c/cmscope.c b/scilab/modules/scicos_blocks/src/c/cmscope.c index 29969a3..7504298 100644 --- a/scilab/modules/scicos_blocks/src/c/cmscope.c +++ b/scilab/modules/scicos_blocks/src/c/cmscope.c @@ -153,7 +153,9 @@ SCICOS_BLOCKS_IMPEXP void cmscope_draw(scicos_block * block, ScopeMemory ** pSco scicos_free(xmax); /* use only single buffering to be sure to draw on the screen */ - sciSetJavaUseSingleBuffer(scoGetPointerScopeWindow(*pScopeMemory), TRUE); + if (scoGetPointerScopeWindow(*pScopeMemory) != NULL) { + sciSetJavaUseSingleBuffer(scoGetPointerScopeWindow(*pScopeMemory), TRUE); + } } /*--------------------------------------------------------------------------*/ /** \fn void cmscope(scicos_block * block, int flag) @@ -253,8 +255,10 @@ SCICOS_BLOCKS_IMPEXP cmscope(scicos_block * block, int flag) /*pShortDraw = scoGetPointerScopeWindow(pScopeMemory);*/ clearUserData(figure); - sciSetJavaUseSingleBuffer(figure, FALSE); - scoDelCoupleOfPolylines(pScopeMemory); + /* restore double buffering */ + if (figure) { + sciSetJavaUseSingleBuffer(figure, FALSE); + } } } diff --git a/scilab/modules/scicos_blocks/src/c/cscope.c b/scilab/modules/scicos_blocks/src/c/cscope.c index e0f2a1b..1604911 100644 --- a/scilab/modules/scicos_blocks/src/c/cscope.c +++ b/scilab/modules/scicos_blocks/src/c/cscope.c @@ -214,9 +214,11 @@ SCICOS_BLOCKS_IMPEXP void cscope(scicos_block * block,int flag) if (figure != NULL) { clearUserData(figure); + /* restore double buffering */ - sciSetJavaUseSingleBuffer(figure, FALSE); - scoDelCoupleOfPolylines(pScopeMemory); + if (figure) { + sciSetJavaUseSingleBuffer(figure, FALSE); + } } } diff --git a/scilab/modules/scicos_blocks/src/c/cscopxy.c b/scilab/modules/scicos_blocks/src/c/cscopxy.c index fdc6ea3..ae3e326 100755 --- a/scilab/modules/scicos_blocks/src/c/cscopxy.c +++ b/scilab/modules/scicos_blocks/src/c/cscopxy.c @@ -113,8 +113,10 @@ SCICOS_BLOCKS_IMPEXP void cscopxy_draw(scicos_block * block, ScopeMemory ** pSco scoAddTitlesScope(*pScopeMemory,label,"x","y",NULL); } - /* use only single buffering to be sure to draw on the screen */ - sciSetJavaUseSingleBuffer(scoGetPointerScopeWindow(*pScopeMemory), TRUE); + /* use only single buffering to be sure to draw on the screen */ + if (scoGetPointerScopeWindow(*pScopeMemory) != NULL) { + sciSetJavaUseSingleBuffer(scoGetPointerScopeWindow(*pScopeMemory), TRUE); + } } /*--------------------------------------------------------------------------*/ /** \fn void cscopxy(scicos_block * block, int flag) @@ -192,8 +194,11 @@ SCICOS_BLOCKS_IMPEXP void cscopxy(scicos_block * block, int flag) /*pFIGURE_FEATURE(Pinceau)->user_data = NULL; pFIGURE_FEATURE(Pinceau)->size_of_user_data = 0;*/ clearUserData(figure); + /* restore double buffering */ - sciSetJavaUseSingleBuffer(figure, FALSE); + if (figure) { + sciSetJavaUseSingleBuffer(figure, FALSE); + } } } scoFreeScopeMemory(block->work, &pScopeMemory); diff --git a/scilab/modules/scicos_blocks/src/c/scoWindowScope.c b/scilab/modules/scicos_blocks/src/c/scoWindowScope.c index 3d57982..455b5e2 100644 --- a/scilab/modules/scicos_blocks/src/c/scoWindowScope.c +++ b/scilab/modules/scicos_blocks/src/c/scoWindowScope.c @@ -169,7 +169,7 @@ void scoInitOfWindow(ScopeMemory * pScopeMemory, int dimension, int win_id, int pSUBWIN_FEATURE(pTemp2)->SRect[1] = xmax[i]; break; default: - sciprint(_("SCOPE ERROR : scoInitOfWindow incorrect value for dimension argument.\n")); + Coserror(_("Incorrect value for dimension argument.")); break; } forceRedraw(pTemp2); @@ -193,7 +193,7 @@ void scoInitOfWindow(ScopeMemory * pScopeMemory, int dimension, int win_id, int } else { - sciprint(_("This Scope (block number : %d) has same number than another. It has been deactivated!\n"),block_number); + Coserror(_("This scope has the same window id than another.")); } } /*--------------------------------------------------------------------------*/ @@ -284,7 +284,7 @@ void scoRefreshDataBoundsX(ScopeMemory * pScopeMemory, double t) break; } default: - sciprint(_("SCOPE ERROR : Cannot use scoRefreshDataBoundsX() with this type of object\n")); + Coserror(_("Cannot use %s with this type of object."), "scoRefreshDataBoundsX"); break; } /* Dont forget to reinit it */ @@ -386,7 +386,7 @@ void scoDrawScopeAmplitudeTimeStyle(ScopeMemory * pScopeMemory, double t) break; default: - sciprint(_("SCOPE ERROR : Cannot use scoDrawScopeAmplitudeTimeStyle() with this type of object\n")); + Coserror(_("Cannot use %s with this type of object."), "scoDrawScopeAmplitudeTimeStyle"); break; } @@ -419,7 +419,7 @@ void scoDrawScopeAmplitudeTimeStyle(ScopeMemory * pScopeMemory, double t) break; default: - sciprint(_("SCOPE ERROR : Cannot use scoDrawScopeAmplitudeTimeStyle() with this type of object\n")); + Coserror(_("Cannot use %s with this type of object."), "scoDrawScopeAmplitudeTimeStyle"); break; } @@ -438,7 +438,7 @@ void scoDrawScopeAmplitudeTimeStyle(ScopeMemory * pScopeMemory, double t) NbrPtsLong = pSEGS_FEATURE(pLongDraw)->Nbr1; break; default: - sciprint(_("SCOPE ERROR : Cannot use scoDrawScopeAmplitudeTimeStyle() with this type of object\n")); + Coserror(_("Cannot use %s with this type of object."), "scoDrawScopeAmplitudeTimeStyle"); break; } @@ -497,7 +497,7 @@ void scoDrawScopeAmplitudeTimeStyle(ScopeMemory * pScopeMemory, double t) NbrPtsShort = pSEGS_FEATURE(pShortDraw)->Nbr1; break; default: - sciprint(_("SCOPE ERROR : Cannot use scoDrawScopeAmplitudeTimeStyle() with this type of object\n")); + Coserror(_("Cannot use %s with this type of object."), "scoDrawScopeAmplitudeTimeStyle"); break; } if (force_update[i] == 1) //** scope need a redraw @@ -513,7 +513,7 @@ void scoDrawScopeAmplitudeTimeStyle(ScopeMemory * pScopeMemory, double t) NbrPtsLong = pSEGS_FEATURE(pLongDraw)->Nbr1; break; default: - sciprint(_("SCOPE ERROR : Cannot use scoDrawScopeAmplitudeTimeStyle() with this type of object\n")); + Coserror(_("Cannot use %s with this type of object."), "scoDrawScopeAmplitudeTimeStyle"); break; } @@ -545,7 +545,7 @@ void scoDrawScopeAmplitudeTimeStyle(ScopeMemory * pScopeMemory, double t) pSEGS_FEATURE(pLongDraw)->Nbr2 = NbrPtsLong+NbrPtsShort; break; default: - sciprint(_("SCOPE ERROR : Cannot use scoDrawScopeAmplitudeTimeStyle() with this type of object\n")); + Coserror(_("Cannot use %s with this type of object."), "scoDrawScopeAmplitudeTimeStyle"); break; } /*End of Block for Memory*/ @@ -576,7 +576,7 @@ void scoDrawScopeAmplitudeTimeStyle(ScopeMemory * pScopeMemory, double t) /* Do Nothing */ break; default: - sciprint(_("SCOPE ERROR : Cannot use scoDrawScopeAmplitudeTimeStyle() with this type of object\n")); + Coserror(_("Cannot use %s with this type of object."), "scoDrawScopeAmplitudeTimeStyle"); break; } } diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_8630.dia.ref b/scilab/modules/xcos/tests/nonreg_tests/bug_8630.dia.ref new file mode 100644 index 0000000..d9b8bb4 --- /dev/null +++ b/scilab/modules/xcos/tests/nonreg_tests/bug_8630.dia.ref @@ -0,0 +1,25 @@ +// ============================================================================= +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) 2011 - DIGITEO - Clément DAVID +// +// This file is distributed under the same license as the Scilab package. +// ============================================================================= +// <-- TEST WITH XCOS --> +// +// <-- Non-regression test for bug 8630 --> +// +// <-- Bugzilla URL --> +// http://bugzilla.scilab.org/show_bug.cgi?id=8630 +// +// <-- Short Description --> +// Scilab crash when simulating scopes with the same window ids. +loadXcosLibs(); +status = importXcosDiagram(SCI + "/modules/xcos/tests/nonreg_tests/bug_8630.xcos"); +if ~status then bugmes();quit;end +prot = funcprot(); +funcprot(0); +deff("disp(str)", ""); +funcprot(prot); +// compile and simulate +xcos_simulate(scs_m, 4); +clear disp; diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_8630.tst b/scilab/modules/xcos/tests/nonreg_tests/bug_8630.tst new file mode 100644 index 0000000..6554d5e --- /dev/null +++ b/scilab/modules/xcos/tests/nonreg_tests/bug_8630.tst @@ -0,0 +1,32 @@ +// ============================================================================= +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) 2011 - DIGITEO - Clément DAVID +// +// This file is distributed under the same license as the Scilab package. +// ============================================================================= + +// <-- TEST WITH XCOS --> +// +// <-- Non-regression test for bug 8630 --> +// +// <-- Bugzilla URL --> +// http://bugzilla.scilab.org/show_bug.cgi?id=8630 +// +// <-- Short Description --> +// Scilab crash when simulating scopes with the same window ids. + +loadXcosLibs(); + +status = importXcosDiagram(SCI + "/modules/xcos/tests/nonreg_tests/bug_8630.xcos"); +if ~status then pause, end + +prot = funcprot(); +funcprot(0); +deff("disp(str)", ""); +funcprot(prot); + +// compile and simulate +xcos_simulate(scs_m, 4); + +clear disp; + diff --git a/scilab/modules/xcos/tests/nonreg_tests/bug_8630.xcos b/scilab/modules/xcos/tests/nonreg_tests/bug_8630.xcos new file mode 100644 index 0000000000000000000000000000000000000000..b1270d86424aadf5239206b6d8ea4acd18c8473d GIT binary patch literal 65731 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 d0e20TA1PVqa+}kGU;TLfI`nSfBJZDn_&)