aboutsummaryrefslogtreecommitdiff
path: root/tcl_extras.cxx
diff options
context:
space:
mode:
authormescalinum <mescalinum@users.sourceforge.net>2009-08-28 16:46:43 +0000
committermescalinum <mescalinum@users.sourceforge.net>2009-08-28 16:46:43 +0000
commit9545397540a80010def7b2d6028715faf1ec0506 (patch)
treefe8ad2ad9453eaa2260ea92b8c3da56625db28e7 /tcl_extras.cxx
parentf2add340c0d41e14398e6728260f7dae424c0ea3 (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.cxx20
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) {