|   | 
                            
                               Integration
                                SDK 4.30x Errata 
                                Fixes Affecting Users of the ScriptEase
                                ISDKs  
                              
                              
                              
                              
                              
                              
                              
                                - 4.30a
                                  API - latest update: September 19, 2000
                              
  
                               
                               
                              
                               
                              API Errata, version 4.30g
                              (may apply to earlier versions)  
                                New,
                              August 3, 2004
                              
                               
                               
                              
                               
                              API Errata, version 4.30f
                              (may apply to earlier versions)  
                                New,
                              January 27, 2005
                              
                               
                               
                              
                               
                              API Errata, version 4.30e
                              (may apply to earlier versions)  
                                New,
                              March 7, 2002 
                              
                                - String
                                  replace may skip matches if replacement string
                                  is null-string (i.e. "")
                                
 - rare
                                  crashes on memory overwrites using the dynamicBuffer
                                  routines
                                
 - Problems
                                  with array lengths and numeric indices that
                                  are large or non-integer
                                
 - Foo.prototype.constructor
                                  not assigned correctly for all builtin objects
                                
 - Array
                                  split() error for negative starting point
                                
 - Math.min(+0,-0)
                                  wrongly returns +0
                                
 - Clib.localtime()
                                  and Clib.gmtime() crash on out-of-range dates
                                
 - Number
                                  toString(with_radix) method is not handling
                                  NaN, Infinity, and -Infinity
                                
 - Invalid
                                  date computation on negative month
                                
 - Math.round()
                                  returns -0 instead of +0 from -0.5 to -0
                                
 - Crash
                                  if reporting invalid data type while generating
                                  an error message
                                
 - Array
                                  .length should not be deletable
                                
 - properties
                                  of the arguments object should be DontEnum
                                
 - use
                                  of undefined global variables do not always
                                  report error 
                                
 - arguments
                                  object not updating function arguments 
                                
 - invalid
                                  assert for operator overloading on unary operators
                                  
                                
 - 'new'
                                  operator accepting non-Object return values
                                  
                                
 - jseCallFunction
                                  return variable may be NULL with JSE_FUNC_TRAP_ERRORS
                                  
                                
 - insufficient
                                  checks on bad Dates 
                                
 - compound
                                  assignment (/=, *=, %=, +=, -=, <<=, &=,
                                  ^=, |=) ignoring with() blocks 
                                
 - invalid
                                  name accessing local parameters in a with()
                                  block 
                                
 - MSVC6
                                  memory allocation bugs 
                                
 - aboutopt.jse
                                  doesn't work 
                                
 - terminating
                                  execution from within a "try" block
                                  will cause memory leaks 
                                
 - seObjHasProperty
                                  causing floating-point overflow if not handled
                                  by callback 
                                
 - "+Infinity
                                  and "-Infinity" converted to NaN if
                                  JSE_FLOATING_POINT==0
                                
 - stack
                                  variable overwrite when jseMayIContinueFunc
                                  returns False
                                
 - memory
                                  leak, and possible crash, using the #link statement
                              
  
                               
                               
                                API Errata, version 4.30d (may apply to
                                earlier versions)  
                                  New, October 6, 2001  
                              
                               
                               
                              API Errata, version 4.30c (may apply to earlier
                              versions)  
                                New, April 6, 2001
                              
                               
                               
                              API Errata, version 4.30b (may apply to earlier
                              versions)  
                                New, May 4, 2001
                              
                               
                               
                                API Errata, version 4.30a (may apply to
                                earlier versions)  
                                  New, September 19, 2000 
                              
                               
                              The Details
                               for 4.30g -- (may apply to earlier versions) 
                               
                              
                               
                                - function object's call() and apply() methods do not properly handle thrown errors
 
                                  (for ISDK/C 4.40f) 
                               
                              
                                Bug:
                                  When calling a function object's call() or apply() methods, any errors thrown from within that function get handled by the default error handler for the application instead of being processed by any applicable catch blocks.  For instance, the following script produces unexpected results: 
                                      function myThrower()
   {
      throw new Error("test error");
   }
   try
   {
      myThrower.call();
   }
   catch ( e )
   {
      Clib.printf("test error was caught by try/catch block");
   }
                                Fix:
                                  In srclib/ecma/seobject.c, function Ecma_Function_call(), around line 428, replace the following block of code:  
                                   jseCallFunction(jsecontext,thisVar,stack,&returnVar,thisArg);
   if( returnVar!=NULL )
      jseReturnVar(jsecontext,returnVar,jseRetCopyToTempVar);
                                with this one: 
                                   if ( jseCallFunctionEx(jsecontext,thisVar,stack,&returnVar,thisArg,JSE_FUNC_TRAP_ERRORS) )
   {
      if( returnVar!=NULL )
      {
         jseReturnVar(jsecontext,returnVar,jseRetCopyToTempVar);
      }
   }
   else
   {
      if( returnVar!=NULL )
      {
         jseReturnVar(jsecontext,returnVar,jseRetCopyToTempVar);
      }
      jseLibSetErrorFlag(jsecontext);
   }
                                Also around line 502 of the same file, in function Ecma_Function_apply(), replace the following block of code:  
                                   if( jseCallFunction(jsecontext,thisVar,stack,&returnVar,thisArg) )
      jseReturnVar(jsecontext,returnVar,jseRetCopyToTempVar);
                                with this one: 
                                   if ( jseCallFunctionEx(jsecontext,thisVar,stack,&returnVar,thisArg,JSE_FUNC_TRAP_ERRORS) )
   {
      if( returnVar!=NULL )
      {
         jseReturnVar(jsecontext,returnVar,jseRetCopyToTempVar);
      }
   }
   else
   {
      if( returnVar!=NULL )
      {
         jseReturnVar(jsecontext,returnVar,jseRetCopyToTempVar);
      }
      jseLibSetErrorFlag(jsecontext);
   }
                               
                               
                              
                               
                                - string.concat()
                                  fails when strings are zero-length
 
                                  (for ISDK/C 4.40f) 
                               
                              
                                Bug:
                                  If the strings in string.concat() are all zero-length,
                                  then a memory allocation failure is reported..
                                 Fix:
                                  In srclib/ecma/seobject.c, function Ecma_String_concat(),
                                  att "+1" to this line (around line
                                  4032):  
                                   tempResult = HugeReMalloc(result,BYTECOUNT_FROM_STRLEN(result,length)+BYTECOUNT_FROM_STRLEN(str,strlength)); 
                                to
                                  this: 
                                   tempResult = HugeReMalloc(result,BYTECOUNT_FROM_STRLEN(result,length)+BYTECOUNT_FROM_STRLEN(str,strlength)+1); 
                               
                               
                              
                               
                                - Math.random()
                                  is not very random on systems with 16-bit integers
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  On systems compiled with 16-bit integers, Math.random()
                                  always generates numbers very close to 0.0 or
                                  1.0 (e.g. 0.0545345 or 0.992322), and not well-spread
                                  between 0 and 1.
                                 Fix:
                                  In srclib/ecma/mathobj.c, function Ecma_Math_random(),
                                  change this line:  
                                   int r[5]; 
                                to
                                  this: 
                                   uword32 r[5]; 
                               
                               
                              
                               
                                - memory
                                  growth and performance loss with AtErrorFunc
                                  callback
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  If you have supplied an AtErrorFunc callback,
                                  and script throws many errors that are caught
                                  by the AtErrorFunc callback, then the script
                                  engine memory use will increase over time and
                                  performance will suffer. 
                                 Fix:
                                  In srccore/secode.c, function secodeInterpret(),
                                  "case seReturnThrow:" add the following
                                  line just before the "jseVariable var = SEAPI_RETURN..."
                                  statement (at about line 1957):
                                 
                                   seAPIVar mark = call->tempvars; 
                                and
                                  then at the end of this block, following the
                                  call to AtErrorFunc, add this line: 
                                   CALL_KILL_TEMPVARS(call,mark); 
                                Similarly,
                                  in srccore/util.c, function ErrorVPrintf(),
                                  add the following line just before the "jseVariable var = SEAPI_RETURN..."
                                  statement (at about line 1873): 
                                   seAPIVar mark = call->tempvars; 
                                and
                                  then at the end of this block, following the
                                  call to AtErrorFunc, add this line: 
                                   CALL_KILL_TEMPVARS(call,mark); 
                               
                               
                              
                               
                                - memory
                                  leak with array.toSource
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  A memory buffer remains unreleased for each
                                  call to Array.prototype.toSource. This would
                                  happen any time ToSource is applied to an instance
                                  of an Array, or to any object containing an
                                  instance of an Array.
                                 Fix:
                                  In srclib/ecma/seobject.c, function Ecma_Array_toSource,
                                  the following should be added as the last line
                                  of the function at about line 1846:
                                 
                                   jseDestroyVariable(jsecontext,ret); 
                               
                                
                               
                              
                                - during
                                  script compilation peephole optimizer accesses
                                  invalid memory
 
                                  (for ISDK/C 4.30g)  
                               
                              
                                
                                  Problem: The peephole optimizer can access invalid
                                  memory during script compilation. In rare circumstance
                                  this may cause a crash. 
                                Fix:
                                  In srccore/expressn.c, function secompileDelete,
                                  at about line 859 change this statement: 
                                   memmove( sptr, sptr+size, elementMoveCount * sizeof(secodeelem) ); 
                                to 
                                   memmove( This->opcodes+offsetTo, This->opcodes+offsetFrom,
            elementMoveCount * sizeof(secodeelem) );
                                A
                                  few lines further down, in the function secompilePeephole(),
                                  at about line 871 remove the "StartOpcodes"
                                  local variable and add these local variables
                                  instead: 
                                   uint i, nxti; 
                                and
                                  then at about line 1075 replace this block 
                                   /* The array can move and its size can change, so need
    * to recalculate ending point each iteration.
    */
   StartOpcodes=This->opcodes;
   for( sptr = StartOpcodes; sptr < This->opcodes + This->opcodesUsed; )
   {
                                
                                  with
                                  
                                  this block 
                                   /* The array can move and its size can change, so need
    * to recalculate ending point each iteration.
    */
   for( i = 0; i<This->opcodesUsed; )
   {
      sptr = This->opcodes + i;
      nxti = i+1+SECODE_DATUM_SIZE(*sptr);
                                
                                  and
                                  later in the same function, at about line 943,
                                  is an secompileDelete statement followed by
                                  a reference to SE_GLOBAL_NOTDIRECTXLAT. Insert
                                  a line between those two statement so it now
                                  reads: 
                                   secompileDelete(This,sptr,&targetted,-change);
   sptr = This->opcodes + i;
   if ( SE_GLOBAL_NOTDIRECTXLAT <= c ) 
                                and
                                  finally, in this same function (at about line
                                  1098) replace this line 
                                   sptr = nxt; 
                                with
                                  this line 
                                   i = nxti; 
                               
                               
                              
                               
                                - Alignment
                                  errors with Clib *printf and *scanf floating-point
                                  on HP-UX
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  If a call to the Clib *printf or *scanf methods
                                  (e.g. Clib.sprintf) contains non-floating-point
                                  data types following a floating-point type,
                                  data alignment may be incorrect and invalid
                                  data or crashes will result. This problem appears
                                  only on HPUX systems. 
                                Fix:
                                  Replace srclib/clib/sefmtio.c with the file
                                  at ftp://ftp.nombas.com/pub/isdkeval/se430/sefmtio.c 
                               
                               
                              
                               
                                - when
                                  converting numbers to strings, rounding will
                                  not occur in some locales
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  In locales that use a comma to separate fractional
                                  parts of floating-point numbers (e.g. 3,145).
                                  JSE_NUMTOSTRING_ROUNDING will not round. 
                                Fix:
                                  In srcmisc/utilstr.c, function EcmaNumberToString(),
                                  at around line 801, this statement: 
                                   if ( NULL == (decimal=strchr_jsechar((jsecharptr)buffer,'.')) ) 
                                should
                                  become: 
                                   if ( NULL == (decimal=strchr_jsechar((jsecharptr)buffer,'.'))
     && NULL == (decimal=strchr_jsechar((jsecharptr)buffer,',')) )
                               
                               
                              
                               
                                - Stack
                                  corruption on %s error messages
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  If an error messages is generated with a format
                                  string containing the "%s" formatting
                                  type, and if the string that %s refers to is
                                  very long, then an assert will be generated
                                  (in debug mode), or a stack-overwrite will likely
                                  cause a crash (in release mode). For example,
                                  this script would cause such a crash: 
                                   var bigstr = "func";
   for (var i = 0; i < 5000; i++ )
      bigstr += "x";
   bigstr += "()";
   eval(bigstr);
                                This
                                  can also be a problem if you are using %s in
                                  any of your jseLibErrorPrintf() calls but are
                                  not limiting the length of string arguments. 
                                Fix:
                                  Edit the files srccore/textcore.h and srclib/common/setxtlib.h
                                  and change all occurences of "%s"
                                  in those files to be "%.30s". If you
                                  are using a build that relies on our implementation
                                  of jse_vsprintf in srcmisc/utilstr.c (if your
                                  system does not supply a native implementation
                                  of vsprintf) then contact http://support.nombas.com/
                                  for a replacement function. 
                               
                               
                              
                               
                                - SElib.dynamicLink()
                                  expects string lengths to remain constant
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  If a DLL (or shared object or code fragment)
                                  receives a string datum from SElib.dynamicLink()
                                  and changes the data in that string so that
                                  its length is shorter than the original string,
                                  we will assume the length has not changed and
                                  store data beyond the end of the string into
                                  the passed parameter. In Unicode and ASCII builds
                                  this will just leave the string length incorrect.
                                  In MBCS builds this could potentially cause
                                  a failure if the data beyond the null character
                                  is invalid MBCS sequences. 
                                Fix:
                                  In srclib/common/sedyna.c, function CallDynamicFunction(),
                                  at about line 248 change the statement from: 
                                   jsePutStringLength(jsecontext,v,(jsecharptr )data,BufferLengths[i]); 
                                to: 
                                   jsePutString(jsecontext,v,(jsecharptr )data); 
                               
                               
                              
                               
                                - bad
                                  error message, or crash, when "goto"
                                  statement is not followed by a label
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  If a goto is compiled, but is not followed by
                                  a proper label, then the error message will
                                  be invalid, may display garbage, and may crash. 
                                Fix:
                                  In srccore/statemnt.c, function secompileStatement(),
                                  in the "case seTokGoto:" change line
                                  993 from: 
                                   callQuit(call,textcoreGOTO_LABEL_NOT_FOUND); 
                                to: 
                                   callQuit(call,textcoreNOT_LOOP_LABEL); 
                               
                               
                              
                               
                                - "goto"
                                  is not standard EcmaScript
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Issue:
                                  ScriptEase implements the "goto" statement,
                                  but most other EcmaScript implementations do
                                  not recognize the keyword. 
                                Fix:
                                  To disable the "goto" keyword, change
                                  this line at about line 263 of srccore/codeprt2.c
                                  from: 
                                   { textcoreGotoKeyword, seTokGoto },
                                to: 
                                   #if !defined(JSE_DISABLE_GOTO)
   { textcoreGotoKeyword, seTokGoto },
   #endif
                                Then,
                                  if you want to disable the "goto"
                                  keyword, compile with JSE_DISABLE_GOTO defined. 
                               
                               
                              
                               
                                - COMOBJ
                                  leaks resources
 
                                  (for ISDK/C 4.30g) 
                               
                              
                                Bug:
                                  COMOBJ can leaks resources when working with
                                  type libraries and pass-by-ref COM objects.
                                  Over time total memory use will grow. 
                                Fix:
                                  Replace srclib/comobj/* code with files found
                                  at ftp://ftp.nombas.com/pub/isdkeval/se430/comobj_2003_03_20.zip
                                 
                               
                               
                              for 4.30f -- (may apply to earlier versions) 
                               
                              
                                - string.replace() crashes when only one argument is passed in
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: When a script calls String.replace() with only argument, the engine may crash due to uninitialized memory.  
                                Fix:
                                  In srclib/ecma/seobject.c, within the funciton string_replace_helper(), replace this line: 
                                   jseVariable replacement = argv[1]; 
                                with
                                  this line: 
                                   jseVariable replacement = ( argc == 2 ) ? argv[1] : NULL; 
                               
                               
                              
                                - comobj
                                  times miscalculate DST
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: In converting times between a script and
                                  a COM object, the daylight-savings time calculation
                                  may be off by one hour.  
                                Fix:
                                  In srclib/comobj/comobj.cpp, function COMObj_put()
                                  and in function oleGenericDispatcher() replace
                                  this line (at about line 873 and 1061, respectively) 
                                   UnixTimeToSystemTime((time_t)system_time, &st); 
                                with
                                  this block: 
                                   time_t tmp = (time_t)system_time;
   struct tm * localUnixTime = localtime(&tmp);
   st.wYear = (localUnixTime->tm_year + 1900);
   st.wMonth = localUnixTime->tm_mon+1;
   st.wDayOfWeek = localUnixTime->tm_wday;
   st.wDay = localUnixTime->tm_mday;
   st.wHour = localUnixTime->tm_hour;
   st.wMinute = localUnixTime->tm_min;
   st.wSecond = localUnixTime->tm_sec; 
                                then
                                  in function CreateReturnedVariant() replace
                                  this line (at about line 635): 
                                   time_t t = SystemTimeToUnixTime(&st); 
                                with
                                  this block: 
                                   time_t t;
   struct tm gm;
   /* Construct a tm structure based on the SYSTEMTIME structure */
   gm.tm_year = (st.wYear - 1900);
   gm.tm_mon = st.wMonth-1;
   gm.tm_wday = st.wDayOfWeek;
   gm.tm_mday = st.wDay;
   gm.tm_hour = st.wHour;
   gm.tm_min = st.wMinute;
   gm.tm_sec = st.wSecond;
   gm.tm_isdst = -1;
   /* Get the time_t */
   t = mktime(&gm); 
                               
                               
                              
                                - stack
                                  corruption with long mode parameter to Clib.fopen()
                                  and Clib.freopen()
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: If the mode parameter to Clib.fopen() or
                                  Clib.freopen() parameter is longer than 18 characters,
                                  a stack buffer overflow will occur.  
                                Fix:
                                  In srclib/sestdio.c, functions Clib_fopen()
                                  and Clib.freopen() change this line (at about
                                  line 634 and 705) 
                                   strcpy_jsechar((jsecharptr)NewMode,Mode); 
                                to
                                  this  
                                   memset(NewMode,0,sizeof(NewMode));
   strncpy_jsechar((jsecharptr)NewMode,Mode,sizeof(NewMode)/sizeof(NewMode[0])-2); 
                               
                               
                              
                                - array
                                  sort return invalid when array.length==1
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: If array.length==1,
                                  then array.sort()
                                  will return undefined. 
                                Fix:
                                  In srclib/ecma/seobject.c, function Ecma_Array_sort(),
                                  the code (near line 1144) for "<=1"
                                  elements should be changed to: 
                                   if( num_items <= 1 )
   {
      jseReturnVar(jsecontext,thisvar,jseRetCopyToTempVar);
      return;
   }
                               
                               
                              
                                - Number
                                  toPrecision() incorrect
 
                                  (for ISDK/C 5.00e) Updated Dec 11, 2002 
                               
                              
                                
                                  Bug: Number.prototype.toPrecision(precision)
                                  is converting precision
                                  digits beyond the decimal, when it should be
                                  converting precision-1
                                  digits.  
                                Fix:
                                  In srclib/ecma/seobject.c, function Ecma_Number_toSomething(),
                                  at about line 2287 the entire toPrecision block
                                  should be replaced with this code: 
                                   else
   {
      jsenumber abs_x = JSE_FP_FABS(x);
      assert( _toPrecision == toWhat );
      /* field width must be an int */
      /* if x>=pow(10,-6) && x<pow(10,f), use fixed-point notation
       * otherwise, use exponential notation */
      if( JSE_FP_LTE(JSE_FP_POW(JSE_FP_CAST_FROM_SLONG(10),JSE_FP_CAST_FROM_SLONG(-6)),abs_x) &&
          JSE_FP_LT(abs_x, JSE_FP_POW(JSE_FP_CAST_FROM_SLONG(10),JSE_FP_CAST_FROM_SLONG(f))) )
      {
         jsenumber f10 = JSE_FP_LOG10(abs_x);
         sint d10 = (sint)JSE_FP_CAST_TO_SLONG(f10);
         f -= d10;
         if ( !jseIsNegative(f10) )
            f--;
         JSE_FP_DTOSTR(x,(int)f,buffer,UNISTR("f"));
      }
      else
      {
         JSE_FP_DTOSTR(x,(int)f-1,buffer,UNISTR("e"));
      }
   }
                               
                               
                              
                                - jsePutString()
                                  may overwrite previous results if JSE_C_EXTENSIONS
                                  is disabled
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: If compiling with JSE_C_EXTENSIONS 0, then
                                  when jsePutString() or similar calls are used
                                  to assign to a variable (especially via dynamic
                                  callbacsk as in the RegExp global object), existing
                                  string data may be overwritten. 
                                Fix:
                                  In srccore/jselib.c, function GenericPutDataPtr(),
                                  at about line 1790 this block of code: 
                                         if( SEVAR_GET_TYPE(val)==VString && (SEVAR_GET_STRING(val).data->constant
   #     if JSE_C_EXTENSIONS==1
                                           ||  !callLocalCBehavior(call)
   #     endif
                                           ) )
                                should
                                  be replaced with this code 
                                      if( SEVAR_GET_TYPE(val)==VString
   #   if JSE_C_EXTENSIONS==1
       && (SEVAR_GET_STRING(val).data->constant || !callLocalCBehavior(call))
   #   endif
        )
                               
                               
                              
                                - string.replace
                                  crashes or consumes all memory when replacing
                                  with null string
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: When using string.replace() to delete a
                                  character from a string, by replacing it with
                                  "", the call may crash or use too
                                  much memory. 
                                Fix:
                                  In srclib/ecma/seobject.c, function add_string(),
                                  add this statement as the first line of the
                                  function (at about line 4128): 
                                   if ( !add_len ) return; 
                               
                               
                              
                                - invalid_regexp_instance.toString()
                                  crash
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: Calling the RegExp toString operator on
                                  an object that is not a valid RegExp instance
                                  will crash. E.G. RegExp.prototype.toString() 
                                Fix:
                                  In srclib/ecma/seregexp.c, function RegExp_toString,
                                  at about line 139 change this code: 
                                   orig = jseGetString(jsecontext,tmp,&len); 
                                to
                                  this 
                                   len = 0;
   orig = tmp ? jseGetString(jsecontext,tmp,&len) : UNISTR("");
                               
                              for 4.30f -- (may apply to earlier versions) 
                               
                              
                                - sedbc
                                  bugs with long binary data
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Problem: SEDBC can crash when reading from or
                                  writing to database columns representing any
                                  of the large binary data types. 
                                Fix:
                                  In srclib/sedbc/jse_rfx.c, function jseFieldExchange_LongString(),
                                  case rf_value, at about line 2742 is a call
                                  to SQLBindParameter passing the 8th paramater
                                  as "&value".
                                  That parameter should be "value".
                                  (I.E. value
                                  instead of the address of value.) 
                               
                               
                              
                                - string.split()
                                  incorrect if regular expression used as separator
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: String.prototype.split(separator) returns
                                  the wrong results when separator is a regular
                                  expression and does not match the first character
                                  of the string. 
                                Fix:
                                  In srclib/ecma/seobject.c, function Ecma_String_split(),
                                  at about line 3633 (just after the second call
                                  to SplitMatch) this of code: 
                                
                                   /* step 14 */
   JSE_POINTER_UINDEX e = 0;
   jseVariable tmp2,tmp = jseGetIndexMember(jsecontext,z,0);
   if( tmp ) 
                                should
                                  be changed to: 
                                   /* step 14 */
   JSE_POINTER_UINDEX e;
   jseVariable tmp2,tmp;
   if ( R && 0!=jseGetIntegerDatum(jsecontext,z,index_MEMBER) )
   {
      jseDestroyVariable(jsecontext,z);
      q++;
      continue;
   }
   e = 0;
   tmp = jseGetIndexMember(jsecontext,z,0);
   if( tmp )
                               
                               
                              
                                - useCache
                                  field of Call structure may not be initialized
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Problem: The call->useCache field is not
                                  initialized for new levels of interpret. This
                                  has not been shown to cause any run-time errors,
                                  yet. 
                                Fix:
                                  In srccore/call.c, function ecode.c, function
                                  callInterpret(), just after the call structure
                                  has been allocated (at about line 1039), initialize
                                  the useChache field with this statement 
                                   call->useCache = False; 
                               
                               
                              
                                - func.prototype
                                  undefined if #define JSE_AUTO_OBJECT 0
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Problem: If compiling with the JSE_AUTO_OBJECT
                                  options off (i.e. #define JSE_AUTO_OBJECT 0)
                                  a script such as this one: 
                                   function foo() {} foo.prototype.bar = 0; 
                                will
                                  generate this error 
                                   ConversionError 1616: Undefined and Null types cannot be converted to an object. 
                                Fix:
                                  In srccore/secode.c, function do_op_member,
                                  
                                  replace this line at about line 236: 
                                   #     if !defined(JSE_AUTO_OBJECT) || JSE_AUTO_OBJECT!=0
         if( to_object )          {
            if( SEVAR_GET_TYPE(tmp)==VUndefined )
            {
               /* transform it into an object */
               SEVAR_INIT_BLANK_OBJECT(call,tmp);
               sevarPutValueEx(call,obj,mem,tmp,False);
            }
         }
   #     endif
                                
                                  with this code 
                                   if( to_object  &&  SEVAR_GET_TYPE(tmp)==VUndefined )
   {
      # if defined(JSE_AUTO_OBJECT) && JSE_AUTO_OBJECT==0
      /* we have saved space by not putting a .protoype on all functions,
       * but they should have one if needed, so create it if it's accessed.
       */
      if ( mem==GLOBAL_STRING(call,orig_prototype_entry) && NULL!=SEVAR_GET_OBJECT(obj)->func )
      # endif
      {
         /* transform it into an object */
         SEVAR_INIT_BLANK_OBJECT(call,tmp);
         sevarPutValueEx(call,obj,mem,tmp,False);
      }
   }
                               
                               
                              
                                - parseInt()
                                  treating characters ":;<=>?@"
                                  as digits 3 through 9
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Problem: When evaluating a string, parseInt()
                                  is treating the characters from ":"
                                  to "@" (\x3A to \x40) as the digits
                                  3 through 9. 
                                Fix:
                                  In srclib/ecma/ecmamisc.c, function Ecma_parseInt,
                                  
                                  replace this line at about line 160: 
                                   val = toupper_jsechar(JSECHARPTR_GETC(str))-'A'+10; 
                                with
                                  this: 
                                   if ( (val = toupper_jsechar(JSECHARPTR_GETC(str))-'A'+10) < 10 ) break; 
                               
                               
                              
                                - Documentation
                                  incorrect about lifetime of jseGetInternalString()
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Problem: The documentation for the function
                                  jseGetInternalString(),
                                  states: 
                                   The returned pointer is valid as long as
   the jseString it is obtained from is valid. 
                                Fix:
                                  That statement is not correct, and should instead
                                  be: 
                                   The text represented by many sestring values
   is internally stored in a compact format, and
   so the string returned by this call may be
   stored in a temporary location; the returned
   pointer is guaranteed to be valid only until
   the next call into the script-engine API. 
                               
                               
                              
                                - string
                                  slice() function is not accepting zero parameters
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Problem: String.prototype.slice() will report
                                  an error if it is passed no parameters. Instead,
                                  it should treat calls to string.slice()
                                  as string.slice(0). 
                                Fix:
                                  In srclib/ecma/seobject.c, at about line 4946,
                                  change this line: 
                                   JSE_PROTOMETH( UNISTR("slice"), Ecma_String_slice, 1, 2, jseDontEnum, jseFunc_Secure ),
                                to
                                  this 
                                   JSE_PROTOMETH( UNISTR("slice"), Ecma_String_slice, 0, 2, jseDontEnum, jseFunc_Secure ),
                                
                                  and
                                  in function Ecma_String_slice() at about line
                                  4005 change this line: 
                                   start = jseGetLong(jsecontext,jseStart); 
                                to
                                  this 
                                   start = jseFuncVarCount(jsecontext) ? jseGetLong(jsecontext,jseStart) : 0; 
                                and
                                  change the line at about 4052 from 
                                   JSE_FUNC_VAR_NEED(jseStart,jsecontext,0,JSE_VN_CONVERT(JSE_VN_ANY,JSE_VN_NUMBER)); 
                                to 
                                   if ( 0 != jseFuncVarCount(jsecontext) )
      JSE_FUNC_VAR_NEED(jseStart,jsecontext,0,JSE_VN_CONVERT(JSE_VN_ANY,JSE_VN_NUMBER));
                               
                               
                              
                                - setting
                                  array length to 0 does not remove all indexed
                                  properties
 
                                  (for ISDK/C 4.30f)  
                               
                              
                                
                                  Bug: Setting the length property of an Array
                                  instance to zero does not remove the properties,
                                  although it does set the length to 0. 
                                Fix:
                                  In srccore/var.c, function sevarSetArrayLength(),
                                  at about line 303 change the initialization
                                  of maxi
                                  to be: 
                                   jsenumber maxi = JSE_FP_SUB(JSE_FP_CAST_FROM_ULONG(Length),jseOne); 
                               
                              
                                 
                               
                              for 4.30e -- (may apply to earlier versions)
                                
                              
                                - String
                                  replace may skip matches if replacement string
                                  is null-string (i.e. "")
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: If the replacement expression in a string
                                  replace() method is the zero-length string,
                                  then characters may be skipped in performing
                                  the replacement. For example, this script would
                                  fail the test: 
                                   var str = '6 abcdef';
   var rtn = str.replace(/[^0-9\.]/g,'');
   Test.assert( rtn == "6" );  // in error would be "6acf" 
                                Fix:
                                  In srclib/ecma/seobject.c, function string_search_helper(),
                                  replace the block of code beginning with "/* The return from exec should be an object"
                                  with the code found at ftp://ftp.nombas.com/pub/isdkeval/se430/string_search_helper.txt 
                               
                               
                              
                                - rare
                                  crashes on memory overwrites using the dynamicBuffer
                                  routines
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Code may overwrite one byte beyond allocated
                                  memory when using the dynamicbuffer functions. 
                                Fix:
                                  In srclib/common/selibutl.c, function dynamicBufferAppend(),
                                  at about line 133 change this line: 
                                   if( buf->used + length > buf->allocated ) 
                                to
                                  this: 
                                   if( buf->used + length >= buf->allocated ) 
                                and
                                  at about line 137
                                  change this line: 
                                   } while( buf->used + length > buf->allocated ); 
                                to
                                  this: 
                                   } while( buf->used + length >= buf->allocated ); 
                                and
                                  in function function dynamicBufferAppendLength(),
                                  at about line 151 change this line: 
                                   if( buf->used + length > buf->allocated ) 
                                to
                                  this: 
                                   if( buf->used + length >= buf->allocated ) 
                                and
                                  at about line 155
                                  change this line: 
                                   } while( buf->used + length > buf->allocated ); 
                                to
                                  this: 
                                   } while( buf->used + length >= buf->allocated ); 
                               
                               
                              
                                - Problems
                                  with array lengths and numeric indices that
                                  are large or non-integer
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: There are many problems with handling array
                                  and object members that are either very large
                                  (e.g. obj[2147483650])
                                  or are non-integer numbers (e.g. obj[3.14159],
                                  obj[1e34]).
                                  There are also related problems with setting
                                  an array length to a very large number (e.g.
                                  array.length=2147483650). 
                                Fix:
                                  The number of changes needed to fix these problems
                                  in such a way that they would work on all build
                                  types (fp, fpemul, nofp) without a loss of performance
                                  was very large. Because the number of changes
                                  was so large we recommend that you update to
                                  version 4.30f. However, if you must apply these
                                  changes to 4.30e, follow the instructions at
                                  ftp://ftp.nombas.com/pub/isdkeval/se430/numidx.txt
                                   
                               
                               
                              
                                - Foo.prototype.constructor
                                  not assigned correctly for all builtin objects
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: For all builtin objects, this statement
                                  should be true: Foo.prototype.constructor==Foo.
                                  For example Boolean.prototype.constructor==Boolean
                                  and Number.prototype.constructor==Number. 
                                Fix:
                                  In srclib/ecma/*.c locate all of the lines like
                                  this (where instead of "Foo" find
                                  "Function", "Object", "Array",
                                  "Boolean", "Number", "String",
                                  "Buffer", and "Date"): 
                                   JSE_PROTOMETH( CONSTRUCTOR_PROPERTY, Ecma_Array_builtin, 0, 0, jseDontEnum,
                  jseFunc_Secure ), 
                                and
                                  replace those lines with the following: 
                                   JSE_VARASSIGN( UNISTR("prototype._constructor"), ARRAY_PROPERTY, jseDontEnum ),
                                Finally,
                                  the RegExp object is missing this relationship,
                                  and so add a statement like the above to the
                                  wrapper list in srclib/ecma/seregexp.c. 
                               
                               
                              
                                - Array
                                  split() error for negative starting point
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Array split() is not handling negative
                                  start values correctly. This error shows up
                                  in different ways with different compilers,
                                  but the following example would fail on all
                                  systems: 
                                   var a = [1,2,3,4,5,6];
   var b = a.splice(-100,1);
   Test.assert( a == "2,3,4,5,6" );  // wrongly returns "1,2,3,4,5"
   Test.assert( b == "1" );          // wrongly returns "" 
                                Fix:
                                  In src/lib/ecma/seobject.c, function Ecma_Array_splice(),
                                  at about line 1633 change the code from: 
                                   start = (slong) max( length + start, 0 ); 
                                
                                  to 
                                   start = (slong) max( (slong)length + start, 0 ); 
                               
                               
                              
                                - Math.min(+0,-0)
                                  wrongly returns +0
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Math.min() is not returning -0 when comparing
                                  -0 against +0. 
                                Fix:
                                  In src/lib/ecma/mathobj.c, function Ecma_Math_min(),
                                  at about line 380 change the comparison from: 
                                   if( JSE_FP_LT(current,minval) ) 
                                
                                  to 
                                   if( JSE_FP_LT(current,minval) || ( jseIsNegZero(current) && jseIsZero(minval) ) ) 
                               
                               
                              
                                - Clib.localtime()
                                  and Clib.gmtime() crash on out-of-range dates
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Script calls to Clib.localtime() or Clib.gmtime()
                                  crash if the input time is out of the range
                                  of standard C library time routines. 
                                Fix:
                                  In srclib/clib/setime.c, function GenericTimeLib(),
                                  at about line 324 just after any of the ConversionFunc
                                  functions will have been called, insert this
                                  code: 
                                   if ( t == NULL )
   {
      jseReturnVar(jsecontext,jseCreateVariable(jsecontext,jseTypeNull),jseRetTempVar);
      return;
   }
                               
                               
                              
                                - Number
                                  toString(with_radix) method is not handling
                                  NaN, Infinity, and -Infinity
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Converting an instance of a Number object
                                  toString, using a radix (e.g. (new Number(foo)).toString(16);)
                                  does not produce correct results if the number
                                  is NaN, Infinity, or -Infinity. 
                                Fix:
                                  In src/lib/ecma/seobject.c, function Ecma_Number_toString(),
                                  at about line 2254 cahnge the JSE_NUMBER_TO_STRINGWITHRADIX
                                  code to be this: 
                                   if ( 0 < jseFuncVarCount(jsecontext) )
   {
      slong radix = JSE_FP_CAST_TO_SLONG(jseGetIntegerDatum(jsecontext,jseFuncVar(jsecontext,0),NULL));
      if ( radix==10  ||  !jseIsFinite(num) )
         EcmaNumberToStringWithRadix(jsebuffer,num);
      else
         EcmaNumberToStringWithRadix(num,(sint)radix,buffer);
   }
                               
                               
                              
                                - Invalid
                                  date computation on negative month
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Date calculations are incorrect, and can
                                  trigger debugger asserts, if month is negative.
                                  For example, the following script should set
                                  the month to October (month 9) and year to 1980,
                                  but instead it sets the month to January (month
                                  0) and year to 1981. 
                                   var foo = new Date("12:00 February 4, 1982");
   foo.setUTCMonth(-15);
                                Fix:
                                  In src/lib/ecma/sedate.c, function MakeDay(),
                                  insert code between lines 640 and 642 add code
                                  so those lines become: 
                                   r6 = m%12;
   if ( r6 < 0 )
   {
      r6 += 12;
      r5--;
   }
   t = TimeFromYear(r5);
                               
                               
                              
                                - Math.round()
                                  returns -0 instead of +0 from -0.5 to -0
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Math.round(val) should return -0 for -0.5
                                  <= val <= -0, according to section 15.8.2.15
                                  of the ECMAScript specification, but is returning
                                  +0. 
                                Fix:
                                  In srclib/ecma/mathobj.c, function Ecma_Math_round,
                                  the "if"
                                  statement and block should be changed to: 
                                   if ( jseIsFinite(val) && !jseIsZero(val) )
   {
      jsenumber half = JSE_FP_DIV(jseOne,JSE_FP_CAST_FROM_SLONG(2));
      /* exception to standard math if between -0.5 and -0, inclusive */
      if ( JSE_FP_LT(val,jseZero)  &&  JSE_FP_LTE(JSE_FP_NEGATE(half),val) )
         val = jseNegZero;
      else
         val = JSE_FP_FLOOR(JSE_FP_ADD(val,half));
   }
                               
                               
                              
                                - Crash
                                  if reporting invalid data type while generating
                                  an error message
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: If a method is called during error handling,
                                  and that method has a data type or conversion
                                  error, then the program will crash. For example,
                                  in the following example "msg"
                                  is the wrong data type and while rerporing this
                                  error the program will crash: 
                                   function TypeError(msg)
   {
      Error.apply(this, msg);
      return this;
   }
   TypeError(null);
                                Fix:
                                  In srccore/call.c, function callGetVarNeed(),
                                  after the call to callError() (at about line
                                  1652), add this statement: 
                                   CALL_SET_ERROR(call,FlowError); 
                               
                               
                              
                                - Array
                                  .length should not be deletable
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: The .length property of any instance of
                                  an array should have the DontEnum attribute. 
                                Fix:
                                  In srclib/ecma/seobject.c, function CreateNewObject(),
                                  at about line 3023 change 
                                   jseSetAttributes(jsecontext,t2,jseDontEnum); 
                                to 
                                   jseSetAttributes(jsecontext,t2,jseDontEnum||jseDontDelete); 
                               
                               
                              
                                - properties
                                  of the arguments object should be DontEnum
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: callee, length, and numbered members of
                                  the arguments object are enumerable, should
                                  be DontEnum. 
                                Fix:
                                  In srccore/call.c, function callCreateArguments(),
                                  there are 3 calls assigning 'mem = SEOBJ_CREATE_MEMBER(...)'
                                  In all 3 cases, add the following line right
                                  after: 
                                   mem->attributes = jseDontEnum; 
                               
                              
                               
                              
                                - use
                                  of undefined global variables do not always
                                  report error
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: When a variable that has not been declared
                                  or initialized is used to pass to a function,
                                  or is automatically assumed to be a function,
                                  e.g.: 
                                   new String(blah);         // undeclared variable "blah" passed to a funcion
   var zoo = "" + blah.foo;  // undeclared variables treated as an object 
                                no
                                  error message is generated. 
                                Fix:
                                  In srccore/secode.c, function secodeInterpret(),
                                  within the case for sePushGlobal,
                                  sePushGlobalAsObject,
                                  and sePushGlobalParam,
                                  at about line 1309 is this large block of code: 
                                   if( t==sePushGlobal )
   {
      callQuit(call,textcoreVAR_TYPE_UNKNOWN,GetStringTableEntry(call,mem,NULL));
      break;
   }
   else
   {
      jsebool do_it = FALSE;
      ...etc...
      STACK_POP;
   }
                                replace
                                  that entire block with these two lines: 
                                   if( jseOptReqVarKeyword & call->Global->ExternalLinkParms.options )
      callQuit(call,textcoreFUNC_OR_VAR_NOT_DECLARED,mem);
   else
      callQuit(call,textcoreVAR_TYPE_UNKNOWN,GetStringTableEntry(call,mem,NULL));
   break;
                                This
                                  change will cause error reports if you are using
                                  the non-ECMA compile-time option JSE_AUTO_OBJECT
                                  and are relying on scripts such as those above
                                  to automatically create object variables. One
                                  consequence of this is that the non-Ecma function
                                  defined()
                                  will cease to functions as expected in pre-processor
                                  statements such as 
                                   #if defined(Clib.puts)  
                                This
                                  should only be a problem if you use the JSE_CONDITIONAL_COMPILE
                                  option. In future releases SE:ISDK will move
                                  processing of defined()
                                  into the pre-processor for JSE_CONDITIONAL_COMPILE
                                  builds. If you need this pre-processor code
                                  ask Nombas
                                  Tech Support, or change defined() to use
                                  typeof(). For example, the above statement would
                                  become 
                                   #if typeof(Clib)!="undefined" && typeof(Clib.puts)!="undefined" 
                               
                              
                               
                              
                                - arguments
                                  object not updating function arguments
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: If changes are made to a member of the
                                  arguments object, those changes are not being
                                  reflected in the argument itself. I.E., this
                                  example will not update parm_y after arguments[1]
                                  has been changed: 
                                   function foo(parm_x,parm_y,parm_z)
   {
      arguments[1] = "new value";  // parm_y is not changed
   }
                                Fix:
                                  In srccore/var.c, function sevarPutValueEx((),
                                  at about line 780, insert within this block
                                  of code: 
                                   IF_OPERATOR_NOT_OVERLOADED(call,tmpvar,val,seAssignLocal)
   {
      SEVAR_COPY(&(smem->value),val);
   }
                                this
                                  additional code: 
                                   IF_OPERATOR_NOT_OVERLOADED(call,tmpvar,val,seAssignLocal)
   {
      /****** begin additional code ******/
      if( SEVAR_GET_TYPE(&(smem->value))==VReference )
      {
         mem = smem->value.data.ref_val.reference;
         SEVAR_INIT_OBJECT(obj,smem->value.data.ref_val.base);
         goto top;
      }
      else if( SEVAR_GET_TYPE(&(smem->value))==VReferenceIndex )
      {
         mem = smem->value.data.ref_val.reference;
         is_index = True;
         SEVAR_INIT_OBJECT(obj,smem->value.data.ref_val.base);
         goto top;
      }
      /****** end additional code ******/
      SEVAR_COPY(&(smem->value),val);
   }
                               
                              
                               
                              
                                - invalid
                                  assert for operator overloading on unary operators
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: If overloading unary operators with jseSetObjectCallbacks,
                                  and NDEBUG is not defined, and invalid assert
                                  will be triggered. 
                                Fix:
                                  In srccore/varutil.c, function seobjCallDynamicProperty(),
                                  at about line 2534, replace this block of code: 
                                      if( off_flag==OFF_PUT_PROP
   #   if defined(JSE_OPERATOR_OVERLOADING) && (0!=JSE_OPERATOR_OVERLOADING)
       || off_flag==OFF_OPERATOR_PROP
   #   endif
       || off_flag==OFF_DEFAULTVALUE_PROP )
      {
         assert( Parameter2!=NULL );
      }
                                with
                                  this block: 
                                      if( off_flag==OFF_PUT_PROP
       || off_flag==OFF_DEFAULTVALUE_PROP )
      {
         assert( Parameter2!=NULL );
      }
   #  if defined(JSE_OPERATOR_OVERLOADING) && (0!=JSE_OPERATOR_OVERLOADING)
      else if ( off_flag==OFF_OPERATOR_PROP )
      {
         /* Parameter2 may or may not be NULL for overloading (because it may be
          * two operators, or a unary operator. No test.
          */
      }
   #  endif
                               
                              
                               
                              
                                - 'new'
                                  operator accepting non-Object return values
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: If a constructor returns a variable that
                                  is not an object then that return value is not
                                  being ignored, although it should be. For example,
                                  in the following example foo
                                  should be set to a new Object
                                  and not 834. 
                                   function foomaker()
   {
      return 834;
   }
   var foo = new foomaker();
                                Fix:
                                  In srccore/call.c, function callReturnFromFunction(),
                                  at about line 771 replace this line: 
                                   if( SEVAR_GET_TYPE(tmp)==VUndefined ) 
                                with
                                  this block: 
                                   if ( SEVAR_GET_TYPE(tmp)!=VObject  &&  SEVAR_GET_TYPE(OLD_RETURN)==VObject ) 
                               
                              
                               
                              
                                - jseCallFunction
                                  return variable may be NULL with JSE_FUNC_TRAP_ERRORS
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: In jseCallFunction() and jseCallFunctionEx(),
                                  if the JSE_FUNC_TRAP_ERROS flag is used and
                                  returnVar
                                  is not NULL then *returnVar
                                  is supposed to be assign to some non-NULL value.
                                  But in some cases (usually if a parameter is
                                  not a valid function) this will return with
                                  a non-NULL *returnVar 
                                Fix:
                                  In srccore/jselib.c, function jseCallFunctionEx(),
                                  at about line 2612 replace this block: 
                                   #  if ( 0 < JSE_API_ASSERTLEVEL )
   if ( NULL == func )
   {
      STACK_POPX(2);
      SetLastApiError( UNISTR("%s: parameter 2 not a function"),ThisFuncName );
      END_TIMING(call);
      return False;
   }
   #  endif
                                with
                                  this block: 
                                   if (  NULL == func )
   {
      STACK_POPX(2);
   #  if ( 0 < JSE_API_ASSERTLEVEL )
         SetLastApiError( UNISTR("%s: parameter 2 not a function"),ThisFuncName );
   #  endif
      END_TIMING(call);
      goto illegal_params;
   }
                                then
                                  at about line 2577 replace this block: 
                                   # if JSE_NAMED_PARAMS==1
   if( SEVAR_GET_TYPE(var)!=VObject )
   {
      SetLastApiError( UNISTR("%s: parameter 2 not a function"),ThisFuncName );
      END_TIMING(call);
      return False;
   }
   #endif
                                with
                                  this: 
                                   if( SEVAR_GET_TYPE(var)!=VObject )
   {
   #  if ( 0 < JSE_API_ASSERTLEVEL )
         SetLastApiError( UNISTR("%s: parameter 2 not a function"),ThisFuncName );
   #  endif
      END_TIMING(call);
      goto illegal_params;
   }
                                Next,
                                  replace the remaining three instances of "return False"
                                  to instead be "goto illegal_params".
                                   
                                Finally,
                                  at this block of code at the end of the function,
                                  after "return retbool"; 
                                 illegal_params:
   *retvar = NULL;
   {
      jseVariable func = jseGetMember(call,NULL,UNISTR("Error"));
      if( func )
      {
         jseStack stack;
         jseVariable param;
         stack = jseCreateStack(call);
         /* pass 1 parameter, the string */
         param = jseCreateVariable(call,jseTypeString);
         jsePutString(call,param,UNISTR("API parameters are invalid"));
         jsePush(call,stack,param,TRUE);
         if( !jseCallFunction(call,func,stack,retvar,NULL) )
         {
            if( *retvar!=NULL )
            {
               jseDestroyVariable(call,*retvar);
               *retvar = NULL;
            }
         }
         jseDestroyStack(call,stack);
      }
   }
   if( *retvar==NULL )
   {
      *retvar = jseCreateVariable(call,jseTypeString);
      jsePutString(call,*retvar,UNISTR("API parameters are invalid"));
   }
   return FALSE;
                               
                              
                               
                              
                                - insufficient
                                  checks on bad dates
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Some of the functions in the Date object
                                  are not testing against invalid dates. The results
                                  may be incorrrect, assertioins may be triggered,
                                  or floating-point exceptions may be triggered.
                                   
                                Fix:
                                  In srclib/ecma/sedate.c, a few locations need
                                  jseIsFinite() tests against the internal date
                                  representation. In function SetYearMonDay(),
                                  add a test after the call to jseGetNumber()
                                  at about line 1967 so it reads: 
                                   t = jseGetNumber(jsecontext,
                    jseMember(jsecontext,thisvar,DATE_VALUE_PROPERTY,jseTypeNumber));
   if ( !jseIsFinite(t) )
      return;
                                and
                                  in SetHourMinSecMilli() add a test after jseGetNumber()
                                  at about line 1823 so it reads: 
                                   t = jseGetNumber(jsecontext,
                    jseMember(jsecontext,thisvar,DATE_VALUE_PROPERTY,jseTypeNumber));
   if ( !jseIsFinite(t) )
      return;
                                and
                                  in Ecma_Date_toSystem() add a test after jseGetNumberDatum()
                                  at about line 1275 so it reads  
                               
                              
                              
                                   units = jseGetNumberDatum(jsecontext,thisvar,DATE_VALUE_PROPERTY);
   if ( !jseIsFinite(units) )
      return NULL;
                               
                               
                              
                                - compound
                                  assignment (/=, *=, %=, +=, -=, <<=, &=,
                                  ^=, |=) ignoring with() blocks
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: The object for a with(object) block is
                                  ignored when evaluating the initial variable
                                  while evaluating a compound assignment.
                                   
                                Fix:
                                  In srccore/expressn.c, function secompileGetValueKeep(),
                                  at about line 2333, this statement 
                                   if( this->with_depth ) 
                                should
                                  instead be this: 
                                   if( !this->with_depth ) 
                               
                              
                               
                              
                                - invalid
                                  name accessing local parameters in a with()
                                  block
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: When accessing a variable in a with block,
                                  the wrong variable name is used when testing
                                  a variable against the with object if the variables
                                  is an argument to the function (and not the
                                  first argument). In some cases this will lead
                                  to accessing the wrong name. If this with object
                                  has a get or hasproperty callback this may cause
                                  a program crash. The following example demonstrates
                                  where this may fail: 
                                   function foo(argument1,argument2,argument3)
   {
      var local1, local2, local3;
      with ( someObject )
      {
         local1 = local2;      // OK
         local1 = local3;      // OK
         local1 = argument1;   // OK
         local1 = argument2;   // FAIL
         local1 = argument3;   // FAIL
      }
   }
                                Fix:
                                  In srccore/secode.c, function callWithCatchEntry(),
                                  at about line 365, change this line: 
                                   [ (index<=0) ? index : ((struct LocalFunction *)FUNCPTR)->InputParameterCount+index-1]; 
                                to
                                  this 
                                   [ (index<=0) ? -index : ((struct LocalFunction *)FUNCPTR)->InputParameterCount+index-1]; 
                                Note
                                  that just a single "-" was added. 
                               
                              
                               
                              
                                - MSVC6
                                  memory allocation bugs
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Problems with Microsoft's C++ in Microsoft
                                  Visual C++ 6.0, can cause heap allocation errors
                                  and memory overwrites that can cause crashes
                                  that are extremely erratic and hard to reproduce. 
                                Fix:
                                  If you are using MSVC6, download and install
                                  the Visual Studio 6.0 Service Pack 5 from http://msdn.microsoft.com/vstudio/sp/vs6sp5/ 
                               
                              
                               
                              
                                - aboutopt.jse
                                  doesn't work
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: tools/aboutopt.jse isn't working with any
                                  of the samples. When a finer grain was added
                                  to what functions could be added/removed, we
                                  did not update aboutopt. Also, it wasn't clear
                                  how to execute the abotopt.jse scripts. 
                                Fix:
                                  Updated files for aboutopt.jse may be downloaded
                                  from ftp://ftp.nombas.com/pub/isdkeval/se430/aboutopt.zip.
                                  This aboutopt.jse can be execute frim the compiled
                                  SIMPLE1 sample, with a statement such as: 
                                   W32Simp1.exe tools\aboutopt.jse seisdk\samples\simple1\jseopt.h __JSE_WIN32__ _MSC_VER JSE_ASCII 
                               
                              
                               
                              
                                - terminating
                                  execution from within a "try" block
                                  will cause memory leaks
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: If execution is terminated while a script
                                  is within a try block, such as if the jseMayIContinue
                                  callback function returns False or by calling
                                  jseLibSetExitFlag(), then some allocated memory
                                  will not be freed and the system may crash. 
                                Fix:
                                  In srccore/call.c, function callDelete(), add
                                  this to the local variables at the beginning
                                  of the function: 
                                   struct TryBlock *loop; 
                                and
                                  add this block to the end of the function, just
                                  before the jseMustFree(call) statement at about
                                  line 1252: 
                                   for( loop = call->tries;loop!=NULL; )
   {
      struct TryBlock *prev = loop->prev;
   
      jseMustFree(loop);
      loop = prev;
   }
                                
                                  and
                                  in srccore/secode.c, function secodeInterpret(),
                                  19 lines beyond the "handle_finally:"
                                  label, replace these lines (at about line 626): 
                                   if( CALL_QUIT(call) )
      call->stackptr = call->tries->sptr;
                                with
                                  these: 
                                   if( call->state==FlowError )
      call->stackptr = call->tries->sptr;
                               
                               
                              
                                - seObjHasProperty
                                  causing floating-point overflow if not handled
                                  by callback
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: On some systems, if an object has a hasProp
                                  callback that returns -1, or if the dynamic
                                  object does not have a hasProp, then a floating-point
                                  overflow exception can occur. 
                                Fix:
                                  In srccore/varutil.c, function seobjHasProperty(),
                                  at line 2985change this line: 
                                   ret = (jsebool)JSE_FP_CAST_TO_SLONG(SEVAR_GET_NUMBER_VALUE(value)); 
                                to
                                  this: 
                                   if ( handled )
      ret = (jsebool)JSE_FP_CAST_TO_SLONG(SEVAR_GET_NUMBER_VALUE(value));
                               
                              
                               
                              
                                - "+Infinity
                                  and "-Infinity" converted to NaN if
                                  JSE_FLOATING_POINT==0
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: If building in integer-only mode (i.e. #define JSE_FLOATING_POINT 0),
                                  "+Infinity" and "-Infinity"
                                  will be read incorrectly and converted to NaN. 
                                Fix:
                                  In srccore/util.c, function convertStringToNumber(),
                                  there are two places with this block of code
                                  (line 2003 and 2010): 
                                   #           if (0!=JSE_FLOATING_POINT)
                  lenParsed++;
   #           endif
                                in
                                  both cases the conditionals should be removed,
                                  so the above blocks are replaced with the single
                                  line: 
                                               lenParsed++; 
                               
                              
                               
                              
                                - stack
                                  variable overwrite when jseMayIContinueFunc
                                  returns False
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: When your jseMayIContinueFunc() callback
                                  returns False, a variable within the virtual-machine
                                  stack may be wrongly assigned as undefined.
                                  This could lead to a variable being freed prematurely. 
                                Fix:
                                  In srccore/jselib.c.c, function jseInterpret(),
                                  at about line 662, replace these lines: 
                                               seVar tmp = STACK_PUSH;
               SEVAR_INIT_UNDEFINED(tmp);
                                with
                                  this 
                                   #           define call newc
               seVar tmp = STACK_PUSH;
               SEVAR_INIT_UNDEFINED(tmp);
   #           undef call
                               
                                
                               
                              
                                - memory
                                  leak, and possible crash, using the #link statement
 
                                  (for ISDK/C 4.30e)  
                               
                              
                                
                                  Bug: Memory leaks and possible crashes using
                                  the #link statement. The memory leak fix is
                                  for Unix only, but the possible crash in running
                                  out of memory applies to all systems. 
                                Fix:
                                  In srccore/extlib.c, function extensionFindLibPath(),
                                  at about line 499, replace this line: 
                                   if( !Success ) 
                                with
                                  this 
                                 if( !Success && FileName!=NULL ) 
                                and
                                  extensionLibraryStartup(), at about line 597
                                  replace this block 
                                   #if defined(__JSE_UNIX__)
      {
         jsechar buffer[256];
         jse_sprintf(buffer,"lib%s",LibraryName);
         FullLibraryPath = extensionFindLibPath(this,buffer,call);
      }
      assert( sizeof_jsechar('\0') == sizeof(jsecharptrdatum) );
      if( FullLibraryPath==NULL || *((jsecharptrdatum*)FullLibraryPath)=='\0' )
   #endif
         FullLibraryPath = extensionFindLibPath(this,LibraryName, call);
                                with
                                  this block 
                                   #if defined(__JSE_UNIX__)
      {
         jsechar buffer[256];
         jse_sprintf(buffer,"lib%s",LibraryName);
         FullLibraryPath = extensionFindLibPath(this,buffer,call);
      }
      assert( sizeof_jsechar('\0') == sizeof(jsecharptrdatum) );
      if( FullLibraryPath==NULL || *((jsecharptrdatum*)FullLibraryPath)=='\0' )
      {
         if( FullLibraryPath!=NULL ) jseMustFree(FullLibraryPath);
         FullLibraryPath = extensionFindLibPath(this,LibraryName, call);
      }
   #else
      FullLibraryPath = extensionFindLibPath(this,LibraryName, call);
   #endif
                                and
                                  then at about line 611, replace this block 
                                   callError(call,textcoreLINK_LIBRARY_NOT_EXISTS,LibraryName);
   jseMustFree(FullLibraryPath);
   return False; 
                                with
                                  this 
                                     callError(call,textcoreLINK_LIBRARY_NOT_EXISTS,LibraryName);
   if( FullLibraryPath ) jseMustFree(FullLibraryPath);
   return False; 
                               
                                
                               
                              for 4.30d -- (may apply to earlier versions) 
                              
                               
                              
                                - ToNumber()
                                  returns incorrect values for "+" and "-"
 
                                  (for ISDK/C 4.30d)
                                  
                                    Bug: When ToNumber() is called with either
                                    "+" or "-" as its argument, the return value
                                    should be NaN. Instead, ToNumber() is returning
                                    Infinity and -Infinity, respectively. 
                                 
                               
                              
                                Fix:
                                  In srccore/util.c, function convertStringToNumber(),
                                  at about line 1947, change this code: 
                                    if ( lenParsed == lenStr )
   {
      val = neg ? jseNegInfinity : jseInfinity ;
   }
                                to
                                  this 
                                   if ( lenParsed == lenStr && 2<lenStr ) 
                              
                               
                              
                                - Object
                                  comparisons with wrong hint - Date comparisons
                                  fail
 
                                  (for ISDK/C 4.30d)
                                  
                                    Bug: Object comparison (<, <=, >,
                                    >=) are not correctly following the hint
                                    logic specified in section 11.8.5 (The Abstract
                                    Relational Comparison Algorithm) of the ECMAScript
                                    specification. When objects are converted
                                    to a primitive value for comparison they should
                                    be give "hint Number". This would
                                    only show up as a problem for any object that
                                    does not have number as its default primitive;
                                    the Date object is such an example, and so
                                    the following test fails for the date object
                                    because it is comparing as a string (the default
                                    Date primitive type) instead of as a Nuimber
                                    (the hint type for comparison). 
                                 
                                    newer = new Date("Thu Oct 4 15:54:25 2001");
   older = new Date("Tue Sep 25 15:54:25 2001");
   Test.assert( older < newer ); // fails because comparing as string
                              
                              
                                Fix:
                                  In srccore/varutil.c, function sevarECMACompareLess(),
                                  change the first two instances of this code
                                  (at lines 760 and 769): 
                                    sevarConvert(call,tmp,jseToPrimitive); 
                                
                                  to this 
                                   sevarConvertToPrimitive(call,tmp,VNumber); 
                              
                               
                              
                                - function.arguments
                                  deprecated
 
                                  (for ISDK/C 4.30d) 
                                  
                                    Warning: The arguments property of a Function
                                    object is an old leftover from erly javascript,
                                    and has been deprecated in current EcmaScript
                                    standards. For most applications function.arguments
                                    is a drawback because it may lock in varaibles
                                    longer than is wanted and may slow overall
                                    execution. Unles you are writing a web browser
                                    that must support very old javascript, we
                                    recommend disabling function.arguments (note,
                                    the arguments object remains valid).
                                   
                                 
                               
                              
                                Fix:
                                  In srccore/secode.h, add the following lines
                                  where other compile-time options are being defined
                                  (around line 100): 
                                   #if !defined(JSE_FUNCTION_ARGUMENTS)
      /* by default, function.arguments is off.  It's archaic and requires way too
       * many links to constantly be created.
       */
   #  define JSE_FUNCTION_ARGUMENTS 0
   #endif
                                In
                                  srccore/var.c, function seobjGetMemberStruct(),
                                  at about line 918 enclose the very first block
                                  in a conditional like this: 
                                   #  if JSE_FUNCTION_ARGUMENTS==1
      /* If this is 'arguments', recreate appropriate arguments object
       * for this item. callCreateVariableObject will recreate it for
       * this function if need be. This makes sure the latest 'arguments'
       * are here while deferring building until needed.
       */
      if( Name==call->Global->global_strings[arguments_entry] &&
          SEOBJ_GET_FUNCTION(this)!=NULL )
      {
         callCreateVariableObject(call,SEOBJ_GET_FUNCTION(this),0);
      }
   #  endif 
                                And
                                  in srccore/call.c, function callCreateVariableObject(),
                                  at about line 982, wrap two statements within
                                  a conditional like this: 
                                   #        if JSE_FUNCTION_ARGUMENTS==1
            {
               seObjectMem tmp2;
               tmp2 = seobjNewMember(call,SEVAR_GET_OBJECT(FUNCVAR),
                                     GLOBAL_STRING(call,arguments_entry),&found);
               SEVAR_INIT_OBJECT(&(tmp2->value),SEVAR_GET_OBJECT(&(tmp->value)));
            }
   #        endif 
                                and
                                  remove the original declaration for tmp2 from
                                  the top of that function. 
                                function.arguments
                                  is now disabled. To enable it, recompile with
                                  #define JSE_FUNCTION_ARGUMENTS 1 
                               
                              
                               
                              
                                - toString on functions concatenates some
                                  identifiers
 
                                  (for ISDK/C 4.30d)
                                   Bug: When a function is being converted
                                    to a string, a required space may not be displayed
                                    after some variables. For example, this code: 
                                 
                                
                                  function blah()
{
   for (var prop in obj);
}
display("" + blah);
                                 
                               
                              
                                may produce this output (note that "prop"
                                  and "in" have become concatenated): 
                                
                                  function blah()
{
   for (var propin obj);
}
                                 
                                Fix: In srccore/function.c, function
                                  functionTextAsVariable(), at about line 283,
                                  change the seTokIdentifier to add a space after
                                  each identifier, as in: 
                                
                                  else if( type==seTokIdentifier )
{
   growingAddTo(&buff,GetStringTableEntry(call,tokGetName(c),NULL));
   growingAddTo(&buff,UNISTR(" "));
}
                                 
                               
                               
                              
                                - rare GC problem on dynamic objects
 
                                  (for ISDK/C 4.30d)
                                   Problem: In very rare circumstances, a garbage-collection
                                    may occur during manipulation of a dynamic
                                    object callback that could invalidate an internal
                                    stack variable. This has never been found
                                    to happen in the field, but new internal debugging
                                    code has detected the possibility. 
                                  Fix: In srccore/secode.c, function
                                    secodeInterpret(), within "case sePreIncLocal:",
                                    at about line 758 are these statements: 
                                  
                                    c_lhs = STACK_PUSH;
c_rhs = STACK_PUSH; 
                                   
                                  which should be followed by these statements:
                                   
                                  
                                    SEVAR_INIT_UNDEFINED(c_lhs);
SEVAR_INIT_UNDEFINED(c_rhs);
 
                                   
                                  and in srccore/jselib.c, function jseCallFunctionEx(),
                                    at about line 2534, this statement: 
                                  
                                    onstack = STACK_PUSH; 
                                   
                                  should be followed by this statement: 
                                  
                                    SEVAR_INIT_UNDEFINED(onstack);
           
                                   
                                 
                               
                               
                              
                                - get callback may crash during seobjHasProperty()
 
                                  (for ISDK/C 4.30d)
                                   Bug: dynamic get callback crash when called
                                    during seobjHasProperty() to determine if
                                    the propery exists. 
                                  Fix: In srccore/varutil.c, function
                                    seobjHasProperty(), locate this block of code,
                                    at about line 2978, beginnning with this text 
                                 
                               
                              
                                
                                  {
   /* either no dynamic _hasProperty (!handled) or
    * _hasProperty says 'yes it has the property' and
                                 
                                and replace the block with this code: 
                                
                                  {
   /* either no dynamic _hasProperty (!handled) or
    * _hasProperty says 'yes it has the property' and
    * dest is not NULL, so we need to retrieve the property
    * In either case, we have to do a dynamic get because we
    * need the value
    */
   seVar rhs = STACK_PUSH;
   SEVAR_INIT_OBJECT(rhs,obj);
   if( dest==NULL ) dest = rhs;
   if( seobjCallDynamicProperty(call,obj,OFF_GET_PROP,propname,False,dest) )
   {
      /* If hasProperty says yes, then undefined means undefined. Otherwise,
       * Undefined is the only way to differentiate a has it from does not
       * have it.
       */
      jsebool ret = (SEVAR_GET_TYPE(dest)!=VUndefined) || handled;
      if( ret && ref )
      {
         SEVAR_INIT_REFERENCE(dest,obj,propname);
      }
      STACK_POP;
      return ret;
   }
   if ( dest==rhs ) dest = NULL;
   STACK_POP;
   /* fallthru because not valid */
}
                                 
                                also note in related
                                  incident that in this same function 
                               
                              
                              
                                was changed to 
                               
                              
                               
                              
                                - C++ compilation errors for seuni.h
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: SEUNI.H causes compilation errors
                                  for some C++ compilers. 
                                Fix: Lines in srcmisc/seuni.h have been
                                  re-ordered so the __cplusplus statements surround
                                  only the statements and not other include files.
                                  This updated seuni.h may be downloaded from
                                  ftp://ftp.nombas.com/pub/isdkeval/se430/seuni.h. 
                               
                               
                              
                                - altering "arguments" causes assertion
                                  failure
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: Using "var" or assigning
                                  to the "arguments" variable will cause
                                  an assertion failure in !NDEBUG versions. 
                                Fix: In srccore/call.c, function callCreateVariableObject(),
                                  at about line 977, replace this code: 
                                
                                  tmp = SEOBJ_CREATE_MEMBER(call,tmpobj,GLOBAL_STRING(call,arguments_entry)); 
                                 
                                with this code: 
                                
                                  tmp = seobjNewMember(call,tmpobj,GLOBAL_STRING(call,arguments_entry),&found);
if ( found ) return; 
                                 
                                
                               
                               
                              
                                - jseCallStackInfo() can crash using Variable
                                  object
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: using jseCallStackInfo() to access
                                  a Variable object of a script function in the
                                  stack can crash. 
                                Fix: In srccore/call.h, find callCreateVariableObject()
                                  (about line 979) and add a final 'depth' parameter,
                                  as in: 
                                
                                  callCreateVariableObject(struct Call *call,struct Function *func,uint depth); 
                                 
                                also in srccore/call.c, find callCreateVariableObject()
                                  function (near line 827), and add the final
                                  'depth' parameter, as in: 
                                
                                     void NEAR_CALL
callCreateVariableObject(struct Call *call,struct Function *lookfunc,uint depth) 
                                 
                                find this code in callCreateVariableObject()
                                  (near line 848) 
                                
                                  /* Find the enclosing local function */
while( !FUNCTION_IS_LOCAL(func_orig) || (lookfunc!=NULL && lookfunc!=func_orig) ) 
                                 
                                and replace with this code 
                                
                                  /* Find the enclosing local function */
while( !FUNCTION_IS_LOCAL(func_orig) || (lookfunc!=NULL && lookfunc!=func_orig) || depth-->0 ) 
                                 
                                In srccore/jselib.c, function jseCallStackInfo(),
                                  at about line 2904, after this line 
                                
                                  TIMING(call,se); 
                                 
                                add this line 
                                
                                  callCreateVariableObject(call,NULL,depth); 
                                 
                                All other calls to callCreateVariableObject()
                                  should receive 0 (zero) as the last parameter. 
                               
                               
                              
                                - eval() does not propogate the "this"
                                  of its caller
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: eval() does not propogate the 'this'
                                  of its caller. 
                                 
                                  Fix: In srclib/ecma/ecmamisc.c, the Ecma_eval()
                                  wrapper function at about line 58, change 
                                  the reference to JSE_INTERPRET_KEEPTHIS in the
                                  jseInterpret 
                                  call to JSE_INTERPRET_PARENTTHIS. 
                                 
                                  In incjse/jselib.h, add the following definition.
                                  Put it near the 
                                  existing JSE_INTERPRET_XXX definitions, near
                                  line 1546: 
                                
                                
                                  #define JSE_INTERPRET_PARENTTHIS 0x100
/* Use the 'this' variable from the calling function */ 
                                 
                                In srccore/interprt.c, interpretInit() near
                                  line 306, there is a call to RunCompiledCode()
                                  that looks like this: 
                                
                                
                                  RunCompiledCode(InterpretCall,argc,argv,CallMain,
                (HowToInterpret & JSE_INTERPRET_KEEPTHIS)?
                   SEVAR_GET_OBJECT(CALL_THIS):
                   CALL_GLOBAL(InterpretCall),HowToInterpret);
                                 
                                
                                 change this to: 
                                
                                  {
   seObject this_obj = NULL;
   if( (HowToInterpret&JSE_INTERPRET_KEEPTHIS)!=0
    && FRAME!=NULL )
   {
      this_obj = SEVAR_GET_OBJECT(CALL_THIS);
   }
   if( this_obj==NULL
    && (HowToInterpret&JSE_INTERPRET_PARENTTHIS)!=0 )
   {
      if( FRAME!=NULL )
      {
         STACKPTR old_frame;
         uword16 old_num_args;
         old_num_args = (uword16)SEVAR_GET_STORAGE_LONG(OLD_ARGS);
         old_frame = SEVAR_GET_STORAGE_PTR(OLD_FRAME);
         if( old_frame )
         {
            this_obj = SEVAR_GET_OBJECT(old_frame-(THIS_OFFSET+old_num_args));
         }
      }
   }
   if( this_obj==NULL )
   {
      this_obj = CALL_GLOBAL(InterpretCall);
   }
   RunCompiledCode(InterpretCall,argc,argv,CallMain,
                   this_obj,HowToInterpret);
   }
                                 
                               
                               
                              
                                - jseGarbageCollect() can call recursively,
                                  corrupting data
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: jseGarbageCollect(...,JSE_GARBAGE_COLLECT),
                                  if called within an action of the garbage collector
                                  itself, can tigger recursive GC that will corrupt
                                  data. 
                                 Fix: In srccore/util.c, function jseGarbageCollect(),
                                  at about line 332, replace the code for "case JSE_GARBAGE_COLLECT"
                                  with this code: 
                                
                                  case JSE_GARBAGE_COLLECT:
   garbageCollect(jsecontext);
   break;
 
                                 
                               
                               
                              
                                - Errors during jseCallFunction set "trapped=True"
                                  in jseAtErrorFunc()
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: Errors in code executed via jseCallFunction()
                                  always have 'trapped = TRUE' in the jseAtErrorFunc
                                  callback. 
                                 Fix: In srccore\call.h, add to the
                                  end of the 'struct Global_' definition (near
                                  line 627): 
                                
                                
                                  STACKPTR call_func_mark; 
                                 
                                
                                In srccore\call.c:~1493, in the function 'callErrorTrapped',
                                  change this line: 
                                
                                
                                  if( !tries->incatch && tries->catch!=(ADDR_TYPE)-1 ) 
                                 
                                
                                to: 
                                
                                
                                  if( !tries->incatch && tries->catch!=(ADDR_TYPE)-1
 && ( call->Global->call_func_mark==NULL
   || tries->fptr>call->Global->call_func_mark ) ) 
                                 
                                
                                In srccore\jselib.c function jseCallFunctionEx()
                                  line 2562, get rid of this line: 
                                
                                
                                  call->mustPrintError = False; 
                                 
                                
                                and replace it with: 
                                
                                
                                  call_func_mark_save = call->Global->call_func_mark;
call->Global->call_func_mark = FRAME;
if( flags&JSE_FUNC_TRAP_ERRORS )
   call->mustPrintError = FALSE; 
                                 
                                
                                then right after the 'callFunctionFully()'
                                  (the next line in the file), add: 
                                
                                
                                  call->Global->call_func_mark = call_func_mark_save; 
                                 
                                
                                at the top of that same function, add the local
                                  variable: 
                                
                                
                                  STACKPTR call_func_mark_save; 
                                 
                                
                                In srccore/util.c:~1836, function callPrintError(),
                                  find this line: 
                                
                                
                                  seVar loc = STACK_PUSH; 
                                 
                                
                                Remove the initialization (i.e. alter this
                                  line) to make: 
                                
                                
                                  seVar loc; 
                                 
                                
                                and add: 
                                
                                
                                  loc = STACK_PUSH; 
                                 
                                
                                after this line: 
                                
                                
                                  if( call->errorPrinted ) return; 
                                 
                               
                               
                              
                                - static Array initializer is not instanceof
                                  Object
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Bug: When an Array object is initialized with
                                  a static Array Initialiser, as in this code: 
                                
                                  var foo = [ 1, 2, 3 ]; 
                                 
                                is is recognized as "instanceof Array"
                                  but is not recognized as "instanceof Object". 
                                Fix: In srccore/secode.c, function secodeInterpret(),
                                  "case seInstanceof:", at about line
                                  2057 is this comment: 
                                
                                  /* at any rate, this is the last chance. */ 
                                 
                                to fix this bug, insert the following code
                                  ahead of that comment, so it reads: 
                                
                                  /* finally, all objects inherit from Object */
else if ( call->PrototypeCache.Object
       == functionPrototype->data.object_val.obj )
   result = True;
/* at any rate, this is the last chance. */ 
                                 
                               
                               
                              
                                - empty Object initializer creates an Array
                                  object; should be an Object object
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Bug: When an object is initialized with the
                                  empty set, as in this code: 
                                
                                  var foo = { };
                                 
                                it is initialized as a type Array object, although
                                  it should be an Object object. 
                                Fix: In srccore/expressn.c, function
                                  secompileObject(), at about line 1529, change
                                  this line: 
                                
                                  if( tokType(&tok)!=':' ) 
                                 
                                to this 
                                
                                  if( tokType(&tok)!=':' && tokType(this->token)!='}' ) 
                                 
                               
                               
                              
                                - infinite loop if accessing dynamic callback
                                  object reports an error
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Bug: A dynamic member is passed to a function.
                                  If the dynamic object is implemented via callbacks,
                                  and the dynamic member access results in an
                                  error (i.e. the callback uses jseLibErrorPrintf),
                                  an infinite loop and crash results. 
                                Fix: In srccore/varutil.c, the function
                                  seobjCallDynamicProperty() locate these lines
                                  at about line 2648: 
                                
                                
                                  CALL_KILL_TEMPVARS(call,mark);
if( done || CALL_QUIT(call) ) return True; 
                                 
                                
                                Right between them add the following code: 
                                
                                
                                  if( CALL_QUIT(call) && result!=NULL )
{
   SEVAR_INIT_UNDEFINED(result);
}
                                 
                               
                               
                              
                                - "continue" within "switch"
                                  statement jumps to wrong condition
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Bug: The "continue" statement, when
                                  within a "switch" block, will associate
                                  its condition with the "switch" statement
                                  instead of the enclosing loop. 
                                 
                                Fix: In srccore/secode.h, at about line
                                  666, add this to the "loopTracker"
                                  structure: 
                                
                                  jsebool is_switch; 
                                 
                                and at line 776 change the prototype to: 
                                
                                  secompileNewLoop(struct secompile *handle,struct gotoItem *label,jsebool is_switch); 
                                 
                                Then in srccore/statement.c, all calls to secompileNewLoop()
                                  get a third False parameter, except for the
                                  one in secompileSwitch() which adds True as
                                  its third parameter (at about line 444). 
                                Then in srccore/expressn.c, at about line 574,
                                  change the secompileNewLoop code to this: 
                                
                                     void NEAR_CALL
secompileNewLoop(struct secompile *this,struct gotoItem *label,jsebool is_switch)
{
   struct loopTracker *t = looptrackerNew();
   t->next = this->loopTrack;
   this->loopTrack = t;
   t->is_switch = is_switch;
   if( label!=NULL ) label->loop = t;
}
                                 
                                and at about line 621 change secompileAddContinue()
                                  to this: 
                                
                                     jsebool NEAR_CALL
secompileAddContinue(struct secompile *this,struct loopTracker *it)
{
   if( it==NULL )
   {
      it = this->loopTrack;
      while( it!=NULL && (it->is_switch) )
         it = it->next;
   }
   /* add a continue (goto), but mark it so it can be back-filled later
    * when we figure out where break goes to!
    */
   if( it==NULL )
   {
      callQuit(this->call,textcoreBAD_BREAK);
      return False;
   }
   looptrackerAddContinue(it,secompileCurrentItem(this));
   secompileAddItem(this,seTransfer,(ADDR_TYPE)0);
   return True;
}
                                 
                                and, finally, in srccore/statemnt.c, function
                                  secompileStatement(), within the "case
                                  seTokContinue", at about line 943, change
                                  this code: 
                                
                                  it = this->gotoTrack->labels[x].loop;
if( it==NULL )
{
                                 
                                to this 
                                
                                  it = this->gotoTrack->labels[x].loop;
if( it==NULL || (it->is_switch && !isbreak) )
{
                                 
                               
                               
                              
                                - "var foo" keyword in jseInterpret()
                                  or eval() makes "foo" undefined
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Error: The "var" statement in jseInterp()
                                  or eval() calls is always resetting the variable
                                  to undefined even when it already exists in
                                  scope. 
                                 
                                Fix: In srrccore/varutil.c near the
                                  beginning of function seobjHasProperty(), at
                                  about line 2918, change this line 
                                
                                  assert( sevarIsValid(call,dest) ); 
                                 
                                to this line 
                                
                                  // old version: if( dest!=NULL ) assert( sevarIsValid(call,dest) );
assert( dest==NULL || sevarIsValid(call,dest) );
 
                                 
                                and in srccore/call.c in function callFunction(),
                                  at line 564, change this block 
                                
                                  else
{
   SEVAR_INIT_UNDEFINED(tmp);
}
SEVAR_DO_PUT(call,loc,tmp);
                                  /* no need to set the attributes directly, the variable object 
                                 
                                to this block 
                                
                                  else
{
   SEVAR_INIT_UNDEFINED(tmp);
}
assert( SEVAR_GET_TYPE(loc)==VReference );
if( SEVAR_GET_TYPE(tmp)!=VUndefined ||
    !seobjHasProperty(call,
           loc->data.ref_val.base,
           loc->data.ref_val.reference,
           NULL,
           FALSE) )
{
   SEVAR_DO_PUT(call,loc,tmp);
} 
                                  
/* no need to set the attributes directly, the variable object 
                                 
                               
                               
                              
                                - api jseString table growing without bounds
                                  - slowing callbacks
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Bug: The api jseString table (which holds
                                  strings visible to callbacks) may be growing
                                  without bounds, causing overall system performance
                                  (especially of callbacks) to degrade over time. 
                                 
                                Fix: In srccore/util.c, at about line
                                  312, replace the callRemoveApiStringEntry()
                                  function with the one found at ftp://ftp.nombas.com/pub/isdkeval/se430/callremoveapistringentry.c 
                               
                               
                              
                                - "var" within jseInterpret() or
                                  eval() may not use local variables
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Bug: Caching of global variables may prevent
                                  the "var" keyword when used within
                                  jseInterpret (or as often found in eval(), which
                                  uses jseInterpret()) may prevent the variable
                                  from being recognized as a local variable. For
                                  example, in this script: 
                                
                                  var foo = "global";
funky();
function funky()
{
   var what = foo + "variable";
   eval("var foo = \"local\"";);
   what = foo + "variable";
}
                                 
                                the value for variable "what" may
                                  be "globalvariable", showing that
                                  global varible caching has prevented "foo"
                                  from being recognized as a local variable after
                                  the call to eval(). 
                                 
                                Fix: In srccore/call.c, in function
                                  CreateVariableObject(), at about line 886, change
                                  this code: 
                                
                                  /* check if already built */
if( old_fptr )
{
   if( SEVAR_GET_STORAGE_PTR(old_fptr-VAROBJ_OFFSET)!=NULL ) return;
}
else
{
   if( call->VariableObject!=NULL ) return;
}
                                 
                                to this: 
                                
                                  /* check if already built */
if( old_fptr )
{
   SEVAR_INIT_BOOLEAN(old_fptr-USE_CACHE_OFFSET,FALSE);
   if( SEVAR_GET_STORAGE_PTR(old_fptr-VAROBJ_OFFSET)!=NULL ) return;
}
else
{
   call->useCache = FALSE;
   if( call->VariableObject!=NULL ) return;
}
                                 
                               
                               
                              
                                - JSE_HTML_COMMENT_STYLE too strict with
                                  end comments 
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: HTML browsers frequenly hide code
                                  from non-Ecmascript-aware old browsers by hiding
                                  linkes within the "<!--" and "//-->"
                                  tags. When compiling the ScriptEase:ISDK with
                                  "#define JSE_HTML_COMMENT_STYLE 1"
                                  the engine will recognize the "<!--"
                                  as the begin comment. But it turns out that
                                  many pages are being written with "-->"
                                  as the end comment, instead of "//-->"
                                  as the rules state; these pages generate a parsing
                                  error with SE:ISDK. 
                                Fix: In srccore/call.h, within the definition
                                  of "struct CompileStatus_", add this
                                  code at about line 353: 
                                
                                  #if defined(JSE_HTML_COMMENT_STYLE) && (JSE_HTML_COMMENT_STYLE==1)
   sint paren_group_depth; /* track depth within ((())) */
#endif 
                                 
                                In srccore/code.c, function tokGetNext(), line
                                  351 begins a block of "case" statements
                                  begging with this: 
                                
                                   case UNICHR('%'): case UNICHR('&'): case UNICHR('^'):
                                 
                                remove the two statements (line 359) for the
                                  characters '(' and ')' and move them to the
                                  top of the case block, so that case blocks begins
                                  at line 351 with this code: 
                                
                                  case UNICHR('('): case UNICHR(')'):
   #if defined(JSE_HTML_COMMENT_STYLE) && (JSE_HTML_COMMENT_STYLE==1)
      call->Global->CompileStatus.paren_group_depth += ( theChar == UNICHR('(') ) ? 1 : -1 ;
   # endif
                                 
                                In the same function, at line 286, replace
                                  this code: 
                                
                                  case UNICHR('-'): Type = seTokDecrement; break;
                                 
                                with: 
                                
                                  case UNICHR('-'):
   #if defined(JSE_HTML_COMMENT_STYLE) && (JSE_HTML_COMMENT_STYLE==1)
      /* comments in HTML are supposed to look like "// -->" but sometimes
       * the code-writers forget that, and so HTML parsers commonly recognize
       * this error (because there's no valid "-->" outside of () scoping.
       */
      if ( '>' == JSECHARPTR_GETC(JSECHARPTR_NEXT(call->Global->CompileStatus.srcptr))
        && 0 == call->Global->CompileStatus.paren_group_depth            )
      {
         goto EndOfSourceLine;
      }
   #endif
   Type = seTokDecrement; break;
                                 
                                Finally, in srccore/code.c, function CompileFromText(),
                                  at line and agin in the same function, at about
                                  line 87 (just after ...NowCompiling++) add this: 
                                
                                  #if defined(JSE_HTML_COMMENT_STYLE) && (JSE_HTML_COMMENT_STYLE==1)
   call->Global->CompileStatus.paren_group_depth = 0;
endif 
                                 
                               
                               
                              
                                - jseVariable not freed when string.replace()
                                  fails 
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: If there is an error parsing a regular-expression
                                  entry of String.prototype.replace(), then a
                                  variable may remain unfreed. An example of a
                                  script causing this error is this: 
                                
                                  var s = "foo?"; s.replace( "?", "bar" ); 
                                 
                                Fix: In srclib/ecma/seobject.c, function
                                  string_search_helper(), there are two places
                                  where the function can return without freeing
                                  the "String" variable. At about line
                                  4368, replace this code: 
                                
                                  jseDestroyStack(jsecontext,stack);
return NULL; 
                                 
                                with this: 
                                
                                  jseDestroyStack(jsecontext,stack);
jseDestroyVariable(jsecontext,string);
return NULL; 
                                 
                                and at about line 4399 replace this code: 
                                
                                  if( jseQuitFlagged(jsecontext) ) return NULL;  
                                 
                                with this: 
                                
                                  if( jseQuitFlagged(jsecontext) )
{
   jseDestroyVariable(jsecontext,string);
   return NULL;
}
                                 
                               
                               
                              
                                - continue statement in do/while skips while
                                  
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: continue used in a do/while loop
                                  not doing the while condition test, always going
                                  to top of loop 
                                Fix: In srccore/statemnt.c function
                                  secompileDo(), at the top of the function (about
                                  line 124) add this new local variable: 
                                
                                  ADDR_TYPE cont_addr;  
                                 
                                In the middle of the function, right before
                                  this existing line (line 148): 
                                
                                  secompileAddItem(this,seContinueFunc,this->prevLineNumber); 
                                 
                                add: 
                                
                                  cont_addr = secompileCurrentItem(this);  
                                 
                                finally, at the bottom of the function, change
                                  this line (line 166): 
                                
                                  secompileEndLoop(this,secompileCurrentItem(this),top_of_loop,label); 
                                 
                                to: 
                                
                                  secompileEndLoop(this,secompileCurrentItem(this),cont_addr,label);           
                                 
                               
                               
                              
                                - jseCreateVariable parameters not pass-by-reference
                                  
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: When passing non-reference variables
                                  (i.e. ones created with jseCreateVariable as
                                  opposed to gotten via jseMember/et al) to a
                                  function by reference using jseCallFunction,
                                  the variables are not updated. 
                                Fix: In srccore/jselib.c, at about line
                                  2434, replace the entire jseCallFunctionEx/jseReallyCallFunctionEx
                                  routine with the one found at ftp://ftp.nombas.com/pub/isdkeval/se430/jsecallfunction.c
                                 
                               
                               
                              
                                - C++ compilation errors for JSE_FLOATING_POINT==0
                                  
 
                                  (for ISDK/C 4.30d)  
                               
                              
                                 Problem: When compiling C++ files that defined
                                  JSE_FLOATING_POINT 0 there may be compile-time
                                  errors such as "missing end of file"
                                  or "missplaced }". 
                                Fix: In incjse/sefp.h at about line
                                  57 change the order of a few statements so that: 
                                
                                  #  ifdef __cplusplus
      extern "C" {
#  endif
#  if (0!=JSE_FLOATING_POINT)
                                 
                                is instead 
                                
                                  #  if (0!=JSE_FLOATING_POINT)
#  ifdef __cplusplus
      extern "C" {
#  endif
                                 
                                  
                               
                              
                               
                              
                              for 4.30c -- (may apply to earlier versions) 
                               
                              
                                - Unicode characters byte-swapped with pre-compiled
                                  source 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: With some compilers and options, unicode
                                  character can be byte-swapped while reading
                                  in from buffers created with jseCreateCodeTokenBuffer(). 
                                Fix: In srccore/token.c, function tokenReadString()
                                  at line 460 replace this code: 
                                
                                  c = (jsechar) (tokenReadByte(this) | (tokenReadByte(this) << 8)); 
                                 
                                with 
                                
                                  c = (jsechar) tokenReadByte(this);
c |= (jsechar) (tokenReadByte(this) << 8 ); 
                                 
                               
                               
                              
                                - multiple interprets multiply add filenames,
                                  use memory 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Problem: If JSE_GETFILENAMELIST is not disabled,
                                  then each time a file is interpreted it will
                                  add names to the global list of files. These
                                  names are never removed from the list until
                                  jseTerminateExternalLink() is called. The result
                                  is that if a long-running promise repeatedly
                                  interprets then it will continue to use a little
                                  extra memory each time, and that memory is not
                                  freed until jseTerminateExternalLink(). 
                                 Fix: These problem will not be fixed
                                  until the 4.40 release, and so if you are running
                                  many many interprets and this is a problem rebuild
                                  with "#define JSE_GETFILENAMELIST 0"
                                  Built in the way the only API functions missing
                                  will be jseGetFileNameList(). 
                               
                               
                              
                                - compilation of large scripts slow on some
                                  systems 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Problem: On systems with inefficient memory
                                  allocators compilation of large scripts, and
                                  saving compiled scripts with jseCreateCodeTokenBuffer(),
                                  can be extremely slow. 
                                Fix: In srccore/expressn.c, function
                                  secompileAddItem() at line 216, replace this
                                  line: 
                                
                                  This->opcodesAlloced += 100;  
                                 
                                with this: 
                                
                                  This->opcodesAlloced *= 2; 
                                 
                                and replace the structures and functions in
                                  srccore/token.h and srccore/token.c with those
                                  found at ftp://ftp.nombas.com/pub/isdkeval/se430/token.txt 
                               
                               
                              
                                - Buffer Object incorrectly detected 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: Library functions attempting to determine
                                  if a variable 
                                  is a Buffer Object will get incorrect False
                                  returns. 
                                Fix: In srclib/common/sedyna.c, function
                                  isBufferObject() change line 41 from: 
                                
                                  temp = jseGetMember(jsecontext,var,UNISTR("class"));
                                 
                                to: 
                                
                                  temp = jseGetMember(jsecontext,var, CLASS_PROPERTY); 
                                 
                               
                               
                              
                                - 16-bit Borland Compiler crashes 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Problem: Many operations can crash on 16-bit
                                  builds created with the Borland compiler, due
                                  to invalid shortcuts when comparing segmented
                                  memory pointers. 
                                 Fix: This is fixed in the 4.30d release. 
                               
                               
                              
                                - potential crash during eval() and other
                                  jseInterpret 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: Using jseInterpret can cause a crash
                                  if garbage collection hits at the wrong time.
                                  eval() uses this call underneath, so it will
                                  happen most often in eval(). 
                                Fix: in srccore/call.c, the function
                                  callInterpret(), line 1059, delete these two
                                  lines: 
                                
                                  call->ScopeChain = NULL; /* for if we collect trying to allocate one */
call->ScopeChain = seobjNewUnordered(call); 
                                 
                                Next, in the same function, at the top of the
                                  function, line 997 locate: 
                                
                                  call = jseMustMalloc(struct Call,sizeof(struct Call));
#  if ( 2 <= JSE_API_ASSERTLEVEL )
   call->cookie = (uword8) jseContext_cookie;
#  endif 
                                 
                                right after these lines, add: 
                                
                                  call->ScopeChain = seobjNewUnordered(this); 
                                 
                               
                               
                              
                                - jseObjectCallbacks destructors called twice
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: destructors declared using the object
                                  callbacks (rather than by the "_delete"
                                  member) can be called twice. 
                                Fix: srccore/garbage.c, function destructors(),
                                  after this code at line 815 
                                
                                  todestroy->flags &= ~HAS_DELETE_PROP; 
                                 
                                add this: 
                                
                                  #if JSE_DYNAMIC_OBJS!=0
   todestroy->callbacks = NULL;
#endif 
                                 
                               
                               
                              
                                - Compilation error message not terminated
                                  when end-quote missing 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: If a long literal string is missing its
                                  end-quote then the error message generated will
                                  not be null-terminated. 
                                Fix: In srccore/codeprt2.c, function
                                  CompileStringToken, insert a memcpy line between
                                  these two lines at 189 
                                
                                  jsechar ErrorBuf[80];
strncpy_jsechar((jsecharptr)ErrorBuf,src,(sizeof(ErrorBuf)/sizeof(jsechar))-1); 
                                 
                                resulting in 
                                
                                  jsechar ErrorBuf[80];
memset(ErrorBuf,0,sizeof(ErrorBuf));
strncpy_jsechar((jsecharptr)ErrorBuf,src,(sizeof(ErrorBuf)/sizeof(jsechar))-1); 
                                 
                                so the buffer will always be null-terminated. 
                               
                               
                              
                                - Cannot compile headers from C++ 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Error: C++ compilers fail on some header files. 
                                Fix: in srcapp/sesecure.h and srclib/selib/selib.h
                                  add these lines to the end of the file: 
                                
                                  #ifdef __cplusplus
   extern "C" {
#endif 
                                 
                               
                               
                              
                                - jseStrings invalid if more than 100 are
                                  used 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: using too many API jseStrings at once
                                  breaks (over 100). 
                                 Fix: There were many changes in call.h,
                                  util.c, garbage.c, and jselib.c to fix this.
                                  Those changes will be released with 4.30d. A
                                  workaround for this is to increase the value
                                  in srccore/util.c function callApiStringEntry()
                                  at line 259 from 100 to the maximum number of
                                  strings your system will use. 
                               
                               
                              
                                - MBCS errors on little-endian processors
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Problem: assert failure when printing an error
                                  in a context that has already had an error printed.
                                  This can happen when atexit/destructors are
                                  called, and there is a consistent problem in
                                  them such as not enough stack space. 
                                Fix: In srccore/util.c, function callPrintError()
                                  at line 1781 change 
                                
                                  call->state = 0;
/* Just convert the error to a string and print it */
if( call->errorPrinted ) return; 
                                 
                                to 
                                
                                  /* Just convert the error to a string and print it */
if( call->errorPrinted ) return;
call->state = 0; 
                                 
                               
                               
                              
                                - MBCS errors on little-endian processors
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: Some of the built-in macros and function
                                  do not handle MBCS characters correctly on little-endian
                                  processors. 
                                Fix: In srcmisc/seuni.h at line 345
                                  replace this: 
                                
                                  size_t sizeof_jsechar(jsechar c); 
                                 
                                with 
                                
                                  #define sizeof_jsechar(jsechar c) ( ((uint)c < 256) ? 1 : 2 ) 
                                 
                                and in srcmisc/utilstr.c t line 218 remove
                                  the sizeof_jsechar() function, and at line 283
                                  replace the JSECHARPTR_PUTC() function with
                                  this: 
                                
                                  void JSECHARPTR_PUTC(jsecharptr str, jsechar c)
{
   assert( (uword32)c < 0x10000 );
   if ( 255 < (uint)c )
   {
      *((unsigned char *)str)++ = c >> 8;
   }
   *(unsigned char *)str = c & 0xFF;
}
                                 
                               
                               
                              
                                - JSE_ONE_STRING_TABLE not supported 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Problem: Compile-time option JSE_ONE_STRING_TABLE
                                  is not supported in the 4.30c release with multiple
                                  jsecontext's. 
                                Fix: Disabling JSE_ONE_STRING_TABLE will work
                                  fine if your contexts are not sharing VarName's.
                                  If you must use JSE_ONE_STRING_TABLE then in
                                  srccore/util.c, function callCleanupGlobal()
                                  the block beginning with 
                                
                                  for( i = 0; i < hashSize; i++ ) 
                                 
                                at about line 904 should be within the same
                                  JSE_ONE_STRING_TABLE ifdefs as the lines preceding
                                  and following that block. Furthermore, this
                                  same block of code should be added to the freeGlobalStringTable()
                                  function. 
                               
                               
                              
                                - jseInterpret finds old globals before new
                                  globals 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Error: When using jseInterpret and seeing
                                  old variables, old globals appear before new
                                  globals rather than after them. 
                                Fix: In srccore/call.c:374, remove this block: 
                                
                                  if( CALL_GLOBAL(call->prev)!=CALL_GLOBAL(call) )
{
   seObjectMem mem = SEOBJ_CREATE_MEMBER(call,call->ScopeChain,NULL);
   SEVAR_INIT_OBJECT(&(mem->value),CALL_GLOBAL(call));
}
                                 
                                in srccore/call.c:441, remove this block: 
                                
                                  #                 if JSE_CACHE_GLOBAL_VARS==1
                     /* actually copied something before the global in the
                      * scope chain, so cannot use cache.
                      */
                     call->useCache = False;
#                 endif
                                 
                                then right after that last block there are
                                  4 closing '}'s: 
                                
                                                 }
            }
         }
      }
                                  Change that to: 
                                                 }
            }
         }
         if( call->ScopeChain->used!=0 &&
             CALL_GLOBAL(call)!=CALL_GLOBAL(call->prev))
         {
            /* we can see old scope chain entries, should not take
             * precedence over the new global object, so add that
             * to the scope chain now.
             */
            seObjectMem mem = SEOBJ_CREATE_MEMBER(call,call->ScopeChain,NULL);
            SEVAR_INIT_OBJECT(&(mem->value),CALL_GLOBAL(call));
         }
      } 
                                 
                               
                               
                              
                                - stack-space test misses local variables
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: local variable stack space not properly
                                  accounted for when determining if a function
                                  will run out of stack space. 
                                Fix: In srccore/call.c, function callFunction(),
                                  at about line 255 change this code: 
                                
                                  if ( isinit )
{
   /* locals go in global object for init function, not on stack */
                                 
                                to this: 
                                
                                  if ( !isinit )
{
   /* locals go in global object for init function, not on stack */
                                 
                               
                               
                              
                                - Compilation error for incomplete regular
                                  expressions 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: Compilation error if unfinished regular
                                  expression (e.g. "/a") appears at
                                  the end of a file or text. 
                                Fix: in CODEPRT2.C, function CompileRegExpLiteral()
                                  change the two instances (lines 65 and 76) of 
                                
                                  if( c=='\r' || c=='\n' ) 
                                 
                                to be 
                                
                                  if( c=='\r' || c=='\n' || c=='\0' ) 
                                 
                               
                               
                              
                                - current token being referenced on failure
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Problem: If there is an error during the compilation
                                  of a function, SECOMPILE_CURRENT_TOKEN() is
                                  still called even though the tokens used for
                                  that function may be 0. 
                                Fix: in srccore/expressn.c, function
                                  secompileFunctionBody() at the beginning (line
                                  1311) change this line: 
                                
                                  jsebool success = False; 
                                 
                                to be 
                                
                                  jsebool success = init_func; 
                                 
                                and in the same function around line 1471 put
                                  this line 
                                
                                  *next_token = *SECOMPILE_CURRENT_TOKEN(&This); 
                                 
                                within "if(success)" so it becomes 
                                
                                  if ( success ) *next_token = *SECOMPILE_CURRENT_TOKEN(&This); 
                                 
                               
                               
                              
                                - Debugger crashes for some error messages
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Problem: The debugger would crash on most
                                  errors messages thrown in a script using the
                                  "throw" keyword. 
                                Fix: The problem was due to some string
                                  handling of the error message in sedbgw32\jsedbug.cpp
                                  that didn't check the return of some string
                                  parsing functions, due to an assumption regarding
                                  the format of the error text. This would result
                                  in a null pointer exception at runtime. Proper
                                  checking of those function returns has been
                                  inserted, and new builds (4.30d) of the debugger
                                  will include this fix. 
                               
                               
                              
                                - MBCS errors with MSVC6 built-in functions
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: On MSVC6 builds, using the default Microsoft
                                  MBCS macros and library translations, there
                                  are errors with getting and putting two-byte
                                  characters. 
                                Fix: In srcmisc\seuni.h, make the macro
                                  for sizeof_jsechar() at about line 345, be this: 
                                
                                  #define sizeof_jsechar(c) ( ((uint)(c) < 256) ? 1 : 2 ) 
                                 
                                and in the same file change the JSECHARPTR_PUTC()
                                  macro, at about line 336, to this function declaration: 
                                
                                  void JSECHARPTR_PUTC(jsecharptr ptr, jsechar c); 
                                 
                                Also in srcmsic\seuni.h, for MSVC6 the macro
                                  for JSECHARPTR_GETC(), at about line 335, should
                                  be this: 
                                
                                  #define JSECHARPTR_GETC(JSECHAR) \
           ((jsechar)_mbsnextc((unsigned char *)(JSECHAR)))
                                 
                                Then in srcmisc/utilstr.c, in the MBCS section,
                                  after line 215, add this function: 
                                
                                  void JSECHARPTR_PUTC(jsecharptr str, jsechar c)
{
   assert( (uword32)c < 0x10000 ); /* if wrong then expand */
   if ( 255 < (uint)c )
   {
      *(unsigned char *)str = c >> 8;
      str = (jsecharptr)(((char *)str) + 1);
   }
   *(unsigned char *)str = c & 0xFF;
}
                                 
                               
                               
                              
                                - Memory leak for MBCS cfunction string insertion
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: If JSE_C_EXTENSIONS and JSE_MBCS are
                                  both enabled, and if the script is within a
                                  cfunction performance an operation that must
                                  insert a character into a string (e.g. str[4]='c'),
                                  then some memory will not be freed. 
                                Fix: In srccore/var.c, function seobjPutIntoString(),
                                  at about line 433 where the string data is assigned
                                  with this line: 
                                
                                  str->data.string_val.data->data = tmp; 
                                 
                                insert a statement to free the previous pointer,
                                  so it is: 
                                
                                  jseMustFree(str->data.string_val.data->data);
str->data.string_val.data->data = tmp; 
                                 
                               
                               
                              
                                - MBCS and UNICODE data not freed in regular
                                  expressions library 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: An allocated string may remain unfreed
                                  when using regular expressions in unicode and
                                  MBCS builds. 
                                Fix: In srclib/ecma/seregexp.c function
                                  RegExp_ExecOrCallOrTest(), at about line 621,
                                  this line 
                                
                                  FreeJsecharString(asciiInput); 
                                 
                                should be 
                                
                                  FreeAsciiString(asciiInput); 
                                 
                               
                               
                              
                                - Comparisons of MBCS strings may be incorrect
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: If two MBCS string are of a different
                                  physical length, comparisons may not include
                                  all characters, and so the results may be incorrect. 
                                Fix: In srccore/varutil.c function sevarECMACompareEquality(),
                                  step 11 at about line 1056 insert code between
                                  these lines: 
                                
                                                             lx *= sizeof(jsechar);
#                 endif 
                                 
                                resulting in this code: 
                                
                                                             lx *= sizeof(jsechar);
#                 elif defined(JSE_MBCS) && (0!=JSE_MBCS)
                        lx = BYTECOUNT_FROM_STRLEN(sx,lx);
                        if( lx!=BYTECOUNT_FROM_STRLEN(sy,ly) )
                           result = FALSE;
                        else
#                 endif
                                 
                                Also srcmisc/utilstr.c, function jsecharCompare(),
                                  line 355, extend the preprocessor directive
                                  for JSE_UNICODE so it also include JSE_MBCS,
                                  as in: 
                                
                                  #if (defined(JSE_UNICODE) && (0!=JSE_UNICODE)) \
 || (defined(JSE_MBCS) && (0!=JSE_MBCS)) 
                                 
                               
                               
                              
                                - alignment problem terminating MBCS strings
                                  with null character 
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: On systems with word-alignment restrictions
                                  the final null character for MBCS systems may
                                  cause abort. 
                                Fix: In srccore/garbage.c, function
                                  sestrCreate(), at about line 1256 this line 
                                
                                  *(jsechar *)(((ubyte *)newmem)+bytelen) = '\0'; 
                                 
                                should be 
                                
                                  *(jsecharptrdatum *)(((ubyte *)newmem)+bytelen) = '\0'; 
                                 
                                Also, in srccore/extlib.c, function extensionLibraryStartup()
                                  this line 
                                
                                  FullLibraryPath[0]=='\0' 
                                 
                                should be 
                                
                                  JSECHARPTR_GETC(FullLibraryPath)=='\0' 
                                 
                               
                               
                              
                                - string concatenation errors in MBCS builds
                                  
 
                                  (for ISDK/C 4.30c)  
                               
                              
                                 Bug: In MBCS builds, any operation which causes
                                  string concatenation, such as "what"+"up"
                                  can use too much memory, create invalid results,
                                  or crash. 
                                Fix: In srccore/varutil.c function ConcatenateStrings(),
                                  at about line 61 this code 
                                
                                  JSE_POINTER_UINDEX bytelen2 = BYTECOUNT_FROM_STRLEN(mem1,len2); 
                                 
                                should be 
                                
                                  JSE_POINTER_UINDEX bytelen2 = BYTECOUNT_FROM_STRLEN(mem2,len2); 
                                 
                                  
                               
                              
                               
                              
                              for 4.30b -- (may apply to earlier version) 
                               
                              
                                - Adding global _get does not remove global
                                  cache 
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Problem: assigning an _get to the global doesn't
                                  turn off the global cache for the executing
                                  function. Thus, the _get is not called everytime,
                                  but rather the value is cached. 
                                Fix: In srccore/varutil.c, function
                                  seobjCreateMemberGeneric(), at line 1359 find
                                  this section: 
                                
                                  {    this->flags |= DynamicHashListFromName(name)->HasFlag;    if( name!=global->global_strings[prototype_entry] )       this->flags |= OBJ_IS_DYNAMIC; }
                                 
                                and change it to this, just adding the last
                                  if-statement: 
                                
                                
                                  {
   this->flags |= DynamicHashListFromName(name)->HasFlag;
   if( name!=global->global_strings[prototype_entry] )
      this->flags |= OBJ_IS_DYNAMIC;
   if( name==global->global_strings[get_entry]    && this==call->GlobalObject )
           call->useCache = False;
}
                                 
                                and in the same file and fucntion at line 1372
                                  change this block: 
                               
                              
                                
                                  else if( name==global->global_strings[get_entry] )
{
   this->flags |= HAS_GET_PROP|OBJ_IS_DYNAMIC;
}
                                 
                                is changed to this block: 
                                
                                  else if( name==global->global_strings[get_entry] )
{
   if( this==call->GlobalObject )
      call->useCache = False;    this->flags |= HAS_GET_PROP|OBJ_IS_DYNAMIC;
}
                                 
                               
                               
                              
                                - Crash using VariableObject on sub-interprets
                                  
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Bug: In some conditions, when calling an interpret()
                                  function from within another interpret, the
                                  program will crash while accessing VariableObject. 
                                Fix: In srccore/call.c, function callInterpret(),
                                  at about line 1023, this code fragment: 
                                
                                  && this->prev!=NULL 
                                 
                                should be changed to: 
                                
                                  && this->VariableObject!=NULL 
                                 
                               
                               
                              
                                - SEOBJ_DYNAMIC_UNDEFINED logic incorrect
                                  
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Error: There are a couple of problems with
                                  the logic in the SEOBJ_DYNAMIC_UNDEFINED behavior
                                  in the seobjCallDynamicProperty() function.
                                  First, if the property exists but is jseTypeUndefined
                                  the dynamic functions were not being called.
                                  Second, the _prototype chain was not be checked
                                  in those cases where it should be. 
                                Fix: This logic has been fixed in 4.30c
                                  in srccore/varutil.c function seobjCallDynamicProperty()
                                  by rewriting the block that begins: 
                                
                                  if( (obj->flags & SEOBJ_DYNAMIC_UNDEFINED)!=0 
                                 
                               
                               
                              
                                - Warnings missing about long-lived temporary
                                  variables 
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Problem: Previous releases had a !NDEBUG message
                                  generated in the JSEDEBUG.LOG file to help track
                                  down long-lived temporary variables. 
                                Fix: In srccore/jselib.c, function seapiCopyAndReturn(),
                                  at about line 360, before this line: 
                                
                                  if( call->tempvars!=NULL ) 
                                 
                                add this code: 
                                
                                  #ifndef NDEBUG
if ( call->prev==NULL && FRAME == NULL )
   DebugPrintf(UNISTR("temporary variable reference created ")\
               UNISTR("on non-wrapper frame.\n")\
               UNISTR("This can be inefficient. Use \"create\" or ")\
               UNISTR("\"jseCreateVar\" version of call.\n"));
#endif
                                 
                               
                               
                              
                                - source string memory not released in run
                                  compiled code 
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Problem: When interpreting from compiled code,
                                  memory used for strings in the source text are
                                  not freed after the code is loaded. 
                                Fix: Update to 4.30c, and #define the
                                  new preprocessor directive TOKEN_STRINGTABLE_HACK
                                  to workaround this problem. 
                               
                               
                              
                                - HashListFromName() can crash memory-segment
                                  environments 
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Error: In segmented-memory environments (such
                                  as win16), HashListFromName() macro may cause
                                  crashes if applied to numeric entries. 
                                Fix: In util.c, functions LockedStringTableEntry(),
                                  GrabStringTableEntry(), and ReleaseStringTableEntry(),
                                  move HashListFromName() macro to follow checks
                                  on whether a VarName is odd (i.e. is a numeric
                                  entry). 
                               
                               
                              
                                - NO_DEFAULT_VALUE message fails in MBCS
                                  builds 
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Problem: Dynamic object enumeration is broken
                                  when using jseGetNextMember and our 'create
                                  undefined placeholder members' method. 
                                Fix: Many small changes are required
                                  to fix this problem. Upgrade to 4.30c. 
                               
                               
                              
                                - NO_DEFAULT_VALUE message fails in MBCS
                                  builds 
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Bug: NO_DEFAULT_VALUE builds string incorrectly
                                  for MBCS builds 
                                Fix: in srccore/varutil.c function sevarDefaultValue()
                                  near the end of the function replace this code: 
                                
                                  if ( FindNames(call,this,JSECHARPTR_NEXT((jsecharptr)VarName),
               sizeof(VarName)/sizeof(VarName[0])-5,UNISTR("")) )
{
   VarName[0] = '(';
   strcat_jsechar((jsecharptr)VarName,UNISTR(") "));
}
                                 
                                with this code 
                                
                                  JSECHARPTR_PUTC(VarName,'(');
if ( FindNames(call,this,JSECHARPTR_NEXT((jsecharptr)VarName),
               sizeof(VarName)/sizeof(VarName[0])-5,UNISTR("")) )
   strcat_jsechar((jsecharptr)VarName,UNISTR(") "));
else
   JSECHARPTR_PUTC(VarName,'\0');
                                 
                               
                               
                              
                                - "++" and "--" are reversed when printing
                                  function variables 
 
                                  (for ISDK/C 4.30b)  
                               
                              
                                 Bug: When converting a function to text, as
                                  in ToSource on a function, the decrement will
                                  appear as "++" and increment will
                                  appear as "--". 
                                Fix: In srccore/function.c, tok_text
                                  table, at about line 114, the '++' and '--'
                                  entries in the table are swapped. '--' should
                                  be before '++' not the other way around. 
                               
                               
                              
                                - assert failures concatenting C-strings
                                  
 
                                  (for ISDK/C 4.30b)
                                   Problem: if you generate a C-function string
                                    that is offsetted, such as 'var a = "foobar"+3;',
                                    and then use that in a string concatenation,
                                    you'll get assert failures and wrong results. 
                                  Fix: In srccore/varutil.c, replace
                                    the ConcatenateStrings() function with the
                                    code released in 4.30c. 
                                
                               
                              
                                - DYN_DEFAULT global variable invalid if
                                  no JSE_OPERATOR_OVERLOADING 
 
                                  (for ISDK/C 4.30b)
                                   Error: DYN_DEFAULT global variable invalid
                                    if no JSE_OPERATOR_OVERLOADING 
                                  Fix: in srccore/call.c, function callNewGlobalVariable()
                                    move this chunk of code: 
                                  
                                    if( call->prev==NULL )
{
   call->DynamicDefault = seobjNew(call);
}
else
{
   assert( call->DynamicDefault==call->prev->DynamicDefault);
   assert( call->DynamicDefault!=NULL );
}
                                   
                                  in front of this line (instead of inside
                                    the block) 
                                  
                                    # if defined(JSE_OPERATOR_OVERLOADING) && (0!=JSE_OPERATOR_OVERLOADING) 
                                   
                                
                               
                              
                                - DescribeInvalidVar() overruns stack 
 
                                  (for ISDK/C 4.30b)
                                   Error: DescribeInvalidVar() may overrun
                                    stack for MBCS or UNICODE. 
                                  Fix: In srccore.util.c, function DescribeInvalidVar(),
                                    replace one instance of:  
                                  
                                    sizeof(BadDesc->VariableWanted) 
                                   
                                
                              
                                with  
                               
                              
                              
                                and replace one instance of  
                               
                              
                              
                                with  
                                
                                  sizeof(BadDesc->VariableName)/sizeof(jsechar) 
                                 
                               
                               
                              
                                - Iterating through activation object for
                                  pass-by-reference crashes 
 
                                  (for ISDK/C 4.30b)
                                   Bug: If a script function has pass-by-reference
                                    parameters, or is a cfunction, and if you
                                    iterate through the results of jseActivationObject()
                                    via jseGetNextMember(), you'll get asserts
                                    and crashes. 
                                  Fix: In srccore/jselib.c, function
                                    seapiGetValue, at about line 179 is this code: 
                                  
                                    SEVAR_COPY(&(var->last_access),&(var->value));
SEVAR_DEREFERENCE(call,&(var->last_access)); 
                                   
                                  which should be replaced with this:  
                                  
                                    SEVAR_COPY(&(var->last_access),&(var->value));
if ( var->last_access.type==VReferenceIndex
  && !SEOBJ_IS_DYNAMIC(var->last_access.data.ref_val.base) )
{
   SEVAR_COPY(&(var->last_access),
      seobjIndexMember(call,var->last_access.data.ref_val.base,
         (MemCountUInt)(JSE_POINTER_UINT)
         (var->last_access.data.ref_val.reference)));
}
SEVAR_DEREFERENCE(call,&(var->last_access));
                                   
                                
                               
                              
                                - Invalid assert() in MBCS builds 
 
                                  (for ISDK/C 4.30b)
                                   Problem: Invalid assert() in MBCS version
                                    of sevarDuplicateString(). 
                                  Fix: In srccore/garbage.c, function
                                    sevarDuplicateString(), at about line 1161
                                    is this assert statement: 
                                  
                                    assert( '\0' == JSECHARPTR_GETC(JSECHARPTR_OFFSET((jsecharptr)newmem,len)) );             
                                   
                                
                              
                                 That assert statement should be removed. 
                               
                               
                              
                                - Many problems in ScriptEase local and remote
                                  debugger 
 
                                  (for ISDK/C 4.30b)
                                   Errors: There were many problems with the
                                    4.30b debugger, including invalid display
                                    of null variables, invalid display of variable
                                    types, breakpoint colors inconsistent, no
                                    distinction between step-into/stop-over/step-out,
                                    and other sever and cosmetic problems. 
                                  Fix: Download SE:ISDK/C 4.30b, which
                                    includes the improved debugger. 
                                
                               
                              
                                - seBreakpointTest() misses global code after
                                  #include 
 
                                  (for ISDK/C 4.30b)
                                   Error: After stepping into code within an
                                    #include statement, and then returning to
                                    global code in the main file, the internal
                                    lines still report that they are in the #included
                                    file. 
                                  Fix: In srccore/statemnt.c, function
                                    secompileStatement() at about line 776, add
                                    this block before the "break;" statement
                                    for "case seTokFunction: case seTokCFunction:" 
                                  
                                    {
   uword8 tmp;
   VarName file = GrabStringTableEntry(
      this->call,
      this->call->Global->CompileStatus.CompilingFileName,
      strlen_jsechar(this->call->Global->CompileStatus.CompilingFileName),
      &tmp);
   secompileAddItem(this,seFilename,file);
   ReleaseStringTableEntry(file,tmp);
}
                                   
                                
                               
                              
                                - Cannot set Array length to zero 
 
                                  (for ISDK/C 4.30b)
                                   Bug: Setting Array length to 0 makes the
                                    length property go to 1. 
                                   Fix: In srccore/varutil.c, function
                                    seobjDeleteMember(), change this 
                                    code at about line 2321 change this line 
                                  
                                    MaxIdx = 0; 
                                   
                                   to 
                                  
                                    MaxIdx = -1; 
                                   
                                
                               
                              
                                - jseOptReqVarKeyword ignored in some cases
                                  
 
                                  (for ISDK/C 4.30b)
                                   Bug: 'cannot assign to lvalue' is wrongly
                                    reported in certain cases when working with
                                    objects with a dynamic _get. This may also
                                    present as "with" not working on
                                    object returned by _get(). 
                                  Fix: In srccore/secode.c, case sePushGlobalParam,
                                    at about line 1324 modify this code: 
                                  
                                    if( !callFindAnyVariable(call,mem,False,(t!=sePushGlobal)) )
{
   if( t==sePushGlobal )
                                   
                                
                              
                                 with a conditional check as follows: 
                                
                                   if( !callFindAnyVariable(call,mem,False,(t!=sePushGlobal)) )
 {
    if( jseOptReqVarKeyword & call->Global->ExternalLinkParms.options )
    {
       callQuit(call,textcoreFUNC_OR_VAR_NOT_DECLARED,mem);
      break;
   }
   if( t==sePushGlobal )
                                 
                               
                               
                              
                              
                                
                                  /* If not using same global, turn off cache */
if( CALL_GLOBAL(call)!=call->GlobalObject )
   call->useCache = False;  
                                 
                                and replace with this block:  
                               
                              
                               
                              
                                - jseInterpret() error if MayIContinue only
                                  returns False 
 
                                  (for ISDK/C 4.30b)
                                   Error: If MayIContinue() callback returns
                                    False, without setting an error message, then
                                    jseInterpret() return status is inconsistent. 
                                  Fix: To match future behavior, have
                                    your MayIContinue function first call 
                                
                              
                                
                                  jseLibErrorPrintf(jsecontext,"!InternalError 8001: do not continue");             
                                 
                                before returning False 
                               
                               
                              
                                - remote debugging hangs while transferring
                                  large files 
 
                                  (for ISDK/C 4.30b)
                                   Error: The proxy may hang during the "connecting..."
                                    message while debugging large files. The size
                                    that becomes a problem may depend on the relative
                                    speed of the two systems and their communication
                                    link. 
                                  Fix: If this is a problem on your
                                    system then send a message to isdk_support
                                    requesting updates to these files: srcdbg/debugme.c,
                                    srcdbg/proxy.c, and proxy/winproxy.cpp. 
                                
                               
                              
                                - jseLocateSource() is never returning NULL
                                  
 
                                  (for ISDK/C 4.30b)
                                   Problem: jseLocateSource() should return
                                    NULL when interpreting text that has no associated
                                    filename, such as when interpreting in-line
                                    code or when processing "#if" statements.
                                    Instead the function is returning "no
                                    filename". 
                                  Fix: In srccore/util.c, function jseLocateSource(),
                                    add this as the last statement before "return
                                    FileName;". 
                                  
                                    if ( FileName && !strcmp_jsechar(FileName,"no filename") )
   FileName = NULL; 
                                   
                                
                               
                              
                                - jseFuncVarNeed() error if offset exceeds
                                  parameter count 
 
                                  (for ISDK/C 4.30b)
                                   Bug: jseFuncVarNeed behavior is undefined
                                    if the requested parameter offset exceeds
                                    the number of parameters passed to the funcion. 
                                  Fix: In srccore\jselib.c function
                                    jseFuncVarNeed() change this line: 
                                  
                                    wSEVar dest = STACK_PUSH; 
                                   
                                  to this 
                                  
                                    wSEVar dest; 
                                   
                                  and after the "assert( call->next==NULL
                                    );" statement add this code: 
                                  
                                    if( call->num_args <= parameterOffset )
{
   callError(call,textcoreFUNCPARAM_NOT_PASSED,1 + parameterOffset,
             callCurrentName(call));
             return NULL;
}
dest = STACK_PUSH;
                                   
                                
                               
                              
                               
                              
                                - embedded function error if not last local
                                  variable 
 
                                  (for ISDK/C 4.30b) 
                                  Problem: when saving call chain for embedded
                                    functions, when the function embedded is not
                                    the last local variable declared, it was not
                                    working correctly. 
                                  Fix: In srccore/call.c, function callFunction()
                                    before this line (at about line 476) 
                                  
                                    /* all variables are initialized... 
                                   
                                
                              
                                insert this block of code (remember, this goes
                                  before the preceding comment): 
                                
                                  /* First pass, make space for locals */
if( !isinit )
{
   for( count = 0;count<lfunc->num_locals;count++ )
   {
      seVar newloc = STACK_PUSH;
      SEVAR_INIT_UNDEFINED(newloc);
   }
}
                                 
                                further in the same function, at about line
                                  556, replace this block: 
                                
                                  else
{
   /* make space for the local variable on the stack */
   seVar v = STACK_PUSH;
   if( if_func!=NULL )
   {
      SEVAR_INIT_OBJECT(v,if_func);
      v->data.object_val.savedScopeChain =
      SEVAR_GET_OBJECT(&(call->new_scope_chain));
   }
   else
   {
      SEVAR_INIT_UNDEFINED(v);
   }
}
                                 
                                with this: 
                               
                              
                                
                                  else if( if_func!=NULL )
{
   seVar v = CALL_LOCAL(count+1);
   seVar tmp = STACK_PUSH;
   SEVAR_INIT_OBJECT(tmp,if_func);
   tmp->data.object_val.savedScopeChain =
   SEVAR_GET_OBJECT(&(call->new_scope_chain));
   SEVAR_DO_PUT(call,v,tmp);
   STACK_POP;
}
                                 
                               
                               
                              
                                - "cannot assign to lvalue" or apply "with"
                                  error on dynamic _get 
 
                                  (for ISDK/C 4.30b) 
                                  Bug: 'cannot assign to lvalue' is wrongly
                                    reported in certain cases when working with
                                    objects with a dynamic _get. This may also
                                    present as "with" not working on
                                    object returned by _get(). 
                                  Fix: In srccore/varutil.c, function
                                    seobjHasProperty, change this code (if your
                                    code does not look like this see Object
                                    with _get but no _hasProperty always has the
                                    property): 
                                  
                                    if( seobjCallDynamicProperty(call,obj,OFF_GET_PROP,propname,False,dest) )
{
   jsebool ret = (SEVAR_GET_TYPE(dest)!=VUndefined) || handled;
   STACK_POP;
   return ret;
}
                                   
                                  to this code (the difference is the added
                                    "if" block):  
                                  
                                    if( seobjCallDynamicProperty(call,obj,OFF_GET_PROP,propname,False,dest) )
{
   jsebool ret = (SEVAR_GET_TYPE(dest)!=VUndefined) || handled;
   STACK_POP;
   if( ret && ref )
   {
      SEVAR_INIT_REFERENCE(dest,obj,propname);
   }
   return ret;
}
                                   
                                
                               
                              
                                - jseInterpret() may load functions into
                                  the wrong global space 
 
                                  (for ISDK/C 4.30b) 
                                  Bug: If jseInterpret() is called from within
                                    a library wrapper function, and if JSE_MULTIPLE_GLOBAL
                                    is enabled, then those properties and function
                                    loaded with jseInterpret() may not be attached
                                    to the correct global. 
                                  Fix: In srccore\call.c, function callInterpret(),
                                    change this line: 
                                  
                                    call->GlobalObject = this->GlobalObject; 
                                   
                                  to this: 
                                  
                                    call->GlobalObject = CALL_GLOBAL(this); 
                                   
                                  and in srccore\call.h, update the JSE_MULTIPLE_GLOBAL
                                    version of the CALL_SET_GLOBAL() macro to
                                    be this: 
                                  
                                    # define CALL_SET_GLOBAL(c,g) \
     if ( (c)->funcptr && (c)->funcptr->global_object ) \
        (c)->funcptr->global_object=(g); \
     else \
        (c)->GlobalObject = (g)
                                   
                                
                               
                              
                              
                                
                                  GetDotNamedVar(call,loc,ourname,False);
if( if_func!=NULL ) 
                                 
                                this "else" block should be added
                                  to follow that "if" block: 
                                
                                  else
{
   SEVAR_INIT_UNDEFINED(tmp);
   SEVAR_DO_PUT(call,loc,tmp);
}
                                 
                               
                               
                              
                               
                              
                               
                              
                                - "return" and "throw" problems with auto-semicolon
                                  insertion 
 
                                  (for ISDK/C 4.30b) 
                                  Error: Automatic insertion of semicolon misplaced
                                    with some "throw" and "return"
                                    statements.
                                   Fix: In srccore/textcore.h:329, add: 
                                  
                                    TC_RESOURCE(textcoreTHROW_NO_NEWLINE,SYNTAX_EXCEPTION,"1223",
   "Throw expression must appear on the same line as the throw statement.") 
                                   
                                   In srccore/statement.c:779, change the beginning
                                    of the case 'seTokThrow' to: 
                                  
                                    case seTokThrow:
{
   struct tok tok;
                                       tokLookAhead(this->call,this->locfunc,&tok);
   /* handle 'no line terminator here' in the production */
   if( tokType(&tok)==seTokEOL )
   {
      callQuit(this->call,textcoreTHROW_NO_NEWLINE);
      success = False;
      break;
   }
                                   
                                   same file, line 814, change the if test
                                    which looks like this: 
                                  
                                    if( tokType(&tok)==seTokEOL ) 
                                   
                                   to this: 
                                  
                                    if( tokType(&tok)==seTokEOL || tokType(&tok)=='}' ) 
                                   
                                
                               
                              
                                - functions called implicitly may have wrong
                                  "this" variable 
 
                                  (for ISDK/C 4.30b) 
                                  Bug: Functions called implicitly may have
                                    the wrong 'this'. In other words, if you do:
                                   
                                    var a = new Object();
a.foo = <some function>;
with( a )
   foo(); 
                                   
                                   That is supposed to work like you did 'a.foo()',
                                    and therefore 'a' should be the 'this' value
                                    for 'foo'. This errata fixes the problem with
                                    this not working. 
                                   Fix: In srccore\secode.h, find the
                                    END_SEOP_32BITS and make it and the next line
                                    into these 3: This just means adding the middle
                                    value and renumbering the last one. 
                                  
                                    #define END_SEOP_32BITS seBitAnd
#define seThisAndValue 107
#define NUM_SECODES 108 
                                   
                                   In srccore\expressn.c, right after this
                                    line: 
                                  
                                    { "seBitAnd", 0, 0 },
                                   
                                   add this line: 
                                  
                                    { "seThisAndValue", 0, 0 },
                                   
                                   in same file (expressn.c), line 1922, add
                                    this: 
                                  
                                    else if( this->expr.type==EXPR_GLOBAL )
{
   secompileAddItem(this,sePushGlobalParam,this->expr.name);
   secompileAddItem(this,seThisAndValue);
   this->expr.type = EXPR_STACKTOP;
}
                                   
                                   it should appear as a new else-arm in the
                                    existing code. Here is 
                                    the block before and after with it, so you
                                    can make sure to put it 
                                    in the right place: 
                                  
                                    else if( this->expr.type==EXPR_STACKTOP )
{
   /* top of stack is expression, we need to
    * get the 'this' (global object) underneath
    * it on the stack.
    */
   secompileAddItem(this,sePushGlobalObject);
   secompileAddItem(this,seSwap);
}
else if( this->expr.type==EXPR_GLOBAL )
{
   secompileAddItem(this,sePushGlobalParam,this->expr.name);
   secompileAddItem(this,seThisAndValue);
   this->expr.type = EXPR_STACKTOP;
}
else
{
   secompileAddItem(this,sePushGlobalObject);
}
                                   
                                   finally, at the end of secode.c, right before
                                    this block (the very 
                                    bottom of the file): 
                                  
                                    #        ifndef NDEBUG
            /* catch bad opcodes */
         default: assert( False ); break;
#        endif
                                   
                                   add this: 
                                  
                                    case seThisAndValue:
{
   seVar lhs = STACK0;
   seVar rhs = STACK_PUSH;
   SEVAR_COPY(rhs,lhs);
   SEVAR_DEREFERENCE(call,rhs);
   if( SEVAR_GET_TYPE(lhs)==VReference )
      SEVAR_INIT_OBJECT(lhs,lhs->data.ref_val.base);
   else
      SEVAR_INIT_OBJECT(lhs,CALL_GLOBAL(call));
   break;
} 
                                   
                                
                               
                              
                                - jseSetGlobalObject() corrupts the internal
                                  opcode stack 
 
                                  (for ISDK/C 4.30b) 
                                  Bug: jseGlobalObject() can mess up the internal
                                    stack, causing weird bugs.
                                    Fix: In srccore/util.c, function
                                    jseGlobalObjectEx(), the old version never
                                    did a STACK_POP for its STACK_PUSH, so change
                                    the final line of jseGlobalObjectEx() from:
                                   
                                  
                                    return SEAPI_RETURN(call,g,(flags & jseCreateVar)?True:False,
                    UNISTR("jseGlobalObjectEx"));
                                   
                                
                              
                                 to this code: 
                               
                              
                                
                                  {
   jseVariable ret;
   ret = SEAPI_RETURN(call,g,(flags & jseCreateVar)?True:False,
                      UNISTR("jseGlobalObjectEx"));
   STACK_POP;
   return ret;
}
                                 
                               
                               
                              
                                - Dynamic get/put ignored when converting
                                  properties to objects 
 
                                  (for ISDK/C 4.30b) 
                                  Bug: Dynamic get/put was being ignored in
                                    some cases involving auto-conversion to object.
                                    For example, in the statement "foo.goo.zoo"
                                    where "foo" is a dynamic object,
                                    get/put are ignore if "goo" is auto-converted
                                    to be an object. 
                                     
                                    Fix: In srccore/secode.c replace function
                                    do_op_member(() with the code found at ftp://ftp.nombas.com/pub/isdkeval/se430/do_op_member.c 
                                 
                               
                               
                              
                                - Object with _get but no _hasProperty always
                                  has the property 
 
                                  (for ISDK/C 4.30b) 
                                  Problem: For a dynamic object with a get
                                    but no hasProperty in the scope chain, undefined
                                    was being accepted as 'has the property',
                                    so that object ALWAYS was considered to have
                                    the property.
                                    Fix: In srccore/varutil.c, function
                                    seobjHasProperty() change this code:  
                                  
                                    if( dest==NULL ) dest = rhs;
if( sevarGetValue(call,rhs,propname,dest) )
{
   if( ref && dest!=rhs )
   {
      SEVAR_INIT_REFERENCE(dest,obj,propname);
   }
   STACK_POP;
   return True;
}
else
{
   return False;
}
                                   
                                
                              
                                 to this code: 
                               
                              
                                
                                  if( seobjCallDynamicProperty(call,obj,OFF_GET_PROP,propname,False,dest) )
{
   jsebool ret = (SEVAR_GET_TYPE(dest)!=VUndefined) || handled;
   STACK_POP;
   return ret;
}
STACK_POP;
                                 
                               
                              
                                 and remove "else" from this line: 
                               
                              
                               
                              
                                - jseSetGlobal fails when combined with with
                                  jseFunc_NoGlobalSwitch 
 
                                  (for ISDK/C 4.30b) 
                                  Bug: If you're in a wrapper function that
                                    is not flagged with jseFunc_NoGlobalSwitch,
                                    and if jseSetGlobal() is called, the global
                                    variable will not really change: 
                                     
                                    Fix: In CALL.H change the CALL_SET_GLOBAL
                                    macro to this:
                                   
                                    #if 0 != JSE_MULTIPLE_GLOBAL
# define CALL_SET_GLOBAL(c,g) \
     if ( (c)->funcptr && (c)->funcptr->global_object ) \
        (c)->funcptr->global_object=(g); \
     else \
        (c)->GlobalObject = (g)
#else
# define CALL_SET_GLOBAL(c,g) ((c)->GlobalObject = (g))
#endif 
                                   
                                
                               
                              
                                - function.arguments is not always available
                                  
 
                                  (for ISDK/C 4.30b) 
                                   Problem: The "function.arguments"
                                    syntax is not part of the ECMAScript specification.
                                    But many JavaScript books describe this feature
                                    and most browsers implement it, so your users
                                    may expect this capability.
                                    Fix: First, change every existing
                                    instance of  
                                  
                                    callCreateVariableObject(XXX) 
                                   
                                   to 
                                  
                                    callCreateVariableObjext(XXX,NULL) 
                                   
                                   Then in srccore/var.c, add this code to
                                    the very beginning of function seobjGetMemberStructEx(). 
                                  
                                    if( Name==call->Global->global_strings[arguments_entry]
 && SEOBJ_GET_FUNCTION(this)!=NULL )
{
   callCreateVariableObject(call,SEOBJ_GET_FUNCTION(this));
}
                                   
                                   Finally, in srccore/call.c replace function
                                    callCreateVariableObject() with the code found
                                    at ftp://ftp.nombas.com/pub/isdkeval/se430/callcreatevariableobject.c
                                    and change the prototype in call.h accordingly. 
                                
                               
                              
                                - assert() failure when global variable has
                                  dynamic _put 
 
                                  (for ISDK/C 4.30b) 
                                   Bug: If the global variable has a dynamic
                                    _put function or put callback then there can
                                    be problems, first indicated by this assert
                                    statement in the callFunction() function of
                                    call.c
                                   
                                    assert( SEVAR_GET_TYPE(&(call->new_scope_chain))==VUndefined ); 
                                   
                                   Fix: In CALL.H change this block
                                    of code 
                                  
                                    # define FUNC_OFFSET 7
# define THIS_OFFSET 8
# define USE_CACHE_OFFSET 6
# define OLD_USE_CACHE (FRAME-USE_CACHE_OFFSET)
#else
# define FUNC_OFFSET 6
# define THIS_OFFSET 7 
                                   
                                   to this 
                                  
                                    # define FUNC_OFFSET 8
# define THIS_OFFSET 9
# define USE_CACHE_OFFSET 7
# define OLD_USE_CACHE (FRAME-USE_CACHE_OFFSET)
#else
# define FUNC_OFFSET 7
# define THIS_OFFSET 8 
                                   
                                   then add these to lines to that same section
                                    of CALL.H 
                                  
                                    #define NEW_SCOPE_OFFSET 6
#define OLD_NEW_SCOPE (FRAME-NEW_SCOPE_OFFSET) 
                                   
                                   then change this line 
                                  
                                    # define PARAM_START RETURN_OFFSET 
                                   
                                   to this 
                                  
                                    # define PARAM_START NEW_SCOPE_OFFSET 
                                   
                                   this in CALL.C callFunction() get rid of
                                    the first assert: 
                                  
                                    assert( SEVAR_GET_TYPE(&(call->new_scope_chain))==VUndefined ); 
                                   
                                   then find this block 
                                  
                                    #  if defined(JSE_CACHE_GLOBAL_VARS) && JSE_CACHE_GLOBAL_VARS==1
   tmp = STACK_PUSH;
   SEVAR_INIT_STORAGE_LONG(tmp,(ulong)call->useCache);
#  endif 
                                   
                                   and add right after that: 
                                  
                                    tmp = STACK_PUSH;
SEVAR_COPY(tmp,&(call->new_scope_chain)); 
                                   
                                   finally, in CALL.C callReturnFromFunction()
                                    just before this line 
                                  
                                    call->iptr = SEVAR_GET_STORAGE_PTR(OLD_IPTR); 
                                   
                                   add this line (remember, just before the
                                    previous line) 
                                  
                                    SEVAR_COPY(&(call->new_scope_chain),OLD_NEW_SCOPE);  
                                   
                                
                              
                                   
                               
                              
                               
                              
                              for 4.30a -- 
                               
                              
                                - wrong global variable cached if function
                                  uses different global 
 
                                  (for ISDK/C 4.30a) 
                                   Bug: The wrong global variable cache is
                                    used when a function is called 
                                    that switches the global.
                                    Fix: In call.c function callFunction(),
                                    at about line 341, after this line 
                                     call->useCache = ((FUNCVAR)->data.object_val.savedScopeChain == NULL); 
                                   add 
                                     if( CALL_GLOBAL(call)!=call->GlobalObject )
      call->useCache = False;
                                
                               
                              
                               
                              
                               
                              
                                - crash reading compiled cfunction if cfunction
                                  is disabled 
 
                                  (for ISDK/C 4.30a) 
                                   Bug: If a script is compiled (tokenized)
                                    by a version that supports 
                                    the "cfunction" option, then it
                                    may crash when executed by a version 
                                    that does not support the "cfunction"
                                    option.
                                    Fix: In srccore/loclfunc.c function
                                    localTokenRead() at about line 325 this 
                                    block: 
                                     #  else
      func = localNew(call,varname,dest);
   #  endif
                                   needs to be: 
                                     #  else
      (void)tokenReadByte(tDst);
      func = localNew(call,varname,dest);
   #  endif
                                
                               
                              
                               
                              
                                - garbage-collection bit clashes with object-mark
                                  bit 
 
                                  (for ISDK/C 4.30a) 
                                   Error: The mark bit used for recursive functions
                                    clashes with the same bit used for garbage
                                    collection. This may cause many assert() failures
                                    in debug builds, especially in compiled code
                                    buffers. 
                                     
                                    Fix: In the 4.30b release the new flags
                                    SEOBJ_FLAG_BIT has been added to distinguish
                                    these recursive markers from the garbage-collector
                                    flags.
                                 
                               
                              
                                - minimum-memory options should release more
                                  memory 
 
                                  (for ISDK/C 4.30a) 
                                   Error: Some options related to minimizing
                                    memory use (JSE_MIN_MEMORY, JSE_CREATEFUNCTIONTEXTVARIABLE,
                                    JSE_COMPACT_LIBFUNCS) are not freeing all
                                    possible memory.
                                    Fix: 4.30b release contains all of
                                    the fixes to these problems. Memory use can
                                    be minimized with these compile-time options. 
                                
                               
                              
                                - construction of incomplete error objects
                                  can crash 
 
                                  (for ISDK/C 4.30a) 
                                   Bug: If an error object is used to report
                                    a problem, and if that error object has an
                                    invalid constructor method, then a crash may
                                    occur while generating the error in unusual
                                    circumstanstances (such as if the global variable
                                    has a _put function).
                                    Fix: This fix involves many changes
                                    to calls to and in sevarCallConstructor().
                                    Upgrade to 4.30b to obtain all of these fixes. 
                                
                               
                              
                                - jseBreakpointTest fails for JSE_PACK_SECODES
                                  
 
                                  (for ISDK/C 4.30a) 
                                   Bug: If #define JSE_PACK_SECODES 1 (the
                                    default for non-aligned JSE_MIN_MEMORY builds,
                                    then the jseBreakpointTest may fail or crash.
                                   Fix: In srccore/brktest.c function
                                    callBreakpointTest() the two references to
                                    "c[1]" should be changed. In the
                                    first instance change "(VarName)c[1]"
                                    to "SECODE_GET_ONLY(c+1,VarName)"
                                    and change "(uint)c[1]" to "SECODE_GET_ONLY(c+1,CONST_TYPE)". 
                                
                               
                              
                                - _get ignoring return of jseTypeUndefined
                                  
 
                                  (for ISDK/C 4.30a) 
                                   Error: If an object's _get function or jseObjectCallbacks->get
                                    function returns a variable of jseTypeUndefined
                                    then it will treat the variables is if it
                                    doesn't exist.
                                   Fix: In varutil.c in function seobjHasProperty()
                                    at about line 2901 change this code:  
                                     ret = SEVAR_GET_TYPE(dest)!=VUndefined; 
                                  to 
                                     ret = True;  
                                
                               
                              
                                - jseArgvLibraryFunction's not receiving
                                  the argc parameter 
 
                                  (for ISDK/C 4.30a) 
                                   Bug: With some callback methods (e.g. win16
                                    DLL), wrapper functions tagged with jseFunc_ArgvStyle
                                    are not receiving the argc parameter.
                                   Fix: In call.c, function callFunction(),
                                    at about line 630, replace: 
                                     (void *)call,locals);  
                                
                              
                                with  
                                   (void *)call,call->num_args,locals); 
                               
                               
                              
                                - RegExp object overwrites Object.prototype._class
                                  
 
                                  (for ISDK/C 4.30a) 
                                   Bug: Calling the RegExp constructor will
                                    overwrite Object.prototype._class, so that
                                    all objects seem to belong to the RegExp class.
                                   Fix: In srclib/ecma/seregexp.c, at
                                    about line 220, change 
                                     tempMember = jseMemberEx(jsecontext,regexpObject,CLASS_PROPERTY,
                            jseTypeString,jseCreateVar);
                                  to 
                                     tempMember = jseMemberEx(jsecontext,regexpObject,CLASS_PROPERTY,
                            jseTypeString,jseCreateVar|jseDontSearchPrototype);           
                                
                               
                              
                                - program may crash when #include file not
                                  found 
 
                                  (for ISDK/C 4.30a) 
                                   Bug: Systems with memory protection on static
                                    data may crash when processing an #include
                                    statement if the file cannot be found.
                                   Fix: in source.c, at about line 751,
                                    this block: 
                                     if ( !sourceNextLine(*source,call,False,&success) )
   {
      /* nothing was read at all */
      JSECHARPTR_PUTC((*source)->MemoryPtr,0);
   }
                                  should be changed to 
                                     if ( !sourceNextLine(*source,call,False,&success) )
   {
      /* nothing was read at all */
      (*source)->MemoryPtr = UNISTR("");
   }
                                
                               
                              
                              
                                   jsechar theChar = JSECHARPTR_GETC(current);
   jsechar buf[10];  
                                to  
                                   ujsechar theChar = JSECHARPTR_GETC(current);
   ujsechar buf[10];
 
                               
                               
                              
                                - Functions returning last-expression if
                                  no return statement 
 
                                  (for ISDK/C 4.30a) 
                                   Problem: Functions with no explicit "return"
                                    statement are returning the results of the
                                    last evaluation in that function. They should
                                    be returning undefined.
                                    Fix: in EXPRESSN.C function secompileFunctionBody(),
                                    at about line 1382 is a block of code like
                                    this: 
                                     found = False;    /* Return the last thing evaluated. Can't just check the last     * entry, because it could be an extension value for a previous     * opcode.     */    for( i=0;i<This.opcodesUsed;i++ )    {       .... lots more code ...    }    if( !found )       secompileAddItem(&This,sePushUndefined);    /* if we fall off the end of the function */    secompileAddItem(&This,seReturn); 
                                  
                                   that code should be within another if block,
                                    so it becomes: 
                                  
   if( LOCAL_TEST_IF_INIT_FUNCTION(locfunc,This.call) )    {       found = False;       /* Return the last thing evaluated. Can't just check the last        * entry, because it could be an extension value for a previous        * opcode.        */       for( i=0;i<This.opcodesUsed;i++ )       {          .... lots more code ...       }       if( !found )          secompileAddItem(&This,sePushUndefined);    }    else    {       secompileAddItem(&This,sePushUndefined);    }    /* if we fall off the end of the function */    secompileAddItem(&This,seReturn); 
                                
                               
                              
                                - Not reporting when variable is freed twice
                                  
 
                                  (for ISDK/C 4.30a) 
                                   Problem: When running in debug mode (JSE_TRACKVARS==1)
                                    the engine will not detect and report when
                                    a variable has been freed twice.
                                    Fix: In srccore/jselib.c function
                                    seapiDeleteVar(), at about line 265, add this
                                    line: 
                                     var->alreadyFreed = True; 
                                  before this line: 
                                     if( var->prev==NULL ) 
                                
                               
                              
                                - jseGetVariableName() crashes when getting
                                  "global" variable 
 
                                  (for ISDK/C 4.30a) 
                                   Bug: jseGetVariableName() can crash when
                                    the global variable is being sought.
                                    Fix: In srccore/varutil.c, FindNames()
                                    function at about line 209, change the 'look
                                    in locals' section to the following: 
                                     /* look in locals */ 
                                
                              
                                   if( call->VariableObject==NULL ) callCreateVariableObject(call);
   if( call->VariableObject )
   {
      SEVAR_INIT_OBJECT(tmp,call->VariableObject);
      if( IsThisTheVariable(call,tmp,me,NULL,Buffer,BufferLength,False) )
         FoundName = True;
   }
                                 In srccore/util.c, jseGetVariableName(), at
                                  about line 2628, change the one main line in
                                  the function to the following: 
                                 
                                
   return FindNames(call,seapiGetValue(call,variableToFind),
                    buffer,bufferSize,UNISTR(""));
                               
                               
                              
                                - jseNewFunctions breaks default prototypes
                                  
 
                                  (for ISDK/C 4.30a) 
                                   Bug: jseNewFunctions breaks existing default
                                    prototypes, causing such Ecma stuff as String,
                                    Function, and Array to not work.
                                   Fix: 
                                    1. call.c, take the InitGlobalPrototype function and
     make it not static. Add a prototype for it to call.h,
     I put it at line 936.
  2. call.c, 1199, the lines that set the 4 prototypes
     by calling InitGlobalPrototype must be moved. Grab
     them and move them to util.c, 979. That's inside
     an if-block, currently that calls InitializeBuiltInVariables.
     Move the stuff _before_ that call, but inside the
     if block.
  3. The block refers to a variable 'call', replace those
     all with 'this'.
  4. Change the if-block's test to not test against
     jseNewGlobalObject, but rather jseNewLibrary.
  With comments, the new if-block looks like this:
   if( success && (NewContextSettings & jseNewLibrary)!=0 )
   {
      /* If we are initializing new libraries, we also want to
       * initialize our builtin ECMA stuff as well.
       */
      this->ObjectPrototype = InitGlobalPrototype(this,
         LockedStringTableEntry(this,OBJECT_PROPERTY,
            (stringLengthType)strlen_jsechar(OBJECT_PROPERTY)));
      this->FunctionPrototype = InitGlobalPrototype(this,
         LockedStringTableEntry(this,FUNCTION_PROPERTY,
            (stringLengthType)strlen_jsechar(FUNCTION_PROPERTY)));
      this->ArrayPrototype =
         InitGlobalPrototype(this,GLOBAL_STRING(this,array_entry));
      this->StringPrototype = InitGlobalPrototype(this,
         LockedStringTableEntry(this,STRING_PROPERTY,
            (stringLengthType)strlen_jsechar(STRING_PROPERTY)));
      /* We initialize the builtin variables into each global else we
       * will not have them in sub-interprets
       */
      InitializeBuiltinVariables(this);
   }
                                   Because the order of the initialization
                                    has changed, 
                                    InitGlobalPrototype can add its stuff to existing
                                    objects, 
                                    while it thinks that it will allways create
                                    the objects. 
                                    Here is the new version (it replaces the one
                                    in 
                                    srccore\call.c):  
                                       seObject
  InitGlobalPrototype(struct Call *call,VarName name)
  {
     seObjectMem v;
     jsebool found;
     /* Create 'name', for example 'Object'. Make that
      * don't enum as all builtin objects should be that way.
      */
     v = seobjNewMember(call,CALL_GLOBAL(call),name,&found);
     v->attributes = jseDontEnum;
     if( v->value.type!=VObject )
        SEVAR_INIT_BLANK_OBJECT(call,&(v->value));
     /* Make '.prototype' of that object and return it.
      */
     v = seobjNewMember(call,SEVAR_GET_OBJECT(&(v->value)),
                        GLOBAL_STRING(call,orig_prototype_entry),&found);
     if( v->value.type!=VObject )
        SEVAR_INIT_BLANK_OBJECT(call,&(v->value));
     v->attributes = jseDontEnum | jseDontDelete | jseReadOnly;
     return SEVAR_GET_OBJECT(&(v->value));
  }
                                
                               
                              
                                - jse_special_math name-mangled in C++ compilers
                                  
 
                                  (for ISDK/C 4.30a) 
                                   Problem: Some C++ compilers will not recognize
                                    jse_special_math, which is used to resolve
                                    jseInfinity, jseNaN, and other special numbers.
                                   Fix: In INCJSE/SEFP.H, wrap the lines
                                    that defined jse_special_math in an exern
                                    "C" { } block, starting at about line 58 and
                                    ending at about line 70 
                                
                               
                              
                                - multiple/redundant calls to _get
 
                                  (for ISDK/C 4.30a) 
                                   Problem: When a dynamic object is defined
                                    with a _get method or get callback, that get
                                    may be called extra times when evaluating
                                    properties of that dynamic object. This should
                                    not be a serious problem, in that all calls
                                    to _get are expected to work, but it is inefficient.
                                   Fix: In VARUTIL.C, function seobjHasProperty(),
                                    at about line 2856 change this: 
                                      
                                          jsebool
                                    handled; 
                                      
                                    to 
                                      
                                          jsebool
                                    handled = False; 
                                      
                                    and at about line 2889, is this section of
                                    code: 
                                      
                                          if( SEOBJ_HAS_GET(obj)
                                    ) 
                                          { 
                                             /*
                                    got to do a dynamic get */ 
                                             ...block
                                    of code... 
                                      
                                    change that to: 
                                      
                                          if( SEOBJ_HAS_GET(obj)
                                    ) 
                                          { 
                                             if(
                                    ref && dest!=NULL ) 
                                             { 
                                                SEVAR_INIT_REFERENCE(dest,obj,propname); 
                                                return
                                    True; 
                                             } 
                                             else 
                                             { 
                                                /*
                                    got to do a dynamic get */ 
                                                ...block
                                    of code... 
                                             } 
                                      
                                
                               
                              
                                - Function constructor resets global variable
 
                                  (for ISDK/C 4.30a) 
                                   Problem: With JSE_MULTIPLE_GLOBAL the function
                                    constructor (Ecma_Function_construct) and
                                    eval() function (Ecma_eval) are not always
                                    setting the global variable correctly for
                                    the functions being added or called.
                                    Fix: Many small changes are required
                                    in the following files:
                                    JSELIB.H - after the jseFunc_ArgvStyle
                                    value, add this line 
                                      
                                          # define
                                    jseFunc_NoGlobalSwitch 0x10 
                                      
                                    ECMAMISC.C - in function Ecma_eval
                                    the #if block following this comment 
                                      
                                          /* Run
                                    with the same global the old function had
                                    */ 
                                      
                                    is no longer required. instead change 
                                      
                                          JSE_LIBMETHOD(
                                    UNISTR("eval"), Ecma_eval, 1, 1, 
                                             
                                    jseDontEnum, jseFunc_Secure ), 
                                      
                                    to 
                                      
                                          JSE_LIBMETHOD(
                                    UNISTR("eval"), Ecma_eval, 1, 1, 
                                             jseDontEnum,
                                    jseFunc_NoGlobalSwitch | jseFunc_Secure ), 
                                      
                                    SEOBJECT.C, change 
                                      
                                          JSE_LIBOBJECT(
                                    FUNCTION_PROPERTY, Ecma_Function_construct,
                                    0, -1, 
                                             jseDontEnum,
                                    jseFunc_Secure ), 
                                      
                                    to 
                                      
                                          JSE_LIBOBJECT(
                                    FUNCTION_PROPERTY, Ecma_Function_construct,
                                    0, -1, 
                                             jseDontEnum,
                                    jseFunc_NoGlobalSwitch | jseFunc_Secure ), 
                                      
                                    CALL.H: change first definition of
                                    CALL_GLOBAL to 
                                      
                                          #define
                                    CALL_GLOBAL(c) (((c)->funcptr &&
                                    (c)->funcptr->global_object) \ 
                                             ?
                                    (c)->funcptr->global_object : (c)->GlobalObject) 
                                      
                                    JSELIB.C, function jseCallStackInfo
                                    replace 
                                      
                                          SEVAR_INIT_OBJECT(tmp,funcptr->global_object); 
                                      
                                    with 
                                      
                                          SEVAR_INIT_OBJECT(tmp, 
                                             funcptr->global_object?funcptr->global_object:call->GlobalObject); 
                                      
                                    and replace 
                                      
                                          SEVAR_INIT_OBJECT(&(mem->value),funcptr->global_object); 
                                      
                                    with 
                                      
                                          SEVAR_INIT_OBJECT(&(mem->value), 
                                             funcptr->global_object?funcptr->global_object:call->GlobalObject); 
                                      
                                    GARBAGE.C: function mark_function()
                                    change 
                                      
                                          assert(
                                    func->global_object!=NULL ); 
                                      
                                    to 
                                      
                                          if ( func->global_object!=NULL
                                    ) 
                                      
                                    UTIL.C has 3 calls to functionInit(),
                                    after each of these 3 calls 
                                    add these statements (leaving "iFuncDesc->"
                                    of of the third 
                                    instance): 
                                      
                                          # if 0
                                    != JSE_MULTIPLE_GLOBAL 
                                             if
                                    ( 0 != (iFuncDesc->FuncAttributes &
                                    jseFunc_NoGlobalSwitch) ) 
                                                this->function.global_object
                                    = NULL; 
                                          # endif 
                                       
                                
                              
                               
                              
                                - srccore\jseopt\jseopt.h file missing
 
                                  (for ISDK/C 4.30a) 
                                   Problem: The file srccore\jseopt\jseopt.h
                                    is missing from some releases. This may cause
                                    errors locating "jseopt.h" while compiling
                                    the core interpreter libraries.
                                    Fix: Create the file srccore\jseopt\jseopt.h
                                    containing this text: 
                                       
                                          #define
                                    _JSEOPT_H 
                                       
                                    This is just a default JSEOPT.H file. If you
                                    are modifying options for your application
                                    it is best to make a new JSEOPT.H file and
                                    have both your application and the libraries
                                    refer to the same file.
                                 
                               
                              
                                - string constants updated by c-function
                                  behavior
 
                                  (for ISDK/C 4.30a) 
                                   Bug: string constants can are overwritten
                                    by function assignments in a c-function. For
                                    example, in the following statement the original
                                    "foo" will be overwritten. 
                                       
                                          var foo
                                    = "foo"; 
                                          Clib.strcat(foo,"hoo"); 
                                       
                                    Fix: In jselib.c:1418, between 
                                       
                                           val =
                                    seapiGetValue(call,variable); 
                                       
                                    and 
                                       
                                          if( val!=NULL && SEVAR_GET_TYPE(val)==vType ) 
                                       
                                    add 
                                       
                                          if( SEVAR_GET_TYPE(val)==VString && SEVAR_GET_STRING(val).data->constant ) 
                                          { 
                                             sevarDuplicateString(call,val); 
                                          } 
                                       
                                    so it now looks like: 
                                       
                                          val =
                                    seapiGetValue(call,variable); 
                                          if( SEVAR_GET_TYPE(val)==VString && SEVAR_GET_STRING(val).data->constant ) 
                                          { 
                                             sevarDuplicateString(call,val); 
                                          } 
                                          if( val!=NULL && SEVAR_GET_TYPE(val)==vType ) 
                                      
                                 
                               
                              
                                - Opcode errors in JSE_MIN_MEMORY builds
 
                                  (for ISDK/C 4.30a) 
                                   Bug: May be errors in executing VM bytecodes
                                    when compiling with #define JSE_MIN_MEMORY 1.
                                    Fix: At expressn.c:1403 
                                       
                                          This.opcodes[j+1]>i
                                    ) 
                                       
                                    Should be 
                                       
                                          SECODE_GET_ONLY(This.opcodes+j+1,CONST_TYPE)>i
                                    ) 
                                       
                                    and at garbage.c:288, mark_call() in the #else
                                    part of the GROWABLE_STACK #if 
                                       
                                          for( i=0;i<call->stackptr;i++
                                    ) 
                                       
                                    should be changed to 
                                       
                                          for( i=0;i<=call->stackptr;i++
                                    ) 
                                        
                                
                               
                              
                                - Incorrect !Finite() behavior when performing
                                  floating-point math on big-endian systems
 
                                  (for ISDK/C 4.30a) 
                                   Problem: Incorrect and unexpected behavior
                                    when performing floating-point math on big-endian
                                    systems. These behaviors include IsNaN()/
                                    IsNegZero()/IsNegInfinity() returning incorrect
                                    values and arithmetic operations failing on
                                    large positive and negative numbers.
                                    Fix: In SEFP.H, line 91, change: 
                                      
                                           # if
                                    BIG_ENDIAN == True 
                                      
                                    to: 
                                      
                                          # if SE_BIG_ENDIAN
                                    == True 
                                       
                                
                               
                              
                                - Errors with strings and JSE_MBCS builds
 
                                  (for ISDK/C 4.30a) 
                                   Bug: Data writing problem when JSE_MBCS
                                    is defined.
                                    Fix: jselib.c,genericPutDataptr line
                                    1459. 
                                      
                                          memcpy(newdata-(minidx*sizeof(jsechar)),data, 
                                          s2 = BYTECOUNT_FROM_STRLEN((const
                                    jsecharptr)data,actual_size)); 
                                      
                                    should be changed to: 
                                      
                                          memcpy(newdata+s1,data, 
                                          s2 = BYTECOUNT_FROM_STRLEN((const
                                    jsecharptr)data,actual_size)); 
                                      
                                    and around line 1510 the block: 
                                      
                                          # if defined(JSE_MBCS)
                                    && (JSE_MBCS!=0) 
                                             /*
                                    recalculate physical length */ 
                                             /*
                                    NYI: MBCS byte length probably can be done
                                    better in 
                                              *
                                    the individual cases above */ 
                                             val->data.string_val.data->bytelength
                                    = 
                                                BYTECOUNT_FROM_STRLEN(val->data.string_val.data->data, 
                                                       val->data.string_val.data->length); 
                                          # endif 
                                      
                                    has to be moved inside the closing brace right
                                    above it. There are several blocks closed
                                    here, move it inside the outermost, i.e. take
                                    the _last_ brace only and move it past the
                                    block, not any of the inner braces. 
                                
                               
                              
                                - Casting warnings for new jseArgvLibFunc()
                                  functions
 
                                  (for ISDK/C 4.30a) 
                                   Problem: Compilers will produce warnings
                                    using the argc parameter of the new jseArgvLibFunc(),
                                    requiring (uint) casts.
                                    Fix: In jselib.h for the new argv
                                    function "int argc" was changed
                                    to "uint argc" to prevent casting
                                    problems in some compilers. This must be changed
                                    in all instance in jselib.h 
                                
                               
                              
                                - Error reading pre-compiled bytecodes for
                                  JSE_MIN_MEMORY
 
                                  (for ISDK/C 4.30a) 
                                   Bug: Error reading pre-compiled bytecodes
                                    when JSE_MIN_MEMORY is defined.
                                    Fix: token.c, line 640: 
                                      
                                          if( SECODE_DATUM_SIZE(*sptr)==1 && 
                                          *sptr>=SE_START_GOTO_CODES && *sptr<=SE_END_GOTO_CODES ) 
                                      
                                    get rid of the first test, that is wrong,
                                    it should just be: 
                                      
                                          if( *sptr>=SE_START_GOTO_CODES && *sptr<=SE_END_GOTO_CODES ) 
                                       
                                
                               
                              
                                - Garbage collector can miss variables in
                                  sub-interprets
 
                                  (for ISDK/C 4.30a) 
                                   Bug: Garbage collector can miss marking
                                    variables when called from unusual 
                                    levels of sub-interpret.
                                    Fix: GARBAGE.C, function garbageCollect(),
                                    add this line to the top 
                                    of the function: 
                                      
                                           while(
                                    call->next ) call = call->next; 
                                
                                |