summaryrefslogtreecommitdiffstats
path: root/generic/tclOOBasic.c
diff options
context:
space:
mode:
authordgp <dgp@noemail.net>2013-08-21 18:27:23 (GMT)
committerdgp <dgp@noemail.net>2013-08-21 18:27:23 (GMT)
commit5d9159bd8d16ebe74c250d0173944e1ed819c0da (patch)
tree51c5301d329fb0f7ffa5957c9d67e91915d785fc /generic/tclOOBasic.c
parentd3de20db63cbf49b7566beca750434859ee8301e (diff)
downloadtcl-5d9159bd8d16ebe74c250d0173944e1ed819c0da.zip
tcl-5d9159bd8d16ebe74c250d0173944e1ed819c0da.tar.gz
tcl-5d9159bd8d16ebe74c250d0173944e1ed819c0da.tar.bz2
Don't use automatic storage to hold the invocation words of oo::define.
That practice doesn't agree with NRE execution. FossilOrigin-Name: a50ead706299cdc70c73bdafbd1c8a8c76b2dde2
Diffstat (limited to 'generic/tclOOBasic.c')
-rw-r--r--generic/tclOOBasic.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/generic/tclOOBasic.c b/generic/tclOOBasic.c
index f8cd1a4..073abab 100644
--- a/generic/tclOOBasic.c
+++ b/generic/tclOOBasic.c
@@ -88,7 +88,7 @@ TclOO_Class_Constructor(
Tcl_Obj *const *objv)
{
Object *oPtr = (Object *) Tcl_ObjectContextObject(context);
- Tcl_Obj *invoke[3];
+ Tcl_Obj **invoke = ckalloc(3 * sizeof(Tcl_Obj *));
if (objc-1 > Tcl_ObjectContextSkippedArgs(context)) {
Tcl_WrongNumArgs(interp, Tcl_ObjectContextSkippedArgs(context), objv,
@@ -115,7 +115,7 @@ TclOO_Class_Constructor(
Tcl_IncrRefCount(invoke[1]);
Tcl_IncrRefCount(invoke[2]);
TclNRAddCallback(interp, DecrRefsPostClassConstructor,
- invoke[0], invoke[1], invoke[2], NULL);
+ invoke, NULL, NULL, NULL);
/*
* Tricky point: do not want the extra reported level in the Tcl stack
@@ -131,9 +131,12 @@ DecrRefsPostClassConstructor(
Tcl_Interp *interp,
int result)
{
- TclDecrRefCount((Tcl_Obj *) data[0]);
- TclDecrRefCount((Tcl_Obj *) data[1]);
- TclDecrRefCount((Tcl_Obj *) data[2]);
+ Tcl_Obj **invoke = data[0];
+
+ TclDecrRefCount(invoke[0]);
+ TclDecrRefCount(invoke[1]);
+ TclDecrRefCount(invoke[2]);
+ ckfree(invoke);
return result;
}