[Date Prev][Date Next][Thread Prev][Thread Next][Author Index][Date Index][Thread Index]

Fluid Variable enhancements

I've fixed the fluid variable package in a mostly upwards compatable
fashion.  The changes are:

  |  				as DEFINE_CLASS is to CLASS
  |				except that type isn't repeated
  |	Invokes 0-parameter constructor to initialize the variable's
  |      storage.  Initialization happens at the time the fluid space
  |      is created--Fluid initialization time.  

Programs which using DEFINE_FLUID on objects (as opposed to primitive
data types) were virtually guarateed of having undefined run-time
behavior (since the variable would never have been constructed in the
storage it was considered to have occupied).  Now the object will get
properly initialized.  The one non-upwards compatability is if you are
doing a DEFINE_FLUID on an object which has no 0-parameter
constructors.  Now you will get a compile time error (instead of
inexplicable run-time behavior).  On the other hand, if you want to
parameterize the initialization:

  |  BUILD_FLUID(varName,initExpr) -- BUILD_FLUID is like DEFINE_FLUID
  |	except that the storage is initialized by using the object's
  |	1-parameter constructor passing (initExpr) as the one argument.
  |	(initExpr) is also evaluated at fluid initialization time.
  |	Given the constraints of fluid initialization time, one should
  |	typically initialize fluids to simple constants (like IntegerVar0 
  |	or NULL).

What's this new "Fluid Initialization Time" you ask?


  		   Fluid Initialization Time

Fluid initialization time is when the space for fluids storage gets
allocated, and when all the fluids which live in that space get
initialized.  There is a global fluids space, and a per-session
fluids space.  (The global fluids space can be considered to be
the space for the "main-session".)  Fluid initialization time
must happen after static initialization time, but may happen
before, during, or after dynamic initialization time.  The global 
space gets initialized on first use of a fluid, so dynamic initialers
can safely use fluids, but fluid initializers can only safely assume
static initialization.  Fluid initialization for each session happens
as part of the act of creating the session.


And finally, something I believe is already defined by some system
header file.  I couldn't find it so I redid it myself (I needed it for
the above):

  |  Invoked as "new (p) Foo (...)" in order to get the storage pointed
  |   to by p to be initialized to contain a Foo.  Taken verbatim from
  |   page 31 of "The Evolution of C++: 1985 to 1989" by Bjarne.  See
  |   discussion there

extern void * operator new (size_t size, void * p);