== Version 2.4 July 3, 2003

* **define_c_proc()** and **define_c_func()** have been extended, so in
  addition to defining C routines in external .dll's and shared
  libraries, you can now define the parameters and return value for a
  machine-code routine that your program pokes into its own
  memory. You can call the machine-code routine using **c_proc()** or
  **c_func()**. Thanks to Daniel Kluss.

* Performance Improvement: **get4()** and **put4()** in **database.e**
  have been sped up slightly. They are very important to the overall
  speed of **EDS**. Thanks to Derek Parnell.

* Performance Improvement: **get_bytes()** is now much faster when the
  number of bytes requested far exceeds the number of bytes remaining in
  the file. Thanks to Pier Feddema.

* **Translator**: When translating a huge Euphoria routine (many
  hundreds of Euphoria statements), the Translator will now output
  calls to a dereference routine, rather than using in-lined C
  statements. This reduces the chance of exceeding a size limit
  imposed by the C compiler (especially Watcom C). It also reduces the
  **.exe** size. Since the dereference routine is more likely than the
  in-lined statements to be in cache, the speed difference is not that
  great.

* **Interpreter Source Code**: In **watexw.bat**, **runtime
  windows=4.0** was added to the link command for building
  **exw.exe**.

* There are now some checks for invalid argument type and invalid
  return type in calls to **define_c_func()** and **define_c_proc()**.

* Some syntax error messages are now more descriptive when namespace
  identifiers are involved.

* The filesort.ex tutorial program was altered to make it more usable
  under Linux and FreeBSD.

* By default, **safe.e** now does a less-strict, "edges-only" check for
  memory corruption, when the platform is **WIN32**. Windows programs
  often access memory that was not allocated using Euphoria's
  **allocate()**.

* **bug fixed**: When a literal floating-point constant in the Euphoria
  program was larger than about 1e308, the Translator would output
  "inf" in **init_.c**. This caused the C compiler to issue an
  undefined symbol error. Thanks to Juergen Luethje.

* **bug fixed**: In a rare case, the Translator was failing to emit C
  code to make a copy of a sequence with multiple references to it,
  before overwriting an element of that sequence. Thanks to Juergen
  Luethje.

* **bug fixed**: In certain cases, when a Euphoria program exchanged
  Euphoria data with a **.dll** written in Euphoria, the data might
  not be freed (until the program terminated). Thanks to Wayne
  Overman.

* **bug fixed**: If you used "asm" in your program, as a private
  variable or parameter name, the Translator would use "_asm" in the C
  code. This was not acceptable for some C compilers. The Translator
  will now avoid using "_asm", as well as "_try", "_Seg16", "_stdcall"
  and several other single-underscore names that are reserved by
  various C compilers. Thanks to George Papadopoulos and Matt Lewis.

* **bug fixed**: If the HOT_KEYS parameter in **ed.ex** was set to
  FALSE, then **Esc h Enter** would not bring up the help
  prompt. Thanks to J. Brown.
