je finalise ma mise à jour et en testant sous linux 32, j'ai un problème de plantage de OOo.
je te consulte avant de me lancer dans des recherches plus poussées avec recompil de giac en mode debug par exemple.
Mon plantage se produit quand, dans OOo, je compile une fonction, par exemple :
Code : Tout sélectionner
test(x):={1}
Code : Tout sélectionner
cas_setup(0,0,0,1,0,1e-10,10,[1,50,0,25],0,1,0)
Code : Tout sélectionner
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb4da4700 (LWP 6549)]
0xb727ec98 in std::basic_ios<char, std::char_traits<char> >::operator void* ()
from /opt/openoffice.org3/program/../basis-link/ure-link/lib/libstdc++.so.6
(gdb) bt
#0 0xb727ec98 in std::basic_ios<char, std::char_traits<char> >::operator void* ()
from /opt/openoffice.org3/program/../basis-link/ure-link/lib/libstdc++.so.6
#1 0xaaee93e6 in giac::cas_setup ()
from /home/chris/.openoffice.org/3/user/uno_packages/cache/uno_packages/xStsnY_/CmathOOoCAS.oxt/Linux_x86/libgiac.so.0
#2 0xaaeeaa8d in giac::_cas_setup ()
from /home/chris/.openoffice.org/3/user/uno_packages/cache/uno_packages/xStsnY_/CmathOOoCAS.oxt/Linux_x86/libgiac.so.0
#3 0xaaf5b7a6 in giac::unary_function_eval::operator() ()
from /home/chris/.openoffice.org/3/user/uno_packages/cache/uno_packages/xStsnY_/CmathOOoCAS.oxt/Linux_x86/libgiac.so.0
#4 0xaabc7e1b in giac::symbolic::eval ()
from /home/chris/.openoffice.org/3/user/uno_packages/cache/uno_packages/xStsnY_/CmathOOoCAS.oxt/Linux_x86/libgiac.so.0
#5 0xaafcdbff in giac::gen::in_eval ()
from /home/chris/.openoffice.org/3/user/uno_packages/cache/uno_packages/xStsnY_/CmathOOoCAS.oxt/Linux_x86/libgiac.so.0
#6 0xaafcd644 in giac::gen::eval ()
from /home/chris/.openoffice.org/3/user/uno_packages/cache/uno_packages/xStsnY_/CmathOOoCAS.oxt/Linux_x86/libgiac.so.0
#7 0xab7192c9 in my_sc_impl::CASImpl::cas ()
from /home/chris/.openoffice.org/3/user/uno_packages/cache/uno_packages/xStsnY_/CmathOOoCAS.oxt/Linux_x86/CmathOOoCAS.uno.so
#8 0xb3950828 in ?? () from /opt/openoffice.org/ure/lib/libgcc3_uno.so
#9 0xb3950b3a in ?? () from /opt/openoffice.org/ure/lib/libgcc3_uno.so
#10 0xb3950ed9 in ?? () from /opt/openoffice.org/ure/lib/libgcc3_uno.so
#11 0xacd1f89d in ?? () from /opt/openoffice.org/ure/lib/reflection.uno.so
#12 0xad5e1518 in ?? () from /opt/openoffice.org3/program/../basis-link/program/libscli.so
etc...
Si dans OOo, je ne compile pas de fonction avant le cas_setup, pas de problème
Si dans OOo, je compile une fonction sans faire de cas_setup derrière, pas de problème
Je n'ai pas ce problème avec linux 64
je pense que j'ai le même problème sous windows 32 (plantage mais pas de gdb sous win pour vérifier)
Y aurait-il un lien avec la gestion du flux d'erreur (logptr) introduit dans mon code qui me sert à compiler sous OOo et qui serait mal supporté par cas_setup ?
pour info ci dessous mon code qui appelle cas_setup :
Code : Tout sélectionner
Any CASImpl::cas( Any const & contenu )
throw (RuntimeException)
// fonction qui ne fait qu'évaluer le contenu d'une cellule
// appelée aussi par writer
{
if (!contenu.hasValue()) return syntaxErreur();
gen e;
giac::context * contextptr=0;
e=Cellule2Gen(contenu);
giac::child_id=1; // certaines fonctions giac (comme laplace, cas_setup...) nécessite ce contexte
try {
e=giac::eval(e,contextptr);
} catch (std::runtime_error & erreur){
// english only with Giac
return makeAny(OUString::createFromAscii(erreur.what()));
}
return Gen2any(e);
}
Code : Tout sélectionner
Sequence< Sequence< Any > > CASImpl::casWithLog( Any const & contenu )
throw (RuntimeException)
// fonction créée pour les instruction giac comportant une compilation de fonction
// renvoie un vecteur contenant :
// 1) le résultat
// 2) le flux d'erreurs
// 3) le numéro de la ligne ou a lieu la 1ère erreur
// 4) le mot qui est source de l'erreur
{
if (!contenu.hasValue()) return syntaxErreurMatrix();
giac::context * contextptr=0;
// ne pas passer par Cellule2Gen car le flux d'erreur n'est pas géré et cela
// fait planter OOo
// e=Cellule2Gen(contenu);
giac::child_id=1; // certaines fonctions giac (comme laplace, cas_setup...) nécessite ce contexte
OUString chaine;
contenu >>= chaine;
ostringstream oss(ostringstream::out);
oss.str("");
logptr(&oss,contextptr);
OString aOString = OUStringToOString (chaine,RTL_TEXTENCODING_UTF8);
gen e(string(aOString),contextptr);
Sequence< Sequence< Any > > sortie;
try {
e=giac::eval(e,contextptr);
} catch (std::runtime_error & erreur){
Sequence< Any > solList1D(1);
Sequence< Sequence< Any > > solList2D(1);
solList1D[0]=makeAny(OUString::createFromAscii(erreur.what()));
solList2D[0]=solList1D;
sortie=solList2D;
return sortie;
}
Sequence< Any > solList1D(4);
Sequence< Sequence< Any > > solList2D(1);
// renvoie le flux d'erreur dans le 1er élément
const sal_Char * flux;
flux=oss.str().c_str();
solList1D[0]=makeAny(OUString::createFromAscii(flux));
// renvoie le résultat évalué dans le second
solList1D[1]=Gen2any(e);
// renvoie le n° de ligne de l'erreur
sal_Int32 errorLine(giac::first_error_line(contextptr));
solList1D[2]=makeAny(OUString::valueOf(errorLine));
// et le mot à l'origine de l'erreur
const sal_Char * tokenName(giac::error_token_name(contextptr).c_str());
solList1D[3]=makeAny(OUString::createFromAscii(tokenName));
solList2D[0]=solList1D;
sortie=solList2D;
return sortie;
}