Patches for 2.0alpha7

Revised $Date: 1996/07/03 01:41:25 $ GMT

About Patches

Getting the "patch" program

The program "patch" is distributed from a number of places, and odds are you already have it on your system. If not, try ftp://gatekeeper.dec.com/pub/BSD/FreeBSD/FreeBSD-current/src/gnu/usr.bin/patch/ for the sources.

Applying a patch

To patch your sources, copy any patch listed below into a patch file. If you're going to apply more than one, apply them in order, and put each patch in a separate patch file. Then change your working directory to the top of the ILU source tree (ILUSRC), and use the command "patch -p", redirecting standard input to come from this file. For example, if you had put the ILU sources in /usr/local/ilu/src, and had put the patch in /usr/local/ilu/src/this-patch, you'd type
  % cd /usr/local/ilu/src
  % patch -p < /usr/local/ilu/src/this-patch
  [...various output from the patch program...]
  %

Actual Patches

  • The courier protocol byteswaps 16-bit quantities wrongly.

    Here's a patch to fix that:

    *** runtime/kernel/courier.c	1996/04/18 02:53:50
    --- runtime/kernel/courier.c.new	1996/04/19 01:22:27
    ***************
    *** 294,300 ****
      #ifdef WORDS_BIGENDIAN
          *((ilu_shortcardinal *) &buf[0]) = i;
      #else
    !     *((ilu_shortcardinal *) &buf[0]) = ((i >> 8) & ((i & 0xFF) << 8));
      #endif
        }
        return;
    --- 294,300 ----
      #ifdef WORDS_BIGENDIAN
          *((ilu_shortcardinal *) &buf[0]) = i;
      #else
    !     *((ilu_shortcardinal *) &buf[0]) = ((i >> 8) | ((i & 0xFF) << 8));
      #endif
        }
        return;
    ***************
    *** 318,324 ****
      #ifdef WORDS_BIGENDIAN
          *i = *((ilu_shortcardinal *) &buf[0]);
      #else
    !     *i = (buf[1] << 8) & buf[0];
      #endif
        }
        return;
    --- 318,324 ----
      #ifdef WORDS_BIGENDIAN
          *i = *((ilu_shortcardinal *) &buf[0]);
      #else
    !     *i = (buf[0] << 8) | buf[1];
      #endif
        }
        return;
    

  • Python enumeration constants are still formed as ENUMNAME__VALNAME, rather than the proper ENUMNAME.VALNAME.

    Here's a patch:

    *** 1.41	1996/03/05 03:50:15
    --- stubbers/python/genstub.c	1996/04/23 21:29:44
    ***************
    *** 113,119 ****
      		    Type t2 = type_description(t)->structuredDes.uniond.discriminator_type;
      		    if (t2->importInterfaceName != NULL)
      		      printf ("%s.", getInterfaceName(ur_type(t2)->interface));
    ! 		    printf ("%s__%s", getTypeName(ur_type(t2)), p);
      		    free(p);
      		  }
      		break;
    --- 113,119 ----
      		    Type t2 = type_description(t)->structuredDes.uniond.discriminator_type;
      		    if (t2->importInterfaceName != NULL)
      		      printf ("%s.", getInterfaceName(ur_type(t2)->interface));
    ! 		    printf ("%s.%s", getTypeName(ur_type(t2)), p);
      		    free(p);
      		  }
      		break;
    

  • The Sun RPC record-marking transport filter isn't maintaining its exposed buffer properly, sometimes allowing the buffer to run out of room for calls on transport_get_output_buffer. This means that writes of certain sizes can generate an internal error. Here's a fix:

    *** 1.24	1996/02/19 20:12:55
    --- runtime/kernel/sunrpcrm.c	1996/04/24 00:39:25
    ***************
    *** 336,343 ****
          self->tr_outNext += l1;
          b += l1;
          bufferSize -= l1;
    !     if (bufferSize > 0) {
    !       /* Gotta write buffer to make room for more. */
            /* Possible improvement: avoid writing 0-length chunk here. */
            FORMAT_HEADER(self->tr_outBuff + p->outStart - 4,
      		    self->tr_outNext - p->outStart, FALSE);
    --- 336,344 ----
          self->tr_outNext += l1;
          b += l1;
          bufferSize -= l1;
    !     if (bufferSize > 0 || (self->tr_outLimit - self->tr_outNext) < 16) {
    !       /* Gotta write buffer to make room for more, or to make sure we
    ! 	 always have room for 16 more bytes in the buffer. */
            /* Possible improvement: avoid writing 0-length chunk here. */
            FORMAT_HEADER(self->tr_outBuff + p->outStart - 4,
      		    self->tr_outNext - p->outStart, FALSE);
    ***************
    *** 353,358 ****
    --- 354,361 ----
            self->tr_outNext = 4 + bufferSize;
          }
        }
    +   _ilu_Assert((self->tr_outLimit - self->tr_outNext)>=16,
    + 	      "_sunrpcrm_WriteBytes failed to provide at least 16 bytes in output buffer");
        return ILU_CLER(*err);
      }
    

  • The ISL parser can become confused when you specify an interface that imports itself. Don't do that. To help you not do that, here's a patch which recognizes it and calls you on it:

    *** 1.122	1996/04/04 03:53:49
    --- stubbers/parser/ilu.bison	1996/04/25 01:06:39
    ***************
    *** 952,958 ****
        list_enumerate (s->types, (iluparser_EnumProc) ClearTypeMarks, NULL);
      }
      
    ! static void ClearMarks ()
      {
        list_enumerate (KnownInterfaces, (iluparser_EnumProc) ClearInterfaceMarks, NULL);
      }
    --- 952,958 ----
        list_enumerate (s->types, (iluparser_EnumProc) ClearTypeMarks, NULL);
      }
      
    ! static void ClearMarks (void)
      {
        list_enumerate (KnownInterfaces, (iluparser_EnumProc) ClearInterfaceMarks, NULL);
      }
    ***************
    *** 1810,1815 ****
    --- 1810,1820 ----
        a->value = 0;
      }
      
    + static boolean CheckForSelf (Imported i, string name)
    + {
    +   return (strcmp(i->name, name) == 0);
    + }
    + 
      #if ((defined(WIN32) || defined(WIN16)) && defined(_WINIO))
      #include 
      #endif /* ((defined(WIN32) || defined(WIN16)) && defined(_WINIO)) */
    ***************
    *** 1818,1823 ****
    --- 1823,1830 ----
      
      %pure_parser
      
    + %expect 1
    + 
      %start interface_list
      
      %token K_INTERFACE K_EXCEPTION K_TYPE K_CONSTANT K_IMPORTS K_FROM K_END K_BRAND K_TRUE
    ***************
    *** 1889,1897 ****
        CurrentParse->interface = new_Interface($2);
        CurrentParse->interface->brand = (string) $3;
        CurrentParse->interface->def = CurrentParse->line;
    !   if (!has_imported((list) $4, "ilu"))
          list_insert ((list) $4, new_Imported("ilu", NULL));
        CurrentParse->interface->imports = (list) $4;
        $$ = (refany) CurrentParse->interface;
      }
      			;
    --- 1896,1912 ----
        CurrentParse->interface = new_Interface($2);
        CurrentParse->interface->brand = (string) $3;
        CurrentParse->interface->def = CurrentParse->line;
    !   if (!has_imported((list) $4, "ilu") && strcmp((string) $2, "ilu") != 0)
          list_insert ((list) $4, new_Imported("ilu", NULL));
        CurrentParse->interface->imports = (list) $4;
    +   /* check for import of self */
    +   if (list_find((list) $4, (iluparser_FindProc) CheckForSelf, (refany) $2) != NULL)
    +     {
    +       char buf[1000];
    +       sprintf(buf, "Interface \"%s\" may not import itself.", (string) $2);
    +       iluerror(buf);
    +       YYERROR;
    +     }
        $$ = (refany) CurrentParse->interface;
      }
      			;
    ***************
    *** 3280,3288 ****
        return (FALSE);		 
      }
      
    ! boolean iluparser_IsKeyword (char *string)
      {
    !   return (find_keyword (string, NULL, NULL, NULL));
      }
      
      static boolean IsBaseDigit (cardinal base, unsigned char digit)
    --- 3295,3303 ----
        return (FALSE);		 
      }
      
    ! boolean iluparser_IsKeyword (char *str)
      {
    !   return (find_keyword (str, NULL, NULL, NULL));
      }
      
      static boolean IsBaseDigit (cardinal base, unsigned char digit)
    

  • The IIOP code doesn't handle IDL attribute accessors properly. Here's a fix:

    *** 1.78	1996/04/24 04:45:11
    --- runtime/kernel/iiop.c	1996/04/30 01:02:39
    ***************
    *** 39,44 ****
    --- 39,47 ----
      static const ilu_byte IIOPMajorVersion = 1;
      static const ilu_byte IIOPMinorVersion = 0;
      
    + #define IDLAttributePrefix "ilu--prefix-idlAttribute-"
    + #define IDLAttributePrefixLen (sizeof(IDLAttributePrefix)-1)
    + 
      static ilu_boolean _IIOP_SendPacket(ilu_Call, ilu_boolean);
      
      static ilu_boolean Initialized = ilu_FALSE;
    ***************
    *** 681,692 ****
        ilu_Method m;
        ilu_Class realclass;
      
    !   if (strlen(idl_name) < sizeof(buf))
          b = buf;
        else
          b = ilu_must_malloc(strlen(idl_name) + 1);
      
    !   for (p1 = idl_name, p2 = b;  *p1 != 0;  p1++, p2++)
          {
            if (*p1 == '_')
      	*p2 = '-';
    --- 684,699 ----
        ilu_Method m;
        ilu_Class realclass;
      
    !   if ((strlen(idl_name) + IDLAttributePrefixLen + 1) < sizeof(buf))
          b = buf;
        else
          b = ilu_must_malloc(strlen(idl_name) + 1);
      
    !   if (idl_name[0] == '_')
    !     { strcpy (b, IDLAttributePrefix);  p2 = b + IDLAttributePrefixLen; }
    !   else
    !     { p2 = b; }
    !   for (p1 = idl_name;  *p1 != 0;  p1++, p2++)
          {
            if (*p1 == '_')
      	*p2 = '-';
    ***************
    *** 706,712 ****
      {
        char *p1, *p2;
      
    !   for (p1 = buf, p2 = m->me_name;  *p2 != 0;  p1++, p2++)
          {
            if (*p2 == '-')
      	*p1 = '_';
    --- 713,723 ----
      {
        char *p1, *p2;
      
    !   if (strncmp(m->me_name, IDLAttributePrefix, IDLAttributePrefixLen) == 0)
    !     p2 = m->me_name + IDLAttributePrefixLen;
    !   else
    !     p2 = m->me_name;
    !   for (p1 = buf;  *p2 != 0;  p1++, p2++)
          {
            if (*p2 == '-')
      	*p1 = '_';
    

  • The ILU IIOP code doesn't marshal and unmarshal system exceptions properly, omitting the completion status field. Here's a patch that fixes that. This patch must be applied after the preceding IIOP patch.

    *** runtime/kernel/iiop.c	Wed May  1 20:06:37 1996
    --- iiop.c	Wed May  1 20:13:11 1996
    ***************
    *** 532,537 ****
    --- 532,539 ----
        t = _ilu_BufferTransport_Create (size, data, err);
        if (ILU_ERROK(*err))
          return (_cdr_CreatePacket (t, bo, offset, err));
    +   else
    +     return NIL;
      }
      
      static void _cdr_InmemFree (PACKET pk, ilu_cardinal *bufferlen, ilu_bytes *buffer)
    ***************
    *** 780,785 ****
    --- 782,788 ----
      	}
            DEBUG(IIOP_DEBUG, (stderr, "(FigureExceptionIndexFromIDLName):  no standard exception '%s' known.\n",
      			 rep_id));
    +       return 0;
          }
      }
      
    ***************
    *** 969,974 ****
    --- 972,978 ----
      		  &ior->Profile[ior->nProfiles].profileData);
        ior->nProfiles += 1;
        ilu_free(object_key);
    +   return ilu_TRUE;
      }
      
      static ilu_boolean _iiop_AddILUProfile (char *sbh,
    ***************
    *** 3655,3660 ****
    --- 3659,3665 ----
            ilu_cardinal exception_name_len = 0;
            ilu_cardinal i;
            ilu_cardinal minor;
    +       ilu_cardinal completed;
      
            if (_IIOP_InputString (call, &exception_name, &exception_name_len, 0, err), ILU_ERRNOK(*err))
      	return ilu_ProtocolException_Not;
    ***************
    *** 3662,3674 ****
            ilu_free(exception_name);
            if (_IIOP_InputCardinal (call, &minor, err), ILU_ERRNOK(*err))
      	return ilu_ProtocolException_Not;
            *exception_code = minor;
            return (i);
          }
        else if (replyStatus == GIOP_ReplyStatusType_LOCATION_FORWARD)
          {
    !       _ilu_Assert(0, "IIOP LOCATION_FORWARD reply recieved!");
          }
      }
      
      /*L1_sup < prmu*/
    --- 3667,3693 ----
            ilu_free(exception_name);
            if (_IIOP_InputCardinal (call, &minor, err), ILU_ERRNOK(*err))
      	return ilu_ProtocolException_Not;
    +       if (_IIOP_InputCardinal (call, &completed, err), ILU_ERRNOK(*err))
    + 	return ilu_ProtocolException_Not;
            *exception_code = minor;
    +       DEBUG(IIOP_DEBUG,
    + 	    (stderr, "_IIOP_InterpretReply:  system exception <%s> received, minor code %lu,"
    + 	     " completed %s\n", ilu_PEName(i), (unsigned long) minor,
    + 	     (completed == 0) ? "YES" : ((completed == 1) ? "NO" : ((completed == 2) ? "MAYBE" : "INVALID"))));	     
            return (i);
          }
        else if (replyStatus == GIOP_ReplyStatusType_LOCATION_FORWARD)
          {
    !       ilu_DebugPrintf ("_IIOP_InterpretReply:  IIOP LOCATION_FORWARD reply received!\n");
    !       ilu_DebugPrintf ("_IIOP_InterpretReply:  ILU does not yet handle LOCATION_FORWARD replies.\n");
    !       return ilu_ProtocolException_RequestRejected;
          }
    +   else
    +     {
    +       DEBUG(IIOP_DEBUG,
    + 	    (stderr, "_IIOP_InterpretReply:  unexpected reply status %lu.\n", (unsigned long) replyStatus));
    +       return ILU_ERR_CONS1(marshal, err, minor, ilu_mm_msgTypeUnknown, ilu_ProtocolException_Not);
    +     }
      }
      
      /*L1_sup < prmu*/
    ***************
    *** 3877,3885 ****
      
        iiop_vop(call) = (ilu_bytes) packetsize;
        packetsize += _IIOP_SizeOfBytes(call, iiop_objKey(call), iiop_objKeyLen(call) + 1, 0xFFFF, err);
    !   if (eindex == 0)
          {
    !       packetsize += _IIOP_SizeOfCardinal (call, 1, err);
          }
        return packetsize;
      }
    --- 3896,3905 ----
      
        iiop_vop(call) = (ilu_bytes) packetsize;
        packetsize += _IIOP_SizeOfBytes(call, iiop_objKey(call), iiop_objKeyLen(call) + 1, 0xFFFF, err);
    !   if (eindex == 0)	/* system exception */
          {
    !       packetsize += _IIOP_SizeOfCardinal (call, 1, err);	/* for minor code */
    !       packetsize += _IIOP_SizeOfCardinal (call, 1, err);	/* for completion status */
          }
        return packetsize;
      }
    ***************
    *** 3929,3935 ****
            ((evalue == 0) ?
             ((_IIOP_OutputCardinal (call, GIOP_ReplyStatusType_SYSTEM_EXCEPTION, err), ILU_ERRNOK(*err)) ||
      	(_IIOP_OutputString (call, ename, strlen(ename), 0, err), ILU_ERRNOK(*err)) ||
    ! 	(_IIOP_OutputCardinal (call, sysExnIndex, err), ILU_ERRNOK(*err))) :
             ((_IIOP_OutputCardinal (call, GIOP_ReplyStatusType_USER_EXCEPTION, err), ILU_ERRNOK(*err)) ||
      	(_IIOP_OutputString (call, ename, strlen(ename), 0, err), ILU_ERRNOK(*err)))))
          {
    --- 3949,3956 ----
            ((evalue == 0) ?
             ((_IIOP_OutputCardinal (call, GIOP_ReplyStatusType_SYSTEM_EXCEPTION, err), ILU_ERRNOK(*err)) ||
      	(_IIOP_OutputString (call, ename, strlen(ename), 0, err), ILU_ERRNOK(*err)) ||
    ! 	(_IIOP_OutputCardinal (call, sysExnIndex, err), ILU_ERRNOK(*err)) ||
    ! 	(_IIOP_OutputCardinal (call, ((ilu_cardinal)2) /* CORBA::COMPLETED_MAYBE */, err), ILU_ERRNOK(*err))) :
             ((_IIOP_OutputCardinal (call, GIOP_ReplyStatusType_USER_EXCEPTION, err), ILU_ERRNOK(*err)) ||
      	(_IIOP_OutputString (call, ename, strlen(ename), 0, err), ILU_ERRNOK(*err)))))
          {
    

  • There's a bad debugging message in the kernel, which can cause core dumps if debugging is enabled. Here's a fix:

    *** runtime/kernel/call.c	Wed May  1 20:21:47 1996
    --- call.c	Wed May  1 20:22:34 1996
    ***************
    *** 172,184 ****
      closeout:
          if (ILU_ERROK(*err)) {
            DEBUG(CONNECTION_DEBUG,
    ! 	    (stderr, "Server closed connection %p.\n",
    ! 	     conn));
          } else {
            DEBUG(CONNECTION_DEBUG,
      	    (stderr,
    ! 	     "Closing connection %p due to error %s, from %s:%d.\n",
    ! 	     ILU_ERR_NAME(*err), ilu_ErrorFile(err),
      	     ilu_ErrorLine(err)));
          }
          closeit = TRUE;
    --- 172,184 ----
      closeout:
          if (ILU_ERROK(*err)) {
            DEBUG(CONNECTION_DEBUG,
    ! 	    (stderr, "Server closed connection %p to <%s>.\n",
    ! 	     conn, server->sr_id));
          } else {
            DEBUG(CONNECTION_DEBUG,
      	    (stderr,
    ! 	     "Closing connection %p to <%s>, due to error %s (file %s, line %d)",
    ! 	     conn, server->sr_id, ILU_ERR_NAME(*err), ilu_ErrorFile(err),
      	     ilu_ErrorLine(err)));
          }
          closeit = TRUE;
    

  • This patch is from Jody Winston, who claims it enables 2.0alpha7 to work with Python's Tk 4.1 support. Note that the patch is reversed (the newer version of the file is first).

    *** runtime/python/ilu_tk.py	Wed May 15 11:12:11 1996
    --- runtime/python/ilu_tk.py.~1~	Wed Apr 17 00:10:12 1996
    ***************
    *** 18,24 ****
      #
      
      import ilu
    ! import _tkinter
      
      #
      # Exceptions
    --- 18,24 ----
      #
      
      import ilu
    ! import tkinter
      
      #
      # Exceptions
    ***************
    *** 58,84 ****
          def setMember(self, iohc, mask):
      	if self.curFileno != iohc.fileno():
      	    raise FilenoMismatch
    ! 	if mask == _tkinter.READABLE:
      	    self.reader = iohc
    ! 	elif mask == _tkinter.WRITABLE:
      	    self.writer = iohc
      	else:
      	    raise BadMask
      	self.curMask = self.curMask | mask
      
          def unsetMember(self, mask):
    ! 	if mask == _tkinter.READABLE:
      	    self.reader = None
    ! 	elif mask == _tkinter.WRITABLE:
      	    self.writer = None
      	else:
      	    raise BadMask
      	self.curMask = self.curMask & ~mask
      
          def which(self, mask):
    ! 	if mask == _tkinter.READABLE:
      	    return self.reader
    ! 	elif mask == _tkinter.WRITABLE:
      	    return self.writer
      	else:
      	    raise BadMask
    --- 58,84 ----
          def setMember(self, iohc, mask):
      	if self.curFileno != iohc.fileno():
      	    raise FilenoMismatch
    ! 	if mask == tkinter.READABLE:
      	    self.reader = iohc
    ! 	elif mask == tkinter.WRITABLE:
      	    self.writer = iohc
      	else:
      	    raise BadMask
      	self.curMask = self.curMask | mask
      
          def unsetMember(self, mask):
    ! 	if mask == tkinter.READABLE:
      	    self.reader = None
    ! 	elif mask == tkinter.WRITABLE:
      	    self.writer = None
      	else:
      	    raise BadMask
      	self.curMask = self.curMask & ~mask
      
          def which(self, mask):
    ! 	if mask == tkinter.READABLE:
      	    return self.reader
    ! 	elif mask == tkinter.WRITABLE:
      	    return self.writer
      	else:
      	    raise BadMask
    ***************
    *** 98,104 ****
      	pair = _iohcPair(fd)
      	_fdMap[fd] = pair
          pair.setMember(iohc, mask)
    !     _tkinter.createfilehandler(pair, pair.mask(), _callhandler)
          return 1
      
      def _deleteHandler(fd, mask):
    --- 98,104 ----
      	pair = _iohcPair(fd)
      	_fdMap[fd] = pair
          pair.setMember(iohc, mask)
    !     tkinter.createfilehandler(pair, pair.mask(), _callhandler)
          return 1
      
      def _deleteHandler(fd, mask):
    ***************
    *** 108,131 ****
      	    pair.unsetMember(mask)
      	    if pair.mask() == 0:
      		    del _fdMap[fd]
    ! 		    _tkinter.deletefilehandler(fd)
      	    else:
    ! 		    _tkinter.createfilehandler(pair, pair.mask(), _callhandler)
      	    return 1
          else:
      	    return None
      
      def _reg_inp(iohc):
    !     return _registerHandler(iohc, _tkinter.READABLE)
      
      def _can_inp(fd):
    !     return _deleteHandler(fd, _tkinter.READABLE)
      
      def _reg_out(iohc):
    !     return _registerHandler(iohc, _tkinter.WRITABLE)
      
      def _can_out(fd):
    !     return _deleteHandler(fd, _tkinter.WRITABLE)
      
      class _tk_alarm:
      
    --- 108,131 ----
      	    pair.unsetMember(mask)
      	    if pair.mask() == 0:
      		    del _fdMap[fd]
    ! 		    tkinter.deletefilehandler(fd)
      	    else:
    ! 		    tkinter.createfilehandler(pair, pair.mask(), _callhandler)
      	    return 1
          else:
      	    return None
      
      def _reg_inp(iohc):
    !     return _registerHandler(iohc, tkinter.READABLE)
      
      def _can_inp(fd):
    !     return _deleteHandler(fd, tkinter.READABLE)
      
      def _reg_out(iohc):
    !     return _registerHandler(iohc, tkinter.WRITABLE)
      
      def _can_out(fd):
    !     return _deleteHandler(fd, tkinter.WRITABLE)
      
      class _tk_alarm:
      
    ***************
    *** 140,153 ****
      	def set_alarm (self, thc):
      		self.cancel_alarm()
      		milliseconds = int(1000 * float(thc.time() - ilu.FineTime_Now()))
    ! 		self.token = _tkinter.createtimerhandler(milliseconds, thc.call)
      
      def _create_alarm ():
      	return (_tk_alarm())
      
      def _do_event (*args):
      	print '_do_event(%s)' % args
    ! 	_tkinter.dooneevent()
      
      def _set_alarm (alarm, thc):
      	alarm.set_alarm(thc)
    --- 140,153 ----
      	def set_alarm (self, thc):
      		self.cancel_alarm()
      		milliseconds = int(1000 * float(thc.time() - ilu.FineTime_Now()))
    ! 		self.token = tkinter.createtimerhandler(milliseconds, thc.call)
      
      def _create_alarm ():
      	return (_tk_alarm())
      
      def _do_event (*args):
      	print '_do_event(%s)' % args
    ! 	tkinter.dooneevent()
      
      def _set_alarm (alarm, thc):
      	alarm.set_alarm(thc)
    ***************
    *** 155,164 ****
      def _cancel_alarm (alarm):
      	alarm.cancel_alarm()
      
    ! ilu.SetMainLoop (_tkinter.dooneevent, _reg_inp, _can_inp, _reg_out, _can_out,  _create_alarm, _set_alarm, _cancel_alarm)
      
      def RunMainLoop():
    ! 	_tkinter.mainloop(-1)
      
      def ExitMainLoop():
    ! 	_tkinter.quit()
    --- 155,164 ----
      def _cancel_alarm (alarm):
      	alarm.cancel_alarm()
      
    ! ilu.SetMainLoop (tkinter.dooneevent, _reg_inp, _can_inp, _reg_out, _can_out,  _create_alarm, _set_alarm, _cancel_alarm)
      
      def RunMainLoop():
    ! 	tkinter.mainloop(-1)
      
      def ExitMainLoop():
    ! 	tkinter.quit()
    

  • Another patch from Jody Winston fixes some bugs in the Python tutorial. Again, this patch is reversed.

    *** examples/tutorial/TapeCalculatorImpl.py	Wed May 15 11:13:42 1996
    --- examples/tutorial/TapeCalculatorImpl.py.~1~	Wed Apr 17 00:12:37 1996
    ***************
    *** 9,32 ****
      	def SetValue (self, v):
      		global value
      		self.value = v
    ! 		self.tape.append({'op' : Tutorial2.OpType.SetValue, 'value' : v, 'accumulator' : self.value})
      
      	def GetValue (self):
      		return self.value
      
      	def Add (self, v):
      		self.value = self.value + v
    ! 		self.tape.append({'op' : Tutorial2.OpType.Add, 'value' : v, 'accumulator' : self.value})
      
      
      	def Subtract (self, v):
      		self.value = self.value - v
    ! 		self.tape.append({'op' : Tutorial2.OpType.Subtract, 'value' : v, 'accumulator' : self.value})
      
      
      	def Multiply (self, v):
      		self.value = self.value * v
    ! 		self.tape.append({'op' : Tutorial2.OpType.Multiply, 'value' : v, 'accumulator' : self.value})
      
      
      	def Divide (self, v):
    --- 9,32 ----
      	def SetValue (self, v):
      		global value
      		self.value = v
    ! 		self.tape.append({'op' : Tutorial2.OpType__SetValue, 'value' : v, 'accumulator' : self.value})
      
      	def GetValue (self):
      		return self.value
      
      	def Add (self, v):
      		self.value = self.value + v
    ! 		self.tape.append({'op' : Tutorial2.OpType__Add, 'value' : v, 'accumulator' : self.value})
      
      
      	def Subtract (self, v):
      		self.value = self.value - v
    ! 		self.tape.append({'op' : Tutorial2.OpType__Subtract, 'value' : v, 'accumulator' : self.value})
      
      
      	def Multiply (self, v):
      		self.value = self.value * v
    ! 		self.tape.append({'op' : Tutorial2.OpType__Multiply, 'value' : v, 'accumulator' : self.value})
      
      
      	def Divide (self, v):
    ***************
    *** 34,40 ****
      			self.value = self.value / v
      		except ZeroDivisionError:
      			raise Tutorial.DivideByZero
    ! 		self.tape.append({'op' : Tutorial2.OpType.Divide, 'value' : v, 'accumulator' : self.value})
      
      	def GetTape (self):
      		return (self.tape)
    --- 34,40 ----
      			self.value = self.value / v
      		except ZeroDivisionError:
      			raise Tutorial.DivideByZero
    ! 		self.tape.append({'op' : Tutorial2.OpType__Divide, 'value' : v, 'accumulator' : self.value})
      
      	def GetTape (self):
      		return (self.tape)
    *** examples/tutorial/simple3.py	Wed May 15 11:15:04 1996
    --- examples/tutorial/simple3.py.~1~	Wed Apr 17 00:12:39 1996
    ***************
    *** 44,50 ****
      
      	# now loop over the arguments, adding each in turn
      
    ! 	for arg in argv[3:]:
      		v = string.atof (arg)
      		c.Add (v)
      
    --- 44,50 ----
      
      	# now loop over the arguments, adding each in turn
      
    ! 	for arg in argv[2:]:
      		v = string.atof (arg)
      		c.Add (v)
      
    *** examples/tutorial/simple4.py	Wed May 15 11:18:12 1996
    --- examples/tutorial/simple4.py.~1~	Wed Apr 17 00:12:39 1996
    ***************
    *** 35,41 ****
      def main (argv):
      
      	if (len(argv) < 3):
    ! 		print "Usage:  python simple4.py FACTORY-OBJECT-SID FACTORY-OBJECT-IH NUMBER [NUMBER...]\n",
      		sys.exit(1)
      
      	c = Get_Tutorial_Calculator(argv[1], argv[2])
    --- 35,41 ----
      def main (argv):
      
      	if (len(argv) < 3):
    ! 		print "Usage:  python simple3.py FACTORY-OBJECT-SID FACTORY-OBJECT-IH NUMBER [NUMBER...]\n",
      		sys.exit(1)
      
      	c = Get_Tutorial_Calculator(argv[1], argv[2])
    

  • This patch from Shridhar Acharya, fixes the following problem: ``Servers writtem using the c++-stubber get an "BeginException called with zero exceptionVal" assert. This bug can be traced to the code generated by the c++-stubber.''

    *** stubbers/cpp/code.c
    --- code.c
    193c193
    <        "  _argSize = ilu::BeginSizingException(_call, eCode-1);\n");
    ---
    >        "  _argSize = ilu::BeginSizingException(_call, eCode);\n");
    

  • This fix from Bill Tutt fixes a GC bug in the Python support: ``This is true for both 1.8 and the latest 2.0alpha. The original for loop in removeObjFromGCList is an infinite loop because the call to PyList_SetSlice(list,i , i+1, Py_None) fails because Py_None isn't a list. So instead you have to pass in an empty list.''

    *** runtime/python/iluPrmodule.c	1996/05/11 02:59:38
    --- 1.106	1996/05/13 03:09:38
    ***************
    *** 1050,1063 ****
      {
        int len = PyList_Size(list);
        int i;
      
        for (i = 0;  i < len;  i++)
          if (PyList_GetItem(list, i) == inst)
            {
    ! 	PyList_SetSlice (list, i, i+1, Py_None);
      	len = PyList_Size(list);
      	i -= 1;
            }
      }
      
      static void
    --- 1050,1066 ----
      {
        int len = PyList_Size(list);
        int i;
    +   PyObject *emptyList = PyList_New(0);
      
        for (i = 0;  i < len;  i++)
          if (PyList_GetItem(list, i) == inst)
            {
    ! 	PyList_SetSlice (list, i, i+1, emptyList);
      	len = PyList_Size(list);
      	i -= 1;
            }
    + 
    +   Py_DECREF(emptyList);
      }
      
      static void
    

  • When marshalling an exception in Python, the appropriate exception index is off by one (reported by Scott Hassan). Here's a patch:

    *** stubbers/python/genskel.c	1996/04/30 03:24:13
    --- 1.21	1996/06/18 22:33:41
    ***************
    *** 86,93 ****
      		printf(", %s", nameVarExceptValue);
      	printf(":\n");
      
      	printf("\t%s.BeginException(%s, %d, %s.BeginSizingException(%s, %d) + ",
    ! 	       nameModuleIlu, nameVarCall, ++*pCount, nameModuleIlu, nameVarCall, *pCount);
      	if (et)
      	{
      		printf("\\\n\t  ");
    --- 86,94 ----
      		printf(", %s", nameVarExceptValue);
      	printf(":\n");
      
    + 	++*pCount;
      	printf("\t%s.BeginException(%s, %d, %s.BeginSizingException(%s, %d) + ",
    ! 	       nameModuleIlu, nameVarCall, *pCount, nameModuleIlu, nameVarCall, *pCount);
      	if (et)
      	{
      		printf("\\\n\t  ");
    

  • When catching an exception in Python, the match must be exact, not equivalence (thanks to Scott Hassan). Here's the patch:

    *** stubbers/python/genstub.c	1996/05/29 19:11:29
    --- genstub.c	1996/06/18 22:38:55
    ***************
    *** 1118,1124 ****
      
      	if (et)
      	{
    ! 		printf("    %sif %s is %s:\n", ++*pCount > 1 ? "el" : "",
      			nameVarExceptName, getExceptionName(e));
      		printf("\t%s = ", nameVarExceptValue);
      		ioTypeInput(et);
    --- 1118,1124 ----
      
      	if (et)
      	{
    ! 		printf("    %sif %s == %s:\n", ++*pCount > 1 ? "el" : "",
      			nameVarExceptName, getExceptionName(e));
      		printf("\t%s = ", nameVarExceptValue);
      		ioTypeInput(et);
    

  • Larry Edelstein reports that having more than one constant declaration in an interface causes the ISL parser to dump core. Here's a patch:

    *** stubbers/parser/iluparse.c.dist	Thu Jun 20 18:53:19 1996
    --- iluparse.c.dist	Thu Jun 20 18:54:07 1996
    ***************
    *** 954,960 ****
      
        ndata.name = typename;
        ndata.interface = interfacename;
    !   hit = (Constant) list_find (l, (boolean (*)(refany, refany)) matchConstantName, name);
      
        if (hit == NULL)
          {
    --- 954,960 ----
      
        ndata.name = typename;
        ndata.interface = interfacename;
    !   hit = (Constant) list_find (l, (boolean (*)(refany, refany)) matchConstantName, &ndata);
      
        if (hit == NULL)
          {
    

  • Python exceptions signalled across the wire aren't catchable on the client side, because the strings raised are not eq to the strings expected. Here's a patch that fixes that:

    *** stubbers/python/genstub.c	1996/07/03 00:15:43
    --- genstub.c	1996/07/03 01:35:06
    ***************
    *** 1129,1142 ****
      {
      	Type	et	= e->import ? e->import->type : e->type;
      
      	if (et)
    ! 	{
    ! 		printf("    %sif %s == %s:\n", ++*pCount > 1 ? "el" : "",
    ! 			nameVarExceptName, getExceptionName(e));
    ! 		printf("\t%s = ", nameVarExceptValue);
    ! 		ioTypeInput(et);
    ! 		newline();
    ! 	}
      }
      
      static void
    --- 1129,1144 ----
      {
      	Type	et	= e->import ? e->import->type : e->type;
      
    + 	printf("    %sif %s == %s:\n", ++*pCount > 1 ? "el" : "",
    + 	       nameVarExceptName, getExceptionName(e));
    + 	printf("\t%s = %s", nameVarExceptName, getExceptionName(e));
    + 	newline();
      	if (et)
    ! 	  {
    ! 	    printf("\t%s = ", nameVarExceptValue);
    ! 	    ioTypeInput(et);
    ! 	    newline();
    ! 	  }
      }
      
      static void