From a0f5633e2cd87648b06db926d94e1e317fa0a99f Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jancsika@yahoo.com>
Date: Thu, 31 Jul 2014 15:21:06 -0400
Subject: [PATCH] *ported fixes for crasher when sending a "dsp" message to
 tilde objects.  Backported from Pd Vanilla commits [8019b5] and [5769c5]

---
 pd/src/d_arithmetic.c | 24 +++++++++++------------
 pd/src/d_array.c      | 15 ++++++++-------
 pd/src/d_ctl.c        | 17 +++++++++-------
 pd/src/d_delay.c      |  6 +++---
 pd/src/d_fft.c        | 15 ++++++++++-----
 pd/src/d_filter.c     | 26 ++++++++++++++-----------
 pd/src/d_global.c     | 11 +++++++----
 pd/src/d_math.c       | 45 ++++++++++++++++++++++++++++---------------
 pd/src/d_osc.c        | 12 +++++++-----
 pd/src/d_soundfile.c  |  6 ++++--
 pd/src/d_ugen.c       |  2 +-
 pd/src/g_canvas.c     |  3 ++-
 pd/src/g_io.c         |  6 ++++--
 pd/src/m_class.c      |  3 +++
 14 files changed, 115 insertions(+), 76 deletions(-)

diff --git a/pd/src/d_arithmetic.c b/pd/src/d_arithmetic.c
index 02671e36c..c79f43470 100644
--- a/pd/src/d_arithmetic.c
+++ b/pd/src/d_arithmetic.c
@@ -132,14 +132,14 @@ static void plus_setup(void)
 {
     plus_class = class_new(gensym("+~"), (t_newmethod)plus_new, 0,
         sizeof(t_plus), 0, A_GIMME, 0);
-    class_addmethod(plus_class, (t_method)plus_dsp, gensym("dsp"), 0);
+    class_addmethod(plus_class, (t_method)plus_dsp, gensym("dsp"), A_CANT, 0);
     CLASS_MAINSIGNALIN(plus_class, t_plus, x_f);
     class_sethelpsymbol(plus_class, gensym("sigbinops"));
     scalarplus_class = class_new(gensym("+~"), 0, 0,
         sizeof(t_scalarplus), 0, 0);
     CLASS_MAINSIGNALIN(scalarplus_class, t_scalarplus, x_f);
     class_addmethod(scalarplus_class, (t_method)scalarplus_dsp, gensym("dsp"),
-        0);
+        A_CANT, 0);
     class_sethelpsymbol(scalarplus_class, gensym("sigbinops"));
 }
 
@@ -263,13 +263,13 @@ static void minus_setup(void)
     minus_class = class_new(gensym("-~"), (t_newmethod)minus_new, 0,
         sizeof(t_minus), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(minus_class, t_minus, x_f);
-    class_addmethod(minus_class, (t_method)minus_dsp, gensym("dsp"), 0);
+    class_addmethod(minus_class, (t_method)minus_dsp, gensym("dsp"), A_CANT, 0);
     class_sethelpsymbol(minus_class, gensym("sigbinops"));
     scalarminus_class = class_new(gensym("-~"), 0, 0,
         sizeof(t_scalarminus), 0, 0);
     CLASS_MAINSIGNALIN(scalarminus_class, t_scalarminus, x_f);
     class_addmethod(scalarminus_class, (t_method)scalarminus_dsp, gensym("dsp"),
-        0);
+        A_CANT, 0);
     class_sethelpsymbol(scalarminus_class, gensym("sigbinops"));
 }
 
@@ -394,13 +394,13 @@ static void times_setup(void)
     times_class = class_new(gensym("*~"), (t_newmethod)times_new, 0,
         sizeof(t_times), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(times_class, t_times, x_f);
-    class_addmethod(times_class, (t_method)times_dsp, gensym("dsp"), 0);
+    class_addmethod(times_class, (t_method)times_dsp, gensym("dsp"), A_CANT, 0);
     class_sethelpsymbol(times_class, gensym("sigbinops"));
     scalartimes_class = class_new(gensym("*~"), 0, 0,
         sizeof(t_scalartimes), 0, 0);
     CLASS_MAINSIGNALIN(scalartimes_class, t_scalartimes, x_f);
     class_addmethod(scalartimes_class, (t_method)scalartimes_dsp, gensym("dsp"),
-        0);
+        A_CANT, 0);
     class_sethelpsymbol(scalartimes_class, gensym("sigbinops"));
 }
 
@@ -536,13 +536,13 @@ static void over_setup(void)
     over_class = class_new(gensym("/~"), (t_newmethod)over_new, 0,
         sizeof(t_over), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(over_class, t_over, x_f);
-    class_addmethod(over_class, (t_method)over_dsp, gensym("dsp"), 0);
+    class_addmethod(over_class, (t_method)over_dsp, gensym("dsp"), A_CANT, 0);
     class_sethelpsymbol(over_class, gensym("sigbinops"));
     scalarover_class = class_new(gensym("/~"), 0, 0,
         sizeof(t_scalarover), 0, 0);
     CLASS_MAINSIGNALIN(scalarover_class, t_scalarover, x_f);
     class_addmethod(scalarover_class, (t_method)scalarover_dsp, gensym("dsp"),
-        0);
+        A_CANT, 0);
     class_sethelpsymbol(scalarover_class, gensym("sigbinops"));
 }
 
@@ -678,13 +678,13 @@ static void max_setup(void)
     max_class = class_new(gensym("max~"), (t_newmethod)max_new, 0,
         sizeof(t_max), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(max_class, t_max, x_f);
-    class_addmethod(max_class, (t_method)max_dsp, gensym("dsp"), 0);
+    class_addmethod(max_class, (t_method)max_dsp, gensym("dsp"), A_CANT, 0);
     class_sethelpsymbol(max_class, gensym("sigbinops"));
     scalarmax_class = class_new(gensym("max~"), 0, 0,
         sizeof(t_scalarmax), 0, 0);
     CLASS_MAINSIGNALIN(scalarmax_class, t_scalarmax, x_f);
     class_addmethod(scalarmax_class, (t_method)scalarmax_dsp, gensym("dsp"),
-        0);
+        A_CANT, 0);
     class_sethelpsymbol(scalarmax_class, gensym("sigbinops"));
 }
 
@@ -820,13 +820,13 @@ static void min_setup(void)
     min_class = class_new(gensym("min~"), (t_newmethod)min_new, 0,
         sizeof(t_min), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(min_class, t_min, x_f);
-    class_addmethod(min_class, (t_method)min_dsp, gensym("dsp"), 0);
+    class_addmethod(min_class, (t_method)min_dsp, gensym("dsp"), A_CANT, 0);
     class_sethelpsymbol(min_class, gensym("sigbinops"));
     scalarmin_class = class_new(gensym("min~"), 0, 0,
         sizeof(t_scalarmin), 0, 0);
     CLASS_MAINSIGNALIN(scalarmin_class, t_scalarmin, x_f);
     class_addmethod(scalarmin_class, (t_method)scalarmin_dsp, gensym("dsp"),
-        0);
+        A_CANT, 0);
     class_sethelpsymbol(scalarmin_class, gensym("sigbinops"));
 }
 
diff --git a/pd/src/d_array.c b/pd/src/d_array.c
index 11a55b5de..b026669a7 100644
--- a/pd/src/d_array.c
+++ b/pd/src/d_array.c
@@ -125,7 +125,7 @@ static void tabwrite_tilde_setup(void)
         sizeof(t_tabwrite_tilde), 0, A_DEFSYM, 0);
     CLASS_MAINSIGNALIN(tabwrite_tilde_class, t_tabwrite_tilde, x_f);
     class_addmethod(tabwrite_tilde_class, (t_method)tabwrite_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(tabwrite_tilde_class, (t_method)tabwrite_tilde_set,
         gensym("set"), A_SYMBOL, 0);
     class_addmethod(tabwrite_tilde_class, (t_method)tabwrite_tilde_stop,
@@ -258,7 +258,7 @@ static void tabplay_tilde_setup(void)
         (t_newmethod)tabplay_tilde_new, (t_method)tabplay_tilde_free,
         sizeof(t_tabplay_tilde), 0, A_DEFSYM, 0);
     class_addmethod(tabplay_tilde_class, (t_method)tabplay_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(tabplay_tilde_class, (t_method)tabplay_tilde_stop,
         gensym("stop"), 0);
     class_addmethod(tabplay_tilde_class, (t_method)tabplay_tilde_set,
@@ -357,7 +357,7 @@ static void tabread_tilde_setup(void)
         sizeof(t_tabread_tilde), 0, A_DEFSYM, 0);
     CLASS_MAINSIGNALIN(tabread_tilde_class, t_tabread_tilde, x_f);
     class_addmethod(tabread_tilde_class, (t_method)tabread_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(tabread_tilde_class, (t_method)tabread_tilde_set,
         gensym("set"), A_SYMBOL, 0);
 }
@@ -488,7 +488,7 @@ static void tabread4_tilde_setup(void)
         sizeof(t_tabread4_tilde), 0, A_DEFSYM, 0);
     CLASS_MAINSIGNALIN(tabread4_tilde_class, t_tabread4_tilde, x_f);
     class_addmethod(tabread4_tilde_class, (t_method)tabread4_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(tabread4_tilde_class, (t_method)tabread4_tilde_set,
         gensym("set"), A_SYMBOL, 0);
 }
@@ -678,7 +678,7 @@ static void tabosc4_tilde_setup(void)
         sizeof(t_tabosc4_tilde), 0, A_DEFSYM, 0);
     CLASS_MAINSIGNALIN(tabosc4_tilde_class, t_tabosc4_tilde, x_f);
     class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_set,
         gensym("set"), A_SYMBOL, 0);
     class_addmethod(tabosc4_tilde_class, (t_method)tabosc4_tilde_ft1,
@@ -769,7 +769,8 @@ static void tabsend_setup(void)
     tabsend_class = class_new(gensym("tabsend~"), (t_newmethod)tabsend_new,
         0, sizeof(t_tabsend), 0, A_DEFSYM, 0);
     CLASS_MAINSIGNALIN(tabsend_class, t_tabsend, x_f);
-    class_addmethod(tabsend_class, (t_method)tabsend_dsp, gensym("dsp"), 0);
+    class_addmethod(tabsend_class, (t_method)tabsend_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ------------------------ tabreceive~ ------------------------- */
@@ -836,7 +837,7 @@ static void tabreceive_setup(void)
         (t_newmethod)tabreceive_new, 0,
         sizeof(t_tabreceive), 0, A_DEFSYM, 0);
     class_addmethod(tabreceive_class, (t_method)tabreceive_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ---------- tabread: control, non-interpolating ------------------------ */
diff --git a/pd/src/d_ctl.c b/pd/src/d_ctl.c
index 92467abe0..bbc2042ab 100644
--- a/pd/src/d_ctl.c
+++ b/pd/src/d_ctl.c
@@ -79,7 +79,8 @@ static void sig_tilde_setup(void)
     sig_tilde_class = class_new(gensym("sig~"), (t_newmethod)sig_tilde_new, 0,
         sizeof(t_sig), 0, A_DEFFLOAT, 0);
     class_addfloat(sig_tilde_class, (t_method)sig_tilde_float);
-    class_addmethod(sig_tilde_class, (t_method)sig_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(sig_tilde_class, (t_method)sig_tilde_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* -------------------------- line~ ------------------------------ */
@@ -220,7 +221,7 @@ static void line_tilde_setup(void)
         sizeof(t_line), 0, 0);
     class_addfloat(line_tilde_class, (t_method)line_tilde_float);
     class_addmethod(line_tilde_class, (t_method)line_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(line_tilde_class, (t_method)line_tilde_stop,
         gensym("stop"), 0);
 }
@@ -404,7 +405,7 @@ static void vline_tilde_setup(void)
         (t_method)vline_tilde_stop, sizeof(t_vline), 0, 0);
     class_addfloat(vline_tilde_class, (t_method)vline_tilde_float);
     class_addmethod(vline_tilde_class, (t_method)vline_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(vline_tilde_class, (t_method)vline_tilde_stop,
         gensym("stop"), 0);
 }
@@ -458,7 +459,7 @@ static void snapshot_tilde_setup(void)
         sizeof(t_snapshot), 0, 0);
     CLASS_MAINSIGNALIN(snapshot_tilde_class, t_snapshot, x_f);
     class_addmethod(snapshot_tilde_class, (t_method)snapshot_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(snapshot_tilde_class, (t_method)snapshot_tilde_set,
         gensym("set"), A_DEFFLOAT, 0);
     class_addbang(snapshot_tilde_class, snapshot_tilde_bang);
@@ -545,7 +546,8 @@ static void vsnapshot_tilde_setup(void)
         vsnapshot_tilde_new, (t_method)vsnapshot_tilde_ff,
         sizeof(t_vsnapshot), 0, 0);
     CLASS_MAINSIGNALIN(vsnapshot_tilde_class, t_vsnapshot, x_f);
-    class_addmethod(vsnapshot_tilde_class, (t_method)vsnapshot_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(vsnapshot_tilde_class, (t_method)vsnapshot_tilde_dsp,
+        gensym("dsp"), A_CANT, 0);
     class_addbang(vsnapshot_tilde_class, vsnapshot_tilde_bang);
 }
 
@@ -683,7 +685,8 @@ void env_tilde_setup(void )
     env_tilde_class = class_new(gensym("env~"), (t_newmethod)env_tilde_new,
         (t_method)env_tilde_ff, sizeof(t_sigenv), 0, A_DEFFLOAT, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(env_tilde_class, t_sigenv, x_f);
-    class_addmethod(env_tilde_class, (t_method)env_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(env_tilde_class, (t_method)env_tilde_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* --------------------- threshold~ ----------------------------- */
@@ -818,7 +821,7 @@ static void threshold_tilde_setup( void)
     class_addmethod(threshold_tilde_class, (t_method)threshold_tilde_ft1,
         gensym("ft1"), A_FLOAT, 0);
     class_addmethod(threshold_tilde_class, (t_method)threshold_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ------------------------ global setup routine ------------------------- */
diff --git a/pd/src/d_delay.c b/pd/src/d_delay.c
index ee621fbde..93ed90e8a 100644
--- a/pd/src/d_delay.c
+++ b/pd/src/d_delay.c
@@ -134,7 +134,7 @@ static void sigdelwrite_setup(void)
         sizeof(t_sigdelwrite), 0, A_DEFSYM, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(sigdelwrite_class, t_sigdelwrite, x_f);
     class_addmethod(sigdelwrite_class, (t_method)sigdelwrite_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addmethod(sigdelwrite_class, (t_method)sigdelwrite_clear,
         gensym("clear"), 0);
 }
@@ -228,7 +228,7 @@ static void sigdelread_setup(void)
         (t_newmethod)sigdelread_new, 0,
         sizeof(t_sigdelread), 0, A_DEFSYM, A_DEFFLOAT, 0);
     class_addmethod(sigdelread_class, (t_method)sigdelread_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
     class_addfloat(sigdelread_class, (t_method)sigdelread_float);
 }
 
@@ -318,7 +318,7 @@ static void sigvd_setup(void)
 {
     sigvd_class = class_new(gensym("vd~"), (t_newmethod)sigvd_new, 0,
         sizeof(t_sigvd), 0, A_DEFSYM, 0);
-    class_addmethod(sigvd_class, (t_method)sigvd_dsp, gensym("dsp"), 0);
+    class_addmethod(sigvd_class, (t_method)sigvd_dsp, gensym("dsp"), A_CANT, 0);
     CLASS_MAINSIGNALIN(sigvd_class, t_sigvd, x_f);
 }
 
diff --git a/pd/src/d_fft.c b/pd/src/d_fft.c
index 464f48d10..f4c92c6d3 100644
--- a/pd/src/d_fft.c
+++ b/pd/src/d_fft.c
@@ -126,12 +126,14 @@ static void sigfft_setup(void)
     sigfft_class = class_new(gensym("fft~"), sigfft_new, 0,
         sizeof(t_sigfft), 0, 0);
     CLASS_MAINSIGNALIN(sigfft_class, t_sigfft, x_f);
-    class_addmethod(sigfft_class, (t_method)sigfft_dsp, gensym("dsp"), 0);
+    class_addmethod(sigfft_class, (t_method)sigfft_dsp, gensym("dsp"),
+        A_CANT, 0);
 
     sigifft_class = class_new(gensym("ifft~"), sigifft_new, 0,
         sizeof(t_sigfft), 0, 0);
     CLASS_MAINSIGNALIN(sigifft_class, t_sigfft, x_f);
-    class_addmethod(sigifft_class, (t_method)sigifft_dsp, gensym("dsp"), 0);
+    class_addmethod(sigifft_class, (t_method)sigifft_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_sethelpsymbol(sigifft_class, gensym("fft~"));
 }
 
@@ -188,7 +190,8 @@ static void sigrfft_setup(void)
     sigrfft_class = class_new(gensym("rfft~"), sigrfft_new, 0,
         sizeof(t_sigrfft), 0, 0);
     CLASS_MAINSIGNALIN(sigrfft_class, t_sigrfft, x_f);
-    class_addmethod(sigrfft_class, (t_method)sigrfft_dsp, gensym("dsp"), 0);
+    class_addmethod(sigrfft_class, (t_method)sigrfft_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_sethelpsymbol(sigrfft_class, gensym("fft~"));
 }
 
@@ -248,7 +251,8 @@ static void sigrifft_setup(void)
     sigrifft_class = class_new(gensym("rifft~"), sigrifft_new, 0,
         sizeof(t_sigrifft), 0, 0);
     CLASS_MAINSIGNALIN(sigrifft_class, t_sigrifft, x_f);
-    class_addmethod(sigrifft_class, (t_method)sigrifft_dsp, gensym("dsp"), 0);
+    class_addmethod(sigrifft_class, (t_method)sigrifft_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_sethelpsymbol(sigrifft_class, gensym("fft~"));
 }
 
@@ -336,7 +340,8 @@ static void sigframp_setup(void)
     sigframp_class = class_new(gensym("framp~"), sigframp_new, 0,
         sizeof(t_sigframp), 0, 0);
     CLASS_MAINSIGNALIN(sigframp_class, t_sigframp, x_f);
-    class_addmethod(sigframp_class, (t_method)sigframp_dsp, gensym("dsp"), 0);
+    class_addmethod(sigframp_class, (t_method)sigframp_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ------------------------ global setup routine ------------------------- */
diff --git a/pd/src/d_filter.c b/pd/src/d_filter.c
index 18b3b145d..618f2ac30 100644
--- a/pd/src/d_filter.c
+++ b/pd/src/d_filter.c
@@ -102,7 +102,8 @@ void sighip_setup(void)
     sighip_class = class_new(gensym("hip~"), (t_newmethod)sighip_new, 0,
         sizeof(t_sighip), 0, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(sighip_class, t_sighip, x_f);
-    class_addmethod(sighip_class, (t_method)sighip_dsp, gensym("dsp"), 0);
+    class_addmethod(sighip_class, (t_method)sighip_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_addmethod(sighip_class, (t_method)sighip_ft1,
         gensym("ft1"), A_FLOAT, 0);
     class_addmethod(sighip_class, (t_method)sighip_clear, gensym("clear"), 0);
@@ -192,7 +193,8 @@ void siglop_setup(void)
     siglop_class = class_new(gensym("lop~"), (t_newmethod)siglop_new, 0,
         sizeof(t_siglop), 0, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(siglop_class, t_siglop, x_f);
-    class_addmethod(siglop_class, (t_method)siglop_dsp, gensym("dsp"), 0);
+    class_addmethod(siglop_class, (t_method)siglop_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_addmethod(siglop_class, (t_method)siglop_ft1,
         gensym("ft1"), A_FLOAT, 0);
     class_addmethod(siglop_class, (t_method)siglop_clear, gensym("clear"), 0);
@@ -326,7 +328,8 @@ void sigbp_setup(void)
     sigbp_class = class_new(gensym("bp~"), (t_newmethod)sigbp_new, 0,
         sizeof(t_sigbp), 0, A_DEFFLOAT, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(sigbp_class, t_sigbp, x_f);
-    class_addmethod(sigbp_class, (t_method)sigbp_dsp, gensym("dsp"), 0);
+    class_addmethod(sigbp_class, (t_method)sigbp_dsp, gensym("dsp"),
+        A_CANT,  0);
     class_addmethod(sigbp_class, (t_method)sigbp_ft1,
         gensym("ft1"), A_FLOAT, 0);
     class_addmethod(sigbp_class, (t_method)sigbp_ft2,
@@ -452,7 +455,8 @@ void sigbiquad_setup(void)
     sigbiquad_class = class_new(gensym("biquad~"), (t_newmethod)sigbiquad_new,
         0, sizeof(t_sigbiquad), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(sigbiquad_class, t_sigbiquad, x_f);
-    class_addmethod(sigbiquad_class, (t_method)sigbiquad_dsp, gensym("dsp"), 0);
+    class_addmethod(sigbiquad_class, (t_method)sigbiquad_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_addlist(sigbiquad_class, sigbiquad_list);
     class_addmethod(sigbiquad_class, (t_method)sigbiquad_set, gensym("set"),
         A_GIMME, 0);
@@ -534,7 +538,7 @@ void sigsamphold_setup(void)
     class_addmethod(sigsamphold_class, (t_method)sigsamphold_reset,
         gensym("reset"), A_GIMME, 0);
     class_addmethod(sigsamphold_class, (t_method)sigsamphold_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ---------------- rpole~ - real one-pole filter (raw) ----------------- */
@@ -607,7 +611,7 @@ void sigrpole_setup(void)
     class_addmethod(sigrpole_class, (t_method)sigrpole_clear,
         gensym("clear"), 0);
     class_addmethod(sigrpole_class, (t_method)sigrpole_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ---------------- rzero~ - real one-zero filter (raw) ----------------- */
@@ -679,7 +683,7 @@ void sigrzero_setup(void)
     class_addmethod(sigrzero_class, (t_method)sigrzero_clear,
         gensym("clear"), 0);
     class_addmethod(sigrzero_class, (t_method)sigrzero_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ---------- rzero_rev~ - real, reverse one-zero filter (raw) ------------ */
@@ -752,7 +756,7 @@ void sigrzero_rev_setup(void)
     class_addmethod(sigrzero_rev_class, (t_method)sigrzero_rev_clear,
         gensym("clear"), 0);
     class_addmethod(sigrzero_rev_class, (t_method)sigrzero_rev_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* -------------- cpole~ - complex one-pole filter (raw) --------------- */
@@ -845,7 +849,7 @@ void sigcpole_setup(void)
     class_addmethod(sigcpole_class, (t_method)sigcpole_clear,
         gensym("clear"), 0);
     class_addmethod(sigcpole_class, (t_method)sigcpole_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* -------------- czero~ - complex one-pole filter (raw) --------------- */
@@ -935,7 +939,7 @@ void sigczero_setup(void)
     class_addmethod(sigczero_class, (t_method)sigczero_clear,
         gensym("clear"), 0);
     class_addmethod(sigczero_class, (t_method)sigczero_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* -------------- czero_rev~ - complex one-pole filter (raw) --------------- */
@@ -1027,7 +1031,7 @@ void sigczero_rev_setup(void)
     class_addmethod(sigczero_rev_class, (t_method)sigczero_rev_clear,
         gensym("clear"), 0);
     class_addmethod(sigczero_rev_class, (t_method)sigczero_rev_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ------------------------ setup routine ------------------------- */
diff --git a/pd/src/d_global.c b/pd/src/d_global.c
index b9a7cae10..af6843aaf 100644
--- a/pd/src/d_global.c
+++ b/pd/src/d_global.c
@@ -66,7 +66,8 @@ static void sigsend_setup(void)
         (t_method)sigsend_free, sizeof(t_sigsend), 0, A_DEFSYM, 0);
     class_addcreator((t_newmethod)sigsend_new, gensym("s~"), A_DEFSYM, 0);
     CLASS_MAINSIGNALIN(sigsend_class, t_sigsend, x_f);
-    class_addmethod(sigsend_class, (t_method)sigsend_dsp, gensym("dsp"), 0);
+    class_addmethod(sigsend_class, (t_method)sigsend_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ----------------------------- receive~ ----------------------------- */
@@ -182,7 +183,7 @@ static void sigreceive_setup(void)
     class_addmethod(sigreceive_class, (t_method)sigreceive_set, gensym("set"),
         A_SYMBOL, 0);
     class_addmethod(sigreceive_class, (t_method)sigreceive_dsp, gensym("dsp"),
-        0);
+        A_CANT, 0);
     class_sethelpsymbol(sigreceive_class, gensym("send~"));
 }
 
@@ -257,7 +258,8 @@ static void sigcatch_setup(void)
 {
     sigcatch_class = class_new(gensym("catch~"), (t_newmethod)sigcatch_new,
         (t_method)sigcatch_free, sizeof(t_sigcatch), CLASS_NOINLET, A_DEFSYM, 0);
-    class_addmethod(sigcatch_class, (t_method)sigcatch_dsp, gensym("dsp"), 0);
+    class_addmethod(sigcatch_class, (t_method)sigcatch_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_sethelpsymbol(sigcatch_class, gensym("throw~"));
 }
 
@@ -343,7 +345,8 @@ static void sigthrow_setup(void)
     class_addmethod(sigthrow_class, (t_method)sigthrow_set, gensym("set"),
         A_SYMBOL, 0);
     CLASS_MAINSIGNALIN(sigthrow_class, t_sigthrow, x_f);
-    class_addmethod(sigthrow_class, (t_method)sigthrow_dsp, gensym("dsp"), 0);
+    class_addmethod(sigthrow_class, (t_method)sigthrow_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ----------------------- global setup routine ---------------- */
diff --git a/pd/src/d_math.c b/pd/src/d_math.c
index 387e0752a..3c75a9465 100644
--- a/pd/src/d_math.c
+++ b/pd/src/d_math.c
@@ -59,7 +59,7 @@ static void clip_setup(void)
     clip_class = class_new(gensym("clip~"), (t_newmethod)clip_new, 0,
         sizeof(t_clip), 0, A_DEFFLOAT, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(clip_class, t_clip, x_f);
-    class_addmethod(clip_class, (t_method)clip_dsp, gensym("dsp"), 0);
+    class_addmethod(clip_class, (t_method)clip_dsp, gensym("dsp"), A_CANT, 0);
 }
 
 /* sigrsqrt - reciprocal square root good to 8 mantissa bits  */
@@ -171,7 +171,8 @@ void sigrsqrt_setup(void)
             /* an old name for it: */
     class_addcreator(sigrsqrt_new, gensym("q8_rsqrt~"), 0);
     CLASS_MAINSIGNALIN(sigrsqrt_class, t_sigrsqrt, x_f);
-    class_addmethod(sigrsqrt_class, (t_method)sigrsqrt_dsp, gensym("dsp"), 0);
+    class_addmethod(sigrsqrt_class, (t_method)sigrsqrt_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 
@@ -223,7 +224,8 @@ void sigsqrt_setup(void)
         sizeof(t_sigsqrt), 0, 0);
     class_addcreator(sigsqrt_new, gensym("q8_sqrt~"), 0);   /* old name */
     CLASS_MAINSIGNALIN(sigsqrt_class, t_sigsqrt, x_f);
-    class_addmethod(sigsqrt_class, (t_method)sigsqrt_dsp, gensym("dsp"), 0);
+    class_addmethod(sigsqrt_class, (t_method)sigsqrt_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ------------------------------ wrap~ -------------------------- */
@@ -268,7 +270,8 @@ void sigwrap_setup(void)
     sigwrap_class = class_new(gensym("wrap~"), (t_newmethod)sigwrap_new, 0,
         sizeof(t_sigwrap), 0, 0);
     CLASS_MAINSIGNALIN(sigwrap_class, t_sigwrap, x_f);
-    class_addmethod(sigwrap_class, (t_method)sigwrap_dsp, gensym("dsp"), 0);
+    class_addmethod(sigwrap_class, (t_method)sigwrap_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ------------------------------ mtof_tilde~ -------------------------- */
@@ -316,7 +319,8 @@ void mtof_tilde_setup(void)
     mtof_tilde_class = class_new(gensym("mtof~"), (t_newmethod)mtof_tilde_new, 0,
         sizeof(t_mtof_tilde), 0, 0);
     CLASS_MAINSIGNALIN(mtof_tilde_class, t_mtof_tilde, x_f);
-    class_addmethod(mtof_tilde_class, (t_method)mtof_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(mtof_tilde_class, (t_method)mtof_tilde_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ------------------------------ ftom_tilde~ -------------------------- */
@@ -359,7 +363,8 @@ void ftom_tilde_setup(void)
     ftom_tilde_class = class_new(gensym("ftom~"), (t_newmethod)ftom_tilde_new, 0,
         sizeof(t_ftom_tilde), 0, 0);
     CLASS_MAINSIGNALIN(ftom_tilde_class, t_ftom_tilde, x_f);
-    class_addmethod(ftom_tilde_class, (t_method)ftom_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(ftom_tilde_class, (t_method)ftom_tilde_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ------------------------------ dbtorms~ -------------------------- */
@@ -408,7 +413,8 @@ void dbtorms_tilde_setup(void)
     dbtorms_tilde_class = class_new(gensym("dbtorms~"), (t_newmethod)dbtorms_tilde_new, 0,
         sizeof(t_dbtorms_tilde), 0, 0);
     CLASS_MAINSIGNALIN(dbtorms_tilde_class, t_dbtorms_tilde, x_f);
-    class_addmethod(dbtorms_tilde_class, (t_method)dbtorms_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(dbtorms_tilde_class, (t_method)dbtorms_tilde_dsp,
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ------------------------------ rmstodb~ -------------------------- */
@@ -456,7 +462,8 @@ void rmstodb_tilde_setup(void)
     rmstodb_tilde_class = class_new(gensym("rmstodb~"), (t_newmethod)rmstodb_tilde_new, 0,
         sizeof(t_rmstodb_tilde), 0, 0);
     CLASS_MAINSIGNALIN(rmstodb_tilde_class, t_rmstodb_tilde, x_f);
-    class_addmethod(rmstodb_tilde_class, (t_method)rmstodb_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(rmstodb_tilde_class, (t_method)rmstodb_tilde_dsp,
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ------------------------------ dbtopow~ -------------------------- */
@@ -505,7 +512,8 @@ void dbtopow_tilde_setup(void)
     dbtopow_tilde_class = class_new(gensym("dbtopow~"), (t_newmethod)dbtopow_tilde_new, 0,
         sizeof(t_dbtopow_tilde), 0, 0);
     CLASS_MAINSIGNALIN(dbtopow_tilde_class, t_dbtopow_tilde, x_f);
-    class_addmethod(dbtopow_tilde_class, (t_method)dbtopow_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(dbtopow_tilde_class, (t_method)dbtopow_tilde_dsp,
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ------------------------------ powtodb~ -------------------------- */
@@ -553,7 +561,8 @@ void powtodb_tilde_setup(void)
     powtodb_tilde_class = class_new(gensym("powtodb~"), (t_newmethod)powtodb_tilde_new, 0,
         sizeof(t_powtodb_tilde), 0, 0);
     CLASS_MAINSIGNALIN(powtodb_tilde_class, t_powtodb_tilde, x_f);
-    class_addmethod(powtodb_tilde_class, (t_method)powtodb_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(powtodb_tilde_class, (t_method)powtodb_tilde_dsp,
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ----------------------------- pow ----------------------------- */
@@ -647,12 +656,13 @@ static void pow_tilde_setup(void)
     pow_tilde_class = class_new(gensym("pow~"), (t_newmethod)pow_tilde_new, 0,
         sizeof(t_pow_tilde), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(pow_tilde_class, t_pow_tilde, x_f);
-    class_addmethod(pow_tilde_class, (t_method)pow_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(pow_tilde_class, (t_method)pow_tilde_dsp, gensym("dsp"),
+        A_CANT, 0);
     scalarpow_tilde_class = class_new(gensym("pow~"), 0, 0,
         sizeof(t_scalarpow_tilde), 0, 0);
     CLASS_MAINSIGNALIN(scalarpow_tilde_class, t_scalarpow_tilde, x_f);
     class_addmethod(scalarpow_tilde_class, (t_method)scalarpow_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ----------------------------- exp ----------------------------- */
@@ -692,7 +702,8 @@ static void exp_tilde_setup(void)
     exp_tilde_class = class_new(gensym("exp~"), (t_newmethod)exp_tilde_new, 0,
         sizeof(t_exp_tilde), 0, 0);
     CLASS_MAINSIGNALIN(exp_tilde_class, t_exp_tilde, x_f);
-    class_addmethod(exp_tilde_class, (t_method)exp_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(exp_tilde_class, (t_method)exp_tilde_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ----------------------------- log ----------------------------- */
@@ -791,13 +802,14 @@ static void log_tilde_setup(void)
     log_tilde_class = class_new(gensym("log~"), (t_newmethod)log_tilde_new, 0,
         sizeof(t_log_tilde), 0, A_GIMME, 0);
     CLASS_MAINSIGNALIN(log_tilde_class, t_log_tilde, x_f);
-    class_addmethod(log_tilde_class, (t_method)log_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(log_tilde_class, (t_method)log_tilde_dsp, gensym("dsp"),
+        A_CANT, 0);
 
     scalarlog_tilde_class = class_new(gensym("log~"), 0, 0,
         sizeof(t_scalarlog_tilde), 0, 0);
     CLASS_MAINSIGNALIN(scalarlog_tilde_class, t_scalarlog_tilde, x_f);
     class_addmethod(scalarlog_tilde_class, (t_method)scalarlog_tilde_dsp,
-        gensym("dsp"), 0);
+        gensym("dsp"), A_CANT, 0);
 }
 
 /* ----------------------------- abs ----------------------------- */
@@ -840,7 +852,8 @@ static void abs_tilde_setup(void)
     abs_tilde_class = class_new(gensym("abs~"), (t_newmethod)abs_tilde_new, 0,
         sizeof(t_abs_tilde), 0, 0);
     CLASS_MAINSIGNALIN(abs_tilde_class, t_abs_tilde, x_f);
-    class_addmethod(abs_tilde_class, (t_method)abs_tilde_dsp, gensym("dsp"), 0);
+    class_addmethod(abs_tilde_class, (t_method)abs_tilde_dsp, gensym("dsp"),
+        A_CANT, 0);
 }
 
 /* ------------------------ global setup routine ------------------------- */
diff --git a/pd/src/d_osc.c b/pd/src/d_osc.c
index 8336dd344..100167e33 100644
--- a/pd/src/d_osc.c
+++ b/pd/src/d_osc.c
@@ -123,7 +123,8 @@ static void phasor_setup(void)
     phasor_class = class_new(gensym("phasor~"), (t_newmethod)phasor_new, 0,
         sizeof(t_phasor), 0, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(phasor_class, t_phasor, x_f);
-    class_addmethod(phasor_class, (t_method)phasor_dsp, gensym("dsp"), 0);
+    class_addmethod(phasor_class, (t_method)phasor_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_addmethod(phasor_class, (t_method)phasor_ft1,
         gensym("ft1"), A_FLOAT, 0);
 }
@@ -230,7 +231,7 @@ static void cos_setup(void)
     cos_class = class_new(gensym("cos~"), (t_newmethod)cos_new, 0,
         sizeof(t_cos), 0, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(cos_class, t_cos, x_f);
-    class_addmethod(cos_class, (t_method)cos_dsp, gensym("dsp"), 0);
+    class_addmethod(cos_class, (t_method)cos_dsp, gensym("dsp"), A_CANT, 0);
     cos_maketable();
 }
 
@@ -330,7 +331,7 @@ static void osc_setup(void)
     osc_class = class_new(gensym("osc~"), (t_newmethod)osc_new, 0,
         sizeof(t_osc), 0, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(osc_class, t_osc, x_f);
-    class_addmethod(osc_class, (t_method)osc_dsp, gensym("dsp"), 0);
+    class_addmethod(osc_class, (t_method)osc_dsp, gensym("dsp"), A_CANT, 0);
     class_addmethod(osc_class, (t_method)osc_ft1, gensym("ft1"), A_FLOAT, 0);
 
     cos_maketable();
@@ -454,7 +455,8 @@ void sigvcf_setup(void)
     sigvcf_class = class_new(gensym("vcf~"), (t_newmethod)sigvcf_new, 0,
         sizeof(t_sigvcf), 0, A_DEFFLOAT, 0);
     CLASS_MAINSIGNALIN(sigvcf_class, t_sigvcf, x_f);
-    class_addmethod(sigvcf_class, (t_method)sigvcf_dsp, gensym("dsp"), 0);
+    class_addmethod(sigvcf_class, (t_method)sigvcf_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_addmethod(sigvcf_class, (t_method)sigvcf_ft1,
         gensym("ft1"), A_FLOAT, 0);
 }
@@ -502,7 +504,7 @@ static void noise_setup(void)
 {
     noise_class = class_new(gensym("noise~"), (t_newmethod)noise_new, 0,
         sizeof(t_noise), 0, 0);
-    class_addmethod(noise_class, (t_method)noise_dsp, gensym("dsp"), 0);
+    class_addmethod(noise_class, (t_method)noise_dsp, gensym("dsp"), A_CANT, 0);
 }
 
 
diff --git a/pd/src/d_soundfile.c b/pd/src/d_soundfile.c
index 780952c91..53e71f2a6 100644
--- a/pd/src/d_soundfile.c
+++ b/pd/src/d_soundfile.c
@@ -2129,7 +2129,8 @@ static void readsf_setup(void)
     class_addfloat(readsf_class, (t_method)readsf_float);
     class_addmethod(readsf_class, (t_method)readsf_start, gensym("start"), 0);
     class_addmethod(readsf_class, (t_method)readsf_stop, gensym("stop"), 0);
-    class_addmethod(readsf_class, (t_method)readsf_dsp, gensym("dsp"), 0);
+    class_addmethod(readsf_class, (t_method)readsf_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_addmethod(readsf_class, (t_method)readsf_open, gensym("open"), 
         A_GIMME, 0);
     class_addmethod(readsf_class, (t_method)readsf_print, gensym("print"), 0);
@@ -2612,7 +2613,8 @@ static void writesf_setup(void)
         (t_method)writesf_free, sizeof(t_writesf), 0, A_DEFFLOAT, A_DEFFLOAT, 0);
     class_addmethod(writesf_class, (t_method)writesf_start, gensym("start"), 0);
     class_addmethod(writesf_class, (t_method)writesf_stop, gensym("stop"), 0);
-    class_addmethod(writesf_class, (t_method)writesf_dsp, gensym("dsp"), 0);
+    class_addmethod(writesf_class, (t_method)writesf_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_addmethod(writesf_class, (t_method)writesf_open, gensym("open"), 
         A_GIMME, 0);
     class_addmethod(writesf_class, (t_method)writesf_print, gensym("print"), 0);
diff --git a/pd/src/d_ugen.c b/pd/src/d_ugen.c
index fe49b7dee..c2b600a0d 100644
--- a/pd/src/d_ugen.c
+++ b/pd/src/d_ugen.c
@@ -286,7 +286,7 @@ void block_tilde_setup(void)
         A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
     class_addmethod(block_class, (t_method)block_set, gensym("set"), 
         A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0);
-    class_addmethod(block_class, (t_method)block_dsp, gensym("dsp"), 0);
+    class_addmethod(block_class, (t_method)block_dsp, gensym("dsp"), A_CANT, 0);
     class_addfloat(block_class, block_float);
     class_addbang(block_class, block_bang);
 }
diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 574870a68..58927c336 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -2322,7 +2322,8 @@ void g_canvas_setup(void)
 
     class_addmethod(canvas_class, (t_method)canvas_click,
         gensym("click"), A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(canvas_class, (t_method)canvas_dsp, gensym("dsp"), 0);
+    class_addmethod(canvas_class, (t_method)canvas_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_addmethod(canvas_class, (t_method)canvas_rename_method,
         gensym("rename"), A_GIMME, 0);
     class_addmethod(canvas_class, (t_method)canvas_forwardmess,
diff --git a/pd/src/g_io.c b/pd/src/g_io.c
index dd7583cc3..462c203d9 100644
--- a/pd/src/g_io.c
+++ b/pd/src/g_io.c
@@ -281,7 +281,8 @@ static void vinlet_setup(void)
     class_addsymbol(vinlet_class, vinlet_symbol);
     class_addlist(vinlet_class, vinlet_list);
     class_addanything(vinlet_class, vinlet_anything);
-    class_addmethod(vinlet_class, (t_method)vinlet_dsp, gensym("dsp"), 0);
+    class_addmethod(vinlet_class, (t_method)vinlet_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_sethelpsymbol(vinlet_class, gensym("pd"));
 }
 
@@ -593,7 +594,8 @@ static void voutlet_setup(void)
     class_addsymbol(voutlet_class, voutlet_symbol);
     class_addlist(voutlet_class, voutlet_list);
     class_addanything(voutlet_class, voutlet_anything);
-    class_addmethod(voutlet_class, (t_method)voutlet_dsp, gensym("dsp"), 0);
+    class_addmethod(voutlet_class, (t_method)voutlet_dsp, gensym("dsp"),
+        A_CANT, 0);
     class_sethelpsymbol(voutlet_class, gensym("pd"));
 }
 
diff --git a/pd/src/m_class.c b/pd/src/m_class.c
index 6d4a8f9c0..a0b2c9bd6 100644
--- a/pd/src/m_class.c
+++ b/pd/src/m_class.c
@@ -847,6 +847,9 @@ void pd_typedmess(t_pd *x, t_symbol *s, int argc, t_atom *argv)
                     }
                     narg++;
                     ap++;
+                    break;
+                default:
+                    goto badarg;
                 }
             }
             switch (narg)
-- 
GitLab