Hi Oleg, Sounds relevant to me indeed. I am testing the patch...
Thanks ! Yann Le ven. 26 août 2022 à 13:36, Oleg Nesterov <o...@redhat.com> a écrit : > Stephane, Yann, > > Can I suggest this patch for inclusion? > > With this patch you can declare ffargtype() as "any", which means it > can accept "int" or "float" without type conversion. This can be used > when ffunction() is actually a macro or even a compiler builtin. > > For example, > > sizeof = ffunction(int sizeof(any), "",""); > > process = +(1)~_ <: _,!=(0), /(2) : par(i,3, sizeof); > > compiled with -double outputs > > 4 1 8 > > Oleg. > --- > > diff --git a/compiler/parser/faustlexer.l b/compiler/parser/faustlexer.l > index 38b43c4df..923179765 100644 > --- a/compiler/parser/faustlexer.l > +++ b/compiler/parser/faustlexer.l > @@ -142,6 +142,7 @@ TMACRO \\{ID}(\[(\ *({ID}|{NUMBER}),?\ *)\])?(\{(\ > *({ID}|{NUMBER}),?\ *)*\})* > > "int" return INTCAST; > "float" return FLOATCAST; > +"any" return NOTYPECAST; > > "rdtable" return RDTBL; > "rwtable" return RWTBL; > diff --git a/compiler/parser/faustparser.y b/compiler/parser/faustparser.y > index f64258b4c..31063dae8 100644 > --- a/compiler/parser/faustparser.y > +++ b/compiler/parser/faustparser.y > @@ -131,6 +131,7 @@ inline Tree unquote(char* str) > > %token INTCAST > %token FLOATCAST > +%token NOTYPECAST > %token FFUNCTION > %token FCONSTANT > %token FVARIABLE > @@ -297,6 +298,7 @@ inline Tree unquote(char* str) > %type <exp> fstring > %type <exp> type > %type <exp> typelist > +%type <exp> argtype > %type <exp> fun > > %type <exp> fpar > @@ -728,8 +730,8 @@ signature : type fun LPAR typelist RPAR > { $$ = cons($1, cons(cons > fun : IDENT > { $$ = tree(yytext); } > ; > > -typelist : type > { $$ = cons($1,gGlobal->nil); } > - | typelist PAR type > { $$ = cons($3,$1); } > +typelist : argtype > { $$ = cons($1,gGlobal->nil); } > + | typelist PAR argtype { > $$ = cons($3,$1); } > ; > > rulelist : rule > { $$ = cons($1,gGlobal->nil); } > @@ -744,4 +746,9 @@ type : INTCAST > { $$ = tree(0); } > | FLOATCAST > { $$ = tree(1); } > ; > > +argtype : INTCAST { $$ = > tree(0); } > + | FLOATCAST > { $$ = tree(1); } > + | NOTYPECAST > { $$ = tree(2); } > + ; > + > %% > diff --git a/compiler/signals/sigtype.hh b/compiler/signals/sigtype.hh > index 6cb1fb397..43e9ba66a 100644 > --- a/compiler/signals/sigtype.hh > +++ b/compiler/signals/sigtype.hh > @@ -48,7 +48,7 @@ > //-------------------------------------------------- > // simple types quality > > -enum { kInt = 0, kReal = 1 }; ///< nature : integer or floating point > values > +enum { kInt = 0, kReal = 1, kAny = 2 }; ///< nature : integer or > floating point values > enum { > kNum = 0, > kBool = 1 > diff --git a/compiler/transform/sigPromotion.cpp > b/compiler/transform/sigPromotion.cpp > index fc4fa927d..1f1265db2 100644 > --- a/compiler/transform/sigPromotion.cpp > +++ b/compiler/transform/sigPromotion.cpp > @@ -66,7 +66,8 @@ void SignalTreeChecker::visit(Tree sig) > } else if (isSigFFun(sig, ff, args)) { > int len = ffarity(ff) - 1; > for (int i = 0; i < ffarity(ff); i++) { > - if (getCertifiedSigType(nth(args, i))->nature() != > ffargtype(ff, len - i)) { > + int type = ffargtype(ff, len - i); > + if (getCertifiedSigType(nth(args, i))->nature() != type && > type != kAny) { > cerr << "ERROR : isSigFFun of args with incoherent types > : " << *sig << endl; > faustassert(false); > } > @@ -319,6 +320,8 @@ Tree SignalPromotion::cast(int t, Tree sig) > return sigFloatCast(sig); > } else if (t == kInt) { > return sigIntCast(sig); > + } else if (t == kAny) { > + return sig; > } else { > faustassert(false); > return nullptr; > >
_______________________________________________ Faudiostream-devel mailing list Faudiostream-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-devel