Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11253
Modified Files: Tag: desiredata m_obj.c Log Message: shrunk by 200 lines
Index: m_obj.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/m_obj.c,v retrieving revision 1.2.4.3.2.10.2.4 retrieving revision 1.2.4.3.2.10.2.5 diff -C2 -d -r1.2.4.3.2.10.2.4 -r1.2.4.3.2.10.2.5 *** m_obj.c 13 Dec 2006 02:17:15 -0000 1.2.4.3.2.10.2.4 --- m_obj.c 13 Dec 2006 03:39:22 -0000 1.2.4.3.2.10.2.5 *************** *** 10,16 ****
/* T.Grill - define for a modified, more portable method to detect stack overflows */ - #define NEWSTACKMETH /* tb: threadsafe stack overflow detection */
#ifdef ATOMIC #include "m_atomic.h" --- 10,18 ----
/* T.Grill - define for a modified, more portable method to detect stack overflows */ /* tb: threadsafe stack overflow detection */
+ #define ENTER STACK_INC; if(stackcount >= STACKITER) {outlet_stackerror(x); LEAVE; return;} + #define LEAVE STACK_DEC; + #ifdef ATOMIC #include "m_atomic.h" *************** *** 93,157 **** }
! void inlet_settip(t_inlet* i,t_symbol* s) ! { ! i->i_tip = s; ! } ! ! void glob_tooltips(t_pd *dummy, t_float f) ! { ! sys_tooltips = f; ! }
! char* inlet_tip(t_inlet* i,int num) ! { if (num < 0) return "???"; ! while (num-- && i) ! i = i->i_next; ! ! if (i) ! if (i->i_tip) { ! return i->i_tip->s_name; ! } return "?"; }
/* LATER figure out how to make these efficient: */ ! static void inlet_bang(t_inlet *x) ! { ! if (x->i_symfrom == &s_bang) ! pd_vmess(x->i_dest, x->i_symto, ""); else if (!x->i_symfrom) pd_bang(x->i_dest); else inlet_wrong(x, &s_bang); } ! ! static void inlet_pointer(t_inlet *x, t_gpointer *gp) ! { ! if (x->i_symfrom == &s_pointer) ! pd_vmess(x->i_dest, x->i_symto, "p", gp); else if (!x->i_symfrom) pd_pointer(x->i_dest, gp); else inlet_wrong(x, &s_pointer); } ! ! static void inlet_float(t_inlet *x, t_float f) ! { ! if (x->i_symfrom == &s_float) ! pd_vmess(x->i_dest, x->i_symto, "f", (t_floatarg)f); ! else if (x->i_symfrom == &s_signal) ! x->i_un.iu_floatsignalvalue = f; ! else if (!x->i_symfrom) ! pd_float(x->i_dest, f); else inlet_wrong(x, &s_float); }
! static void inlet_symbol(t_inlet *x, t_symbol *s) ! { ! if (x->i_symfrom == &s_symbol) ! pd_vmess(x->i_dest, x->i_symto, "s", s); else if (!x->i_symfrom) pd_symbol(x->i_dest, s); else inlet_wrong(x, &s_symbol); }
! static void inlet_list(t_inlet *x, t_symbol *s, int argc, t_atom *argv) ! { t_atom at; if (x->i_symfrom == &s_list || x->i_symfrom == &s_float --- 95,133 ---- }
! void inlet_settip(t_inlet* i,t_symbol* s) {i->i_tip = s;} ! void glob_tooltips(t_pd *dummy, t_float f) {sys_tooltips = f;}
! char* inlet_tip(t_inlet* i,int num) { if (num < 0) return "???"; ! while (num-- && i) i = i->i_next; ! if (i && i->i_tip) return i->i_tip->s_name; return "?"; }
/* LATER figure out how to make these efficient: */ ! static void inlet_bang(t_inlet *x) { ! if (x->i_symfrom == &s_bang) pd_vmess(x->i_dest, x->i_symto, ""); else if (!x->i_symfrom) pd_bang(x->i_dest); else inlet_wrong(x, &s_bang); } ! static void inlet_pointer(t_inlet *x, t_gpointer *gp) { ! if (x->i_symfrom == &s_pointer) pd_vmess(x->i_dest, x->i_symto, "p", gp); else if (!x->i_symfrom) pd_pointer(x->i_dest, gp); else inlet_wrong(x, &s_pointer); } ! static void inlet_float(t_inlet *x, t_float f) { ! if (x->i_symfrom == &s_float) pd_vmess(x->i_dest, x->i_symto, "f", (t_floatarg)f); ! else if (x->i_symfrom == &s_signal) x->i_un.iu_floatsignalvalue = f; ! else if (!x->i_symfrom) pd_float(x->i_dest, f); else inlet_wrong(x, &s_float); }
! static void inlet_symbol(t_inlet *x, t_symbol *s) { ! if (x->i_symfrom == &s_symbol) pd_vmess(x->i_dest, x->i_symto, "s", s); else if (!x->i_symfrom) pd_symbol(x->i_dest, s); else inlet_wrong(x, &s_symbol); }
! static void inlet_list(t_inlet *x, t_symbol *s, int argc, t_atom *argv) { t_atom at; if (x->i_symfrom == &s_list || x->i_symfrom == &s_float *************** *** 162,171 **** }
! static void inlet_anything(t_inlet *x, t_symbol *s, int argc, t_atom *argv) ! { ! if (x->i_symfrom == s) ! typedmess(x->i_dest, x->i_symto, argc, argv); ! else if (!x->i_symfrom) ! typedmess(x->i_dest, s, argc, argv); else inlet_wrong(x, s); } --- 138,144 ---- }
! static void inlet_anything(t_inlet *x, t_symbol *s, int argc, t_atom *argv) { ! if (x->i_symfrom == s) typedmess(x->i_dest, x->i_symto, argc, argv); ! else if (!x->i_symfrom) typedmess(x->i_dest, s, argc, argv); else inlet_wrong(x, s); } *************** *** 187,192 **** /* ----- pointerinlets, floatinlets, syminlets: optimized inlets ------- */
! static void pointerinlet_pointer(t_inlet *x, t_gpointer *gp) ! { gpointer_unset(x->i_pointerslot); *(x->i_pointerslot) = *gp; --- 160,164 ---- /* ----- pointerinlets, floatinlets, syminlets: optimized inlets ------- */
! static void pointerinlet_pointer(t_inlet *x, t_gpointer *gp) { gpointer_unset(x->i_pointerslot); *(x->i_pointerslot) = *gp; *************** *** 194,257 **** }
! t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp) ! { ! t_inlet *x = (t_inlet *)pd_new(pointerinlet_class), *y, *y2; ! x->i_owner = owner; ! x->i_dest = 0; ! x->i_symfrom = &s_pointer; ! x->i_pointerslot = gp; ! x->i_next = 0; ! if (y = owner->ob_inlet) ! { ! while (y2 = y->i_next) y = y2; ! y->i_next = x; ! } ! else owner->ob_inlet = x; ! return (x); ! }
! static void floatinlet_float(t_inlet *x, t_float f) ! { ! *(x->i_floatslot) = f; ! }
! t_inlet *floatinlet_new(t_object *owner, t_float *fp) ! { t_inlet *x = (t_inlet *)pd_new(floatinlet_class), *y, *y2; ! x->i_owner = owner; ! x->i_dest = 0; ! x->i_symfrom = &s_float; ! x->i_floatslot = fp; ! x->i_next = 0; ! if (y = owner->ob_inlet) ! { ! while (y2 = y->i_next) y = y2; ! y->i_next = x; ! } ! else owner->ob_inlet = x; ! return (x); ! } ! ! static void symbolinlet_symbol(t_inlet *x, t_symbol *s) ! { ! *(x->i_symslot) = s; } ! ! t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp) ! { t_inlet *x = (t_inlet *)pd_new(symbolinlet_class), *y, *y2; ! x->i_owner = owner; ! x->i_dest = 0; ! x->i_symfrom = &s_symbol; ! x->i_symslot = sp; ! x->i_next = 0; ! if (y = owner->ob_inlet) ! { ! while (y2 = y->i_next) y = y2; ! y->i_next = x; ! } ! else owner->ob_inlet = x; ! return (x); }
/* ---------------------- routine to handle lists ---------------------- */ --- 166,195 ---- }
! static void floatinlet_float( t_inlet *x, t_float f) { *(x->i_floatslot) = f; } ! static void symbolinlet_symbol(t_inlet *x, t_symbol *s) { *(x->i_symslot) = s; }
! #define COMMON \ ! x->i_owner = owner; \ ! x->i_dest = 0; \ ! x->i_next = 0; \ ! if (y = owner->ob_inlet) { \ ! while (y2 = y->i_next) y = y2; \ ! y->i_next = x; \ ! } else owner->ob_inlet = x; \ ! return x;
! t_inlet *floatinlet_new(t_object *owner, t_float *fp) { t_inlet *x = (t_inlet *)pd_new(floatinlet_class), *y, *y2; ! x->i_symfrom = &s_float; x->i_floatslot = fp; COMMON } ! t_inlet *symbolinlet_new(t_object *owner, t_symbol **sp) { t_inlet *x = (t_inlet *)pd_new(symbolinlet_class), *y, *y2; ! x->i_symfrom = &s_symbol; x->i_symslot = sp; COMMON } + t_inlet *pointerinlet_new(t_object *owner, t_gpointer *gp) { + t_inlet *x = (t_inlet *)pd_new(pointerinlet_class), *y, *y2; + x->i_symfrom = &s_pointer; x->i_pointerslot = gp; COMMON + } + #undef COMMON
/* ---------------------- routine to handle lists ---------------------- */ *************** *** 266,279 **** t_inlet *ip = ((t_object *)x)->ob_inlet; if (!argc) return; ! for (count = argc-1, ap = argv+1; ip && count--; ap++, ip = ip->i_next) ! { ! if (ap->a_type == A_POINTER) pd_pointer(&ip->i_pd, ap->a_w.w_gpointer); ! else if (ap->a_type == A_FLOAT) pd_float(&ip->i_pd, ap->a_w.w_float); ! else pd_symbol(&ip->i_pd, ap->a_w.w_symbol); } ! if (argv->a_type == A_POINTER) pd_pointer(&x->ob_pd, argv->a_w.w_gpointer); ! else if (argv->a_type == A_FLOAT) pd_float(&x->ob_pd, argv->a_w.w_float); ! else pd_symbol(&x->ob_pd, argv->a_w.w_symbol); ! }
void obj_init(void) --- 204,216 ---- t_inlet *ip = ((t_object *)x)->ob_inlet; if (!argc) return; ! for (count = argc-1, ap = argv+1; ip && count--; ap++, ip = ip->i_next) { ! if (ap->a_type == A_POINTER) pd_pointer(&ip->i_pd, ap->a_w.w_gpointer); ! else if (ap->a_type == A_FLOAT) pd_float(&ip->i_pd, ap->a_w.w_float); ! else pd_symbol(&ip->i_pd, ap->a_w.w_symbol); } ! if (argv->a_type == A_POINTER) pd_pointer(&x->ob_pd, argv->a_w.w_gpointer); ! else if (argv->a_type == A_FLOAT) pd_float(&x->ob_pd, argv->a_w.w_float); ! else pd_symbol(&x->ob_pd, argv->a_w.w_symbol); ! }
void obj_init(void) *************** *** 288,337 **** class_addanything(inlet_class, inlet_anything);
! pointerinlet_class = class_new(gensym("inlet"), 0, 0, ! sizeof(t_inlet), CLASS_PD, 0); class_addpointer(pointerinlet_class, pointerinlet_pointer);
- floatinlet_class = class_new(gensym("inlet"), 0, 0, - sizeof(t_inlet), CLASS_PD, 0); - class_addfloat(floatinlet_class, (t_method)floatinlet_float); - - symbolinlet_class = class_new(gensym("inlet"), 0, 0, - sizeof(t_inlet), CLASS_PD, 0); - class_addsymbol(symbolinlet_class, symbolinlet_symbol); - }
/* --------------------------- outlets ------------------------------ */
- #ifdef NEWSTACKMETH /* T.Grill - count iterations rather than watch the stack pointer */ static int stackcount = 0; /* iteration counter */ #define STACKITER 1000 /* maximum iterations allowed */ - #else - static char *stacklimit, *topstack; - #define STACKSIZE 1000000 - #endif
static int outlet_eventno; ! ! /* set a stack limit (on each incoming event that can set off messages) ! for the outlet functions to check to prevent stack overflow from message ! recursion */ ! ! void outlet_setstacklim(void) ! { ! #ifndef NEWSTACKMETH ! char c; ! topstack = &c; ! stacklimit = (&c) - STACKSIZE; ! #endif ! outlet_eventno++; ! } ! ! /* get a number unique to the (clock, MIDI, GUI, etc.) event we're on */ ! int sched_geteventno( void) ! { ! return (outlet_eventno); ! }
typedef struct _outconnect { --- 225,247 ---- class_addanything(inlet_class, inlet_anything);
! floatinlet_class = class_new(gensym("inlet"), 0, 0, sizeof(t_inlet), CLASS_PD, 0); ! symbolinlet_class = class_new(gensym("inlet"), 0, 0, sizeof(t_inlet), CLASS_PD, 0); ! pointerinlet_class = class_new(gensym("inlet"), 0, 0, sizeof(t_inlet), CLASS_PD, 0); ! class_addfloat( floatinlet_class, floatinlet_float); ! class_addsymbol( symbolinlet_class, symbolinlet_symbol); class_addpointer(pointerinlet_class, pointerinlet_pointer);
}
/* --------------------------- outlets ------------------------------ */
/* T.Grill - count iterations rather than watch the stack pointer */ static int stackcount = 0; /* iteration counter */ #define STACKITER 1000 /* maximum iterations allowed */
+ /* this is fairly obsolete stuff, I think */ static int outlet_eventno; ! void outlet_setstacklim(void) {outlet_eventno++;} ! int sched_geteventno( void) {return outlet_eventno;}
typedef struct _outconnect { *************** *** 391,525 **** }
! static void outlet_stackerror(t_outlet *x) ! { ! pd_error(x->o_owner, "stack overflow"); ! #ifndef NEWSTACKMETH ! stacklimit = topstack; ! #endif ! } ! ! void outlet_bang(t_outlet *x) ! { ! t_outconnect *oc; ! #ifdef NEWSTACKMETH ! STACK_INC; ! if(stackcount >= STACKITER) ! #else ! char c; ! if (&c < stacklimit) ! #endif ! outlet_stackerror(x); ! else ! for (oc = x->o_connections; oc; oc = oc->oc_next) ! pd_bang(oc->oc_to); ! #ifdef NEWSTACKMETH ! STACK_DEC; ! #endif ! } ! ! void outlet_pointer(t_outlet *x, t_gpointer *gp) ! { ! t_outconnect *oc; ! t_gpointer gpointer; ! #ifdef NEWSTACKMETH ! STACK_INC; ! if(stackcount >= STACKITER) ! #else ! char c; ! if (&c < stacklimit) ! #endif ! outlet_stackerror(x); ! else ! { ! gpointer = *gp; ! for (oc = x->o_connections; oc; oc = oc->oc_next) ! pd_pointer(oc->oc_to, &gpointer); ! } ! #ifdef NEWSTACKMETH ! STACK_DEC; ! #endif ! } ! ! void outlet_float(t_outlet *x, t_float f) ! { ! t_outconnect *oc; ! #ifdef NEWSTACKMETH ! STACK_INC; ! if(stackcount >= STACKITER) ! #else ! char c; ! if (&c < stacklimit) ! #endif ! outlet_stackerror(x); ! else ! for (oc = x->o_connections; oc; oc = oc->oc_next) ! pd_float(oc->oc_to, f); ! #ifdef NEWSTACKMETH ! STACK_DEC; ! #endif ! } ! ! void outlet_symbol(t_outlet *x, t_symbol *s) ! { ! t_outconnect *oc; ! #ifdef NEWSTACKMETH ! STACK_INC; ! if(stackcount >= STACKITER) ! #else ! char c; ! if (&c < stacklimit) ! #endif ! outlet_stackerror(x); ! else ! for (oc = x->o_connections; oc; oc = oc->oc_next) ! pd_symbol(oc->oc_to, s); ! #ifdef NEWSTACKMETH ! STACK_DEC; ! #endif ! } ! ! void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv) ! { ! t_outconnect *oc; ! #ifdef NEWSTACKMETH ! STACK_INC; ! if(stackcount >= STACKITER) ! #else ! char c; ! if (&c < stacklimit) ! #endif ! outlet_stackerror(x); ! else ! for (oc = x->o_connections; oc; oc = oc->oc_next) ! pd_list(oc->oc_to, s, argc, argv); ! #ifdef NEWSTACKMETH ! STACK_DEC; ! #endif ! }
! void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv) ! { ! t_outconnect *oc; ! #ifdef NEWSTACKMETH ! STACK_INC; ! if(stackcount >= STACKITER) ! #else ! char c; ! if (&c < stacklimit) ! #endif ! outlet_stackerror(x); ! else ! for (oc = x->o_connections; oc; oc = oc->oc_next) ! typedmess(oc->oc_to, s, argc, argv); ! #ifdef NEWSTACKMETH ! STACK_DEC; ! #endif ! }
! /* get the outlet's declared symbol */ ! t_symbol *outlet_getsymbol(t_outlet *x) ! { ! return (x->o_sym); ! }
void outlet_free(t_outlet *x) --- 301,334 ---- }
! static void outlet_stackerror(t_outlet *x) {pd_error(x->o_owner, "stack overflow");}
! void outlet_bang(t_outlet *x) {ENTER{ ! t_outconnect *oc; ! for (oc = x->o_connections; oc; oc = oc->oc_next) pd_bang(oc->oc_to); ! }LEAVE} ! void outlet_pointer(t_outlet *x, t_gpointer *gp) {ENTER{ ! t_outconnect *oc; ! t_gpointer gpointer = *gp; ! for (oc = x->o_connections; oc; oc = oc->oc_next) pd_pointer(oc->oc_to, &gpointer); ! }LEAVE} ! void outlet_float(t_outlet *x, t_float f) {ENTER{ ! t_outconnect *oc; ! for (oc = x->o_connections; oc; oc = oc->oc_next) pd_float(oc->oc_to, f); ! }LEAVE} ! void outlet_symbol(t_outlet *x, t_symbol *s) {ENTER{ ! t_outconnect *oc; ! for (oc = x->o_connections; oc; oc = oc->oc_next) pd_symbol(oc->oc_to, s); ! }LEAVE} ! void outlet_list(t_outlet *x, t_symbol *s, int argc, t_atom *argv) {ENTER{ ! t_outconnect *oc; ! for (oc = x->o_connections; oc; oc = oc->oc_next) pd_list(oc->oc_to, s, argc, argv); ! }LEAVE} ! void outlet_anything(t_outlet *x, t_symbol *s, int argc, t_atom *argv) {ENTER{ ! t_outconnect *oc; ! for (oc = x->o_connections; oc; oc = oc->oc_next) typedmess(oc->oc_to, s, argc, argv); ! }LEAVE}
! /* get the outlet's declared symbol */ ! t_symbol *outlet_getsymbol(t_outlet *x) {return x->o_sym;}
void outlet_free(t_outlet *x) *************** *** 553,558 **** oc->outlet = outno; oc->inlet = inno; ! /* append it to the end of the list */ ! /* LATER we might cache the last "oc" to make this faster. */ if ((oc2 = o->o_connections)) { while (oc2->oc_next) oc2 = oc2->oc_next; --- 362,367 ---- oc->outlet = outno; oc->inlet = inno; ! /* append it to the end of the list */ ! /* LATER we might cache the last "oc" to make this faster. */ if ((oc2 = o->o_connections)) { while (oc2->oc_next) oc2 = oc2->oc_next; *************** *** 592,610 **** /* ------ traversal routines for code that can't see our structures ------ */
! int obj_noutlets(t_object *x) ! { ! int n; ! t_outlet *o; for (o = x->ob_outlet, n = 0; o; o = o->o_next) n++; ! return (n); }
! int obj_ninlets(t_object *x) ! { ! int n; ! t_inlet *i; for (i = x->ob_inlet, n = 0; i; i = i->i_next) n++; if (x->ob_pd->c_firstin) n++; ! return (n); }
--- 401,415 ---- /* ------ traversal routines for code that can't see our structures ------ */
! int obj_noutlets(t_object *x) { ! int n; t_outlet *o; for (o = x->ob_outlet, n = 0; o; o = o->o_next) n++; ! return n; }
! int obj_ninlets(t_object *x) { ! int n; t_inlet *i; for (i = x->ob_inlet, n = 0; i; i = i->i_next) n++; if (x->ob_pd->c_firstin) n++; ! return n; }
*************** *** 651,662 **** }
! /* move an inlet or outlet to the head of the list */ ! void obj_moveinletfirst(t_object *x, t_inlet *i) ! { t_inlet *i2; if (x->ob_inlet == i) return; ! else for (i2 = x->ob_inlet; i2; i2 = i2->i_next) ! if (i2->i_next == i) ! { i2->i_next = i->i_next; i->i_next = x->ob_inlet; --- 456,464 ---- }
! /* move an inlet or outlet to the head of the list */ ! void obj_moveinletfirst(t_object *x, t_inlet *i) { t_inlet *i2; if (x->ob_inlet == i) return; ! for (i2 = x->ob_inlet; i2; i2 = i2->i_next) if (i2->i_next == i) { i2->i_next = i->i_next; i->i_next = x->ob_inlet; *************** *** 665,676 **** } } ! ! void obj_moveoutletfirst(t_object *x, t_outlet *o) ! { t_outlet *o2; if (x->ob_outlet == o) return; ! else for (o2 = x->ob_outlet; o2; o2 = o2->o_next) ! if (o2->o_next == o) ! { o2->o_next = o->o_next; o->o_next = x->ob_outlet; --- 467,474 ---- } } ! void obj_moveoutletfirst(t_object *x, t_outlet *o) { t_outlet *o2; if (x->ob_outlet == o) return; ! for (o2 = x->ob_outlet; o2; o2 = o2->o_next) if (o2->o_next == o) { o2->o_next = o->o_next; o->o_next = x->ob_outlet; *************** *** 680,688 **** }
! /* routines for DSP sorting, which are used in d_ugen.c and g_canvas.c */ ! /* LATER try to consolidate all the slightly different routines. */
! int obj_nsiginlets(t_object *x) ! { int n; t_inlet *i; --- 478,485 ---- }
! /* routines for DSP sorting, which are used in d_ugen.c and g_canvas.c */ ! /* LATER try to consolidate all the slightly different routines. */
! int obj_nsiginlets(t_object *x) { int n; t_inlet *i; *************** *** 693,697 **** }
! /* get the index, among signal inlets, of the mth inlet overall */ int obj_siginletindex(t_object *x, int m) { --- 490,494 ---- }
! /* get the index, among signal inlets, of the mth inlet overall */ int obj_siginletindex(t_object *x, int m) {