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