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

Reply via email to