chiark / gitweb /
ulong improved; clock arithmetic hbytes abolished; secnet responder implemented and...
[chiark-tcl.git] / dgram / dgram.c
index a2a2f974d7bce0655d52858f2ade07fbe8b5a29f..0dd40aae056901666c0d196664ce0372d6846fea 100644 (file)
@@ -146,17 +146,14 @@ static void recv_call(ClientData sock_cd, int mask) {
   Tcl_IncrRefCount(invoke);
 
   rc= Tcl_ListObjReplace(ip,invoke,sock->script_llength,0,3,args);
+  for (i=0; i<3; i++) { Tcl_DecrRefCount(args[i]); args[i]= 0; }
   if (rc) goto x_rc;
 
   rc= Tcl_EvalObjEx(ip,invoke,TCL_EVAL_GLOBAL|TCL_EVAL_DIRECT);
 
-  for (i=0; i<3; i++) Tcl_DecrRefCount(args[i]);
-  Tcl_DecrRefCount(invoke);
-
-  hbytes_free(&message_val);
-  sockaddr_free(&peer_val);
-
 x_rc:
+  if (invoke) Tcl_DecrRefCount(invoke);
+
   if (rc)
     Tcl_BackgroundError(ip);
 }
@@ -198,7 +195,7 @@ int pat_sockid(Tcl_Interp *ip, Tcl_Obj *o, DgramSocket **val) {
   int rc, sockix;
   DgramSocket *sock;
   
-  rc= Tcl_ConvertToType(ip,o,&sockid_type);
+  rc= Tcl_ConvertToType(ip,o,&dgramsockid_type);
   if (rc) return rc;
 
   sockix= o->internalRep.longValue;
@@ -217,7 +214,7 @@ Tcl_Obj *ret_sockid(Tcl_Interp *ip, DgramSocket *val) {
   o= Tcl_NewObj();
   Tcl_InvalidateStringRep(o);
   o->internalRep.longValue= val->ix;
-  o->typePtr= &sockid_type;
+  o->typePtr= &dgramsockid_type;
   return o;
 }
 
@@ -225,16 +222,17 @@ static void sockid_t_free(Tcl_Obj *o) { }
 
 static void sockid_t_dup(Tcl_Obj *src, Tcl_Obj *dup) {
   dup->internalRep= src->internalRep;
+  dup->typePtr= &dgramsockid_type;
 }
 
 static void sockid_t_ustr(Tcl_Obj *o) {
-  char buf[100];
-  int l;
+  char buf[75];
 
-  snprintf(buf,sizeof(buf),"dgramsock%d", (int)o->internalRep.longValue);
-  l= o->length= strlen(buf);
-  o->bytes= TALLOC(l+1);
-  strcpy(o->bytes, buf);
+  snprintf(buf,sizeof(buf), "%d", (int)o->internalRep.longValue);
+  obj_updatestr_vstringls(o,
+                         "dgramsock",9,
+                         buf, strlen(buf),
+                         (char*)0);
 }
 
 static int sockid_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) {
@@ -246,11 +244,14 @@ static int sockid_t_sfa(Tcl_Interp *ip, Tcl_Obj *o) {
   errno=0; ul=strtoul(str+9,&ep,10);
   if (errno || *ep) return staticerr(ip,"bad dgram socket id number");
   if (ul > INT_MAX) return staticerr(ip,"out of range dgram socket id");
+
+  objfreeir(o);
   o->internalRep.longValue= ul;
+  o->typePtr= &dgramsockid_type;
   return TCL_OK;
 }
 
-Tcl_ObjType sockid_type = {
-  "sockid-nearly",
+Tcl_ObjType dgramsockid_type = {
+  "dgramsockid",
   sockid_t_free, sockid_t_dup, sockid_t_ustr, sockid_t_sfa
 };