Posted to tcl by mjanssen at Mon Oct 16 14:04:51 GMT 2006view pretty

// objc and objv are coming straight from a Command created with Tcl_CreateObjCommand

static int ObjectInvokeSlot(Tcl_Interp * interp, ObjectInfo * self, char * slotName, ObjectSlot  * slot,  int objc, Tcl_Obj * const objv[]) {
    Tcl_Obj * argList, * lambdaExpr;
    int nobjc,res,i;
    Tcl_Obj ** nobjv;
    static Tcl_Obj * applyCmd = NULL;
    if (applyCmd==NULL) {
         applyCmd=Tcl_NewStringObj("apply",-1);
        Tcl_IncrRefCount(applyCmd);
   }
    switch (slot->type) {
    case SELF_METHOD_INTERNAL:
        return (slot->function)(self,interp,Tcl_GetString(self->name),objc,objv);
    case SELF_DATA_SLOT:
        if(objc<2 || objc >3) {
            Tcl_WrongNumArgs(interp,1,objv,"slot_name ?value?");
            return TCL_ERROR;
        } 
        if (objc==3) {
            // Set new value for the slot (slot always exist, because it was called through the slot command)
            // Discard the old Tcl_Obj;
            ObjectAddSlot(self,slotName,SELF_DATA_SLOT,Tcl_DuplicateObj(objv[2]));
            ObjectGetSlot(self,slotName,&slot);
        }
        Tcl_SetObjResult(interp, Tcl_DuplicateObj(slot->value));
        return TCL_OK;
    case SELF_METHOD_SLOT:
        argList = Tcl_NewListObj(objc,objv);
        Tcl_ListObjReplace(interp,argList,0,1,1,&applyCmd);
        Tcl_ListObjReplace(interp,argList,1,1,1,&(slot->value));
        Tcl_ListObjGetElements(interp,argList,&nobjc,&nobjv);
 
        res = Tcl_EvalObjv(interp,nobjc,nobjv,0);

        Tcl_DecrRefCount(argList);
        // something is leaking here.	
        return res;
    default:
        Tcl_Panic("unknow slot type %d\n",slot->type,(void *)NULL);
    }
    return TCL_OK;
}

Comments

Posted by at Mon Oct 16 18:21:15 GMT 2006 [text] [code]

nobjv = (Tcl_Obj **)ckalloc(objc*sizeof(Tcl_Obj *)); nobjv[0] = applyCmd; nobjv[1] = slot->value; for(i=0;i<objc;i++){ if(i>1) { nobjv[i]=Tcl_DuplicateObj(objv[i]); } Tcl_IncrRefCount(nobjv[i]); } res = Tcl_EvalObjv(interp,objc,nobjv,0); for(i=0;i<objc;i++){ fprintf(stderr, "%d ref %d\n",i,nobjv[i]->refCount); Tcl_DecrRefCount(nobjv[i]); } ckfree((char *)nobjv); return res;