diff options
author | mescalinum <mescalinum@users.sourceforge.net> | 2009-08-28 16:46:43 +0000 |
---|---|---|
committer | mescalinum <mescalinum@users.sourceforge.net> | 2009-08-28 16:46:43 +0000 |
commit | 9545397540a80010def7b2d6028715faf1ec0506 (patch) | |
tree | fe8ad2ad9453eaa2260ea92b8c3da56625db28e7 /tcl_extras.cxx | |
parent | f2add340c0d41e14398e6728260f7dae424c0ea3 (diff) |
use Tcl reference counters properly -- solved segfaults
svn path=/trunk/externals/tclpd/; revision=12129
Diffstat (limited to 'tcl_extras.cxx')
-rw-r--r-- | tcl_extras.cxx | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/tcl_extras.cxx b/tcl_extras.cxx index 1551c7f..e277e60 100644 --- a/tcl_extras.cxx +++ b/tcl_extras.cxx @@ -17,21 +17,22 @@ static void *tclpd_init (t_symbol *classsym, int ac, t_atom *at) { t_tcl *self = (t_tcl *)pd_new(qlass); char s[32]; sprintf(s,"pd%06lx",cereal++); - self->self = Tcl_NewStringObj(s,strlen(s)); - object_table[string(s)] = (t_pd*)self; + self->self = Tcl_NewStringObj(s, -1); Tcl_IncrRefCount(self->self); + object_table[string(s)] = (t_pd*)self; Tcl_Obj *av[ac+2]; - av[0] = Tcl_NewStringObj(name,strlen(name)); + av[0] = Tcl_NewStringObj(name, -1); + Tcl_IncrRefCount(av[0]); av[1] = self->self; for(int i=0; i<ac; i++) { if(pd_to_tcl(&at[i], &av[2+i]) == TCL_ERROR) { - post("tcl error: %s\n", Tcl_GetString(Tcl_GetObjResult(tcl_for_pd))); + post("tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); pd_free((t_pd *)self); return 0; } } if (Tcl_EvalObjv(tcl_for_pd,ac+2,av,0) != TCL_OK) { - post("tcl error: %s\n", Tcl_GetString(Tcl_GetObjResult(tcl_for_pd))); + post("tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); pd_free((t_pd *)self); return 0; } @@ -59,14 +60,17 @@ static void tclpd_anything (t_tcl *self, t_symbol *s, int ac, t_atom *at) { av[1] = Tcl_NewIntObj(0); // TODO: 0 -> outlet_number Tcl_AppendToObj(av[1],"_",1); Tcl_AppendToObj(av[1],s->s_name,strlen(s->s_name)); // selector + Tcl_IncrRefCount(av[1]); for(int i=0; i<ac; i++) { if(pd_to_tcl(&at[i], &av[2+i]) == TCL_ERROR) { - post("tcl error: %s\n", Tcl_GetString(Tcl_GetObjResult(tcl_for_pd))); + post("tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); return; } } - if (Tcl_EvalObjv(tcl_for_pd,ac+2,av,0) != TCL_OK) - post("tcl error: %s\n", Tcl_GetString(Tcl_GetObjResult(tcl_for_pd))); + int result = Tcl_EvalObjv(tcl_for_pd,ac+2,av,0); + Tcl_DecrRefCount(av[1]); + if (result != TCL_OK) + post("tcl error: %s\n", Tcl_GetStringResult(tcl_for_pd)); } static void tclpd_free (t_tcl *self) { |