X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/compiler/normalize/privatise.cpp diff --git a/interpreter/preprocessor/faust-0.9.47mr3/compiler/normalize/privatise.cpp b/interpreter/preprocessor/faust-0.9.47mr3/compiler/normalize/privatise.cpp new file mode 100644 index 0000000..55549ba --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/compiler/normalize/privatise.cpp @@ -0,0 +1,197 @@ +/************************************************************************ + ************************************************************************ + FAUST compiler + Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + ************************************************************************ + ************************************************************************/ + + + +#include "sigtype.hh" +#include "compatibility.hh" +#include + +#include "sigprint.hh" +#include "sigtyperules.hh" +#include "privatise.hh" + + +/***************************************************************************** + privatise : compile a list of signals +*****************************************************************************/ + +static Tree makePrivatisationKey(const Tree& t); +static Tree makePrivatisationLabel(const Tree& exp); + +static Tree privatisation (const Tree& k, const Tree& t); +static Tree computePrivatisation (const Tree& k, const Tree& t); +static Tree labelize(const Tree& label, const Tree& exp); + + +Tree privatise(const Tree& t) +{ + + return privatisation(makePrivatisationKey(t), t); +} + + +// -- implementation ----------------- + +static Tree makePrivatisationKey(const Tree& t) +{ + char name[256]; + snprintf(name, 256, "PRIVATISE %p : ", (CTree*)t); + return tree(unique(name)); +} + +static Tree makePrivatisationLabel(const Tree& t) +{ + char name[256]; + snprintf(name, 256, "OWNER IS %p : ", (CTree*)t); + return tree(unique(name)); +} + + +// -- implementation ----------------- + +static Tree privatisation (const Tree& k, const Tree& t) +{ + Tree v; + + if (t->arity() == 0) { + return t; + + } else if (getProperty(t, k, v)) { + /* Terme deja visité. La propriété nous indique + la version privatisée ou nil si elle est identique + au terme initial. + */ + return isNil(v) ? t : v; + + } else { + /* Calcul du terme privatisé et mis à jour + de la propriété. Nil indique que le terme + privatisé est identique à celui de depart + (pour eviter les boucles avec les compteurs + de references) + */ + v = computePrivatisation(k,t); + if (v != t) { + setProperty(t, k, v ); + } else { + setProperty(t, k, nil); + } + return v; + } +} + +static Tree computePrivatisation(const Tree& k, const Tree& exp) +{ + Tree tbl, size, idx, wrt, content, id, var, body; + + if ( isSigWRTbl(exp, id, tbl, idx, wrt) ) { + /* Ce qui ne peut pas être partagé, ce sont les + tables dans lesquelles on ecrit. Pour cela + on leur donne un label unique + */ + return sigWRTbl( + id, + labelize( makePrivatisationLabel(exp), privatisation(k, tbl) ), + privatisation(k, idx), + privatisation(k, wrt) ); + + } else if ( isSigTable(exp, id, size, content) ) { + /* Rien à privatiser dans une table (car size est + censée etre une expression entiere) + */ + return exp; + + } else if ( isSigGen(exp, content) ) { + /* On ne visite pas les contenus des tables + */ + printf("erreur 1 dans computePrivatisation\n"); + exit(1); + + } else if ( isRec(exp, var, body) ) { + /* On ne visite pas les contenus des tables + */ + setProperty(exp, k, nil); + return rec(var, privatisation(k,body)); + + } else { + /* On parcours les autres arbres en privatisant les branches + */ + int n = exp->arity(); + + switch (n) { + + case 1 : + return tree( + exp->node(), + privatisation(k, exp->branch(0)) ); + case 2 : + return tree( + exp->node(), + privatisation(k, exp->branch(0)), + privatisation(k, exp->branch(1)) ); + case 3 : + return tree ( + exp->node(), + privatisation(k, exp->branch(0)), + privatisation(k, exp->branch(1)), + privatisation(k, exp->branch(2)) ); + case 4 : + return tree ( + exp->node(), + privatisation(k, exp->branch(0)), + privatisation(k, exp->branch(1)), + privatisation(k, exp->branch(2)), + privatisation(k, exp->branch(3)) ); + } + printf("erreur 2 dans computePrivatisation\n"); + exit(1); + } + printf("situation anormale dans computePrivatisation\n"); + return exp; +} + +static Tree labelize(const Tree& newid, const Tree& exp) +{ + Tree tbl, size, idx, wrt, content, oldid; + + if ( isSigWRTbl(exp, oldid, tbl, idx, wrt) ) { + /* Ce qui ne peut pas être partagé, ce sont les + tables dans lesquelles on ecrit. Pour cela + on leur donne un label unique + */ + return sigWRTbl(newid, tbl, idx, wrt); + + } else if ( isSigTable(exp, oldid, size, content) ) { + /* Rien à privatiser dans une table (car size est + censée etre une expression entiere) + */ + return sigTable(newid, size, content); + + } else { + + printf("erreur labelize\n"); + exit(1); + } + + return exp; +} +