src/3rdparty/webkit/JavaScriptCore/ChangeLog-2002-12-03
changeset 0 1918ee327afb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/3rdparty/webkit/JavaScriptCore/ChangeLog-2002-12-03	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,2271 @@
+2002-12-03  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by: Darin Adler
+
+	- fixed Deployment build.
+	
+        * kjs/dtoa.cpp: Work around warnings.
+
+2002-12-03  Maciej Stachowiak  <mjs@apple.com>
+
+	- fixed 3114790 - Gamespot reviews pages badly mis-rendering
+	because floating point numbers format wide
+
+	Reviewed by: David Hyatt
+	
+	* kjs/dtoa.cpp: Imported float <--> string conversion routines
+	from David M. Gay. I changed this to fix warnings and avoid
+	colliding with names of standard library functions.
+        * kjs/dtoa.h: Added a header I made up for dtoa.cpp
+        * kjs/ustring.cpp:
+        (UString::from): Use new double to string routine (kjs_strtod).
+        (UString::toDouble): Use new string to double routine (kjs_dtoa).
+        * JavaScriptCore.pbproj/project.pbxproj: Added new files
+
+2002-11-27  John Sullivan  <sullivan@apple.com>
+
+        * kjs/collector.cpp:
+	removed puts("COLLECT") leftover debugging spam that was
+	buggin' gramps
+
+=== Alexander-34 ===
+
+2002-11-26  Maciej Stachowiak  <mjs@apple.com>
+
+	Change ActivationImp to be allocated via the garbage collector
+	again instead of on the stack. This fixes the following four
+	regressions but sadly it causes a 6% performance hit. It's
+	probably possibly to reduce the hit a bit by being smarter about
+	inlining and the way the marking list variant is implemented, but
+	I'll look into that later.
+
+	- fixed 3111500 - REGRESSION: crash in "KJS::ScopeChain::mark()" on www.posci.com
+	- fixed 3111145 - REGRESSION: reproducible crash in KJS hashtable lookup at time.com
+	- fixed 3110897 - REGRESSION: javascript crasher on http://bmwgallery.tripod.com/
+	- fixed 3109987 - REGRESSION: Reproducible crash in KJS ObjectImp at live365.com
+	
+	Also:
+	
+	- improved DEBUG_COLLECTOR mode a bit by never giving memory back
+	to the system.
+	
+        * kjs/collector.cpp:
+        * kjs/context.h:
+        * kjs/function.cpp:
+        (ActivationImp::ActivationImp):
+        (ActivationImp::mark):
+        (ActivationImp::createArgumentsObject):
+        * kjs/function.h:
+        * kjs/internal.cpp:
+        (ContextImp::ContextImp):
+        (ContextImp::mark):
+        * kjs/list.cpp:
+        * kjs/list.h:
+        * kjs/value.cpp:
+        (Value::Value):
+
+2002-11-26  Darin Adler  <darin@apple.com>
+
+        * kjs/property_map.cpp:
+	(PropertyMap::save): Look at the attributes the same way in the single hash entry
+	case as in the actual hash table case. Change the rule for which attributes to save
+	to "attributes that don't have the ReadOnly, DontEnum, or Function bit set".
+        Also fix bug where saving an empty property map would leave the count set to the old value.
+
+2002-11-26  Richard Williamson   <rjw@apple.com>
+
+        Remove debugging code.  Could be cause of performance regresssion.
+        * kjs/nodes.cpp:
+        (FunctionCallNode::evaluate):
+
+        Restire attributes correctly.
+        * kjs/property_map.cpp:
+
+2002-11-25  Richard Williamson   <rjw@apple.com>
+
+        Use delete[] (not delete) operator to delete array.
+        
+        * kjs/property_map.cpp:
+
+2002-11-25  Richard Williamson   <rjw@apple.com>
+
+        Added debugging info.  Fixed property map save function.
+        
+        * kjs/nodes.cpp:
+        (FunctionCallNode::evaluate):
+        * kjs/property_map.cpp:
+
+2002-11-25  Richard Williamson   <rjw@apple.com>
+
+        Changes for back/forward.  Currently disabled.
+
+        * kjs/property_map.cpp:
+        * kjs/property_map.h:
+
+2002-11-25  Darin Adler  <darin@apple.com>
+
+        * kjs/property_map.cpp: Rearrange code a little bit and tweak indentation.
+	This might provide a tiny speedup because we don't look at the single entry
+	any more in cases where the _table pointer is non-0.
+
+2002-11-24  Darin Adler  <darin@apple.com>
+
+	- changed ScopeChain to not ref each item in the chain, and use
+        marking instead; gains 1% on JavaScript iBench
+
+        * kjs/context.h: Return chain by reference.
+        * kjs/internal.cpp: (ContextImp::mark): Mark the scope chain.
+        * kjs/interpreter.cpp: (Context::scopeChain): Return chain by reference.
+        * kjs/interpreter.h: Make some Context methods inline.
+        * kjs/nodes.cpp:
+        (ThisNode::evaluate): Get at ContextImp directly.
+        (ResolveNode::evaluateReference): Ditto.
+        (VarDeclNode::evaluate): Ditto.
+        (VarDeclNode::processVarDecls): Ditto.
+        (FuncDeclNode::processFuncDecl): Pass ScopeChain directly to avoid copying.
+        (FuncExprNode::evaluate): Ditto.
+        * kjs/object.cpp: Make scope and setScope inline.
+        * kjs/object.h: Make scope return a chain by reference. Make scope and
+	setScope both be inline. Use a normal ScopeChain instead of NoRefScopeChain
+	since they are now one and the same.
+        * kjs/scope_chain.cpp: Remove all the code to ref and deref objects.
+	Merge NoRefScopeChain in with ScopeChain since they both work this way now.
+        * kjs/scope_chain.h: Remove NoRefScopeChain and simplify the ref counts.
+	Make more functions inline.
+
+2002-11-24  Maciej Stachowiak  <mjs@apple.com>
+
+	- fixed 3098356 - Hard hang on movie search at www.movietickets.com
+	
+        * kjs/string_object.cpp:
+        (StringProtoFuncImp::call): When doing a regexp replacement that
+	results in an empty match, always move on to the next character
+	after doing the replacement. The previous code would hit an
+	infinite loop if an initial empty match was replaced with the
+	empty string.
+
+2002-11-24  Maciej Stachowiak  <mjs@apple.com>
+
+	- fixed 3095446 - Crash on AppleScript page due to very long argument list
+	
+        * kjs/grammar.y: Don't try to construct the argument list in the
+	right order, since that blows out the parser stack.
+	* kjs/nodes.cpp:
+        (ArgumentsNode::ArgumentsNode): Instead reverse the argument list
+	here.
+        * kjs/nodes.h: Make ArgumentsNode a friend of ArgumentListNode.
+        * kjs/grammar.cpp: Updated from grammar.y.
+
+2002-11-23  Maciej Stachowiak  <mjs@apple.com>
+
+	- completed Darin's mostly-fix for 3037795 - Resource use
+	increases when accessing very high index value in array
+
+	The two missing pieces were handling sparse properties when
+	shrinking the array, and when sorting. Thse are now both taken
+	care of.
+	
+        * kjs/array_instance.h:
+        * kjs/array_object.cpp:
+        (ArrayInstanceImp::put):
+        (ArrayInstanceImp::deleteProperty):
+        (ArrayInstanceImp::resizeStorage):
+        (ArrayInstanceImp::setLength):
+        (ArrayInstanceImp::sort):
+        (ArrayInstanceImp::pushUndefinedObjectsToEnd):
+        * kjs/identifier.h:
+        * kjs/object.h:
+        * kjs/property_map.cpp:
+        * kjs/property_map.h:
+        * kjs/reference_list.cpp:
+        (ReferenceList::append):
+        (ReferenceList::length):
+        * kjs/reference_list.h:
+        * kjs/ustring.cpp:
+        (UString::toUInt32):
+        * kjs/ustring.h:
+
+2002-11-23  Maciej Stachowiak  <mjs@apple.com>
+
+	Numerous collector changes for a net gain of 3% on JS ibench:
+
+	- Replaced per-block bitmap with free list.
+	- Increased number of empty blocks kept around to 2.
+	- Doubled block size.
+	- When scanning heap in collector, skip scanning the rest of a
+	block as soon as we see as many live cells as the the number of
+	used cells it had originally.
+
+	Also the following collector changes unrelated to performance:
+
+	- Made constants `const int' instead of `static const int'.
+	- Miscellaneous code cleanup.
+		
+        * kjs/collector.cpp:
+
+	- Added debugging mode enabled by defining DEBUG_GC which asserts
+	when a destroyed ValueImp
+
+        * kjs/internal.cpp:
+        (ContextImp::mark):
+        * kjs/value.cpp:
+        (Value::Value):
+        * kjs/value.h:
+	* kjs/config.h:
+	
+2002-11-22  Darin Adler  <darin@apple.com>
+
+	- replaced List class with a vector rather than a linked list, changed it
+	to use a pool of instances instead of all the nodes allocated off of the
+	heap; gives 10% gain on iBench
+
+        * kjs/list.h: Complete rewrite.
+        * kjs/list.cpp: Ditto.
+
+        * kjs/array_object.cpp: (compareWithCompareFunctionForQSort): Go back to
+	doing a clear and two appends here. Fast with the new list implementation.
+
+        * kjs/collector.h: Remove _COLLECTOR hack and just make rootObjectClasses
+	return a const void *.
+        * kjs/collector.cpp: Remove _COLLECTOR hack, and various other minor tweaks.
+
+2002-11-22  Darin Adler  <darin@apple.com>
+
+	- prepare to reimplement KJS::List; move to its own file, add statistics
+
+        * kjs/function_object.cpp: (FunctionProtoFuncImp::call): Use new copyTail()
+	function rather than copy() and removeFirst().
+
+        * kjs/identifier.cpp: Add statistics, off by default.
+        * kjs/property_map.cpp: Add statistics, off by default.
+
+        * kjs/list.cpp: Added. Moved code here. To be rewritten.
+        * kjs/list.h: Added. Moved interface here. To be rewritten.
+
+        * kjs/types.cpp: Removed.
+        * kjs/types.h: Now just an empty header that includes other headers.
+
+        * JavaScriptCore.pbproj/project.pbxproj: Add new files, rearrange.
+
+2002-11-22  Maciej Stachowiak  <mjs@apple.com>
+
+	- reduce cell size to 56 bytes from 64, now that nearly all
+	objects fit in that size. .5% speed gain and probably some
+	footprint gain.
+	
+        * kjs/collector.cpp: Change CELL_SIZE from 64 to 56.
+
+2002-11-22  Darin Adler  <darin@apple.com>
+
+	- change ScopeChain to be a singly linked list shares tails, gives 11% gain on iBench
+
+        * kjs/context.h:
+        (ContextImp::pushScope): Make inline, use push instead of prepend, and pass imp pointer.
+        (ContextImp::popScope): Make inline, use pop instead of removeFirst.
+        * kjs/function.cpp: (DeclaredFunctionImp::DeclaredFunctionImp): No need to copy.
+        * kjs/function_object.cpp: (FunctionObjectImp::construct): Use push instead of
+	prepend, and pass imp pointer.
+        * kjs/internal.cpp: (ContextImp::ContextImp): Use clear, push instead of prepend,
+	and pass imp pointers.
+        * kjs/nodes.cpp: (ResolveNode::evaluateReference): Use isEmpty, pop, and top instead
+	of ScopeChainIterator.
+        * kjs/object.h: Change _scope to be a NoRefScopeChain.
+        * kjs/object.cpp: No need to initialize _scope any more, since it's not a NoRefScopeChain.
+
+        * kjs/scope_chain.h: Rewrite, different implementation and interface.
+        * kjs/scope_chain.cpp: More of the same.
+
+2002-11-22  Maciej Stachowiak  <mjs@apple.com>
+
+	- a simple change for .4% gain on ibench - instead of unmarking
+	all objects at the start of collection, instead unmark as part of
+	the sweep phase
+	
+        * kjs/collector.cpp:
+        (Collector::collect): Remove separate unmarking pass and instead
+	unmark the objects that don't get collected during the sweep
+	phase.
+
+2002-11-21  Darin Adler  <darin@apple.com>
+
+	- stop garbage collecting the ActivationImp objects, gets 3% on iBench
+	- pave the way to separate the argument lists from scope chains
+
+        * kjs/context.h: Added. Moved ContextImp here so it can use things defined
+	in function.h
+
+        * kjs/scope_chain.h: Added. Starting as a copy of List, to be improved.
+        * kjs/scope_chain.cpp: Added. Starting as a copy of List, to be improved.
+
+        * JavaScriptCore.pbproj/project.pbxproj: Rearranged things, added context.h.
+
+        * kjs/function.cpp:
+        (FunctionImp::call): Pass InterpreterImp, not ExecState, to ContextImp.
+        (DeclaredFunctionImp::DeclaredFunctionImp): List -> ScopeChain.
+        (ActivationImp::createArgumentsObject): ArgumentList -> List.
+        (GlobalFuncImp::call): Pass InterpreterImp, not an ExecState, to ContextImp.
+        * kjs/function.h: List -> ScopeChain.
+        * kjs/function_object.cpp: (FunctionObjectImp::construct): List -> ScopeChain.
+        * kjs/internal.cpp:
+        (ContextImp::ContextImp): Set the context in the interpreter.
+        (ContextImp::~ContextImp): Set the context in the interpreter to the caller.
+        (ContextImp::mark): Mark all the activation objects.
+        (InterpreterImp::InterpreterImp): Initialize context to 0.
+        (InterpreterImp::mark): Mark the top context.
+        (InterpreterImp::evaluate): Pass InterpreterImp to ContextImp.
+        * kjs/internal.h: Move ContextImp to its own header. Add setContext to InterpreterImp.
+        * kjs/interpreter.cpp: (Context::scopeChain): List -> ScopeChain.
+        * kjs/interpreter.h: List -> ScopeChain.
+        * kjs/nodes.cpp:
+        (ResolveNode::evaluateReference): List -> ScopeChain.
+        (FuncDeclNode::processFuncDecl): List -> ScopeChain.
+        (FuncExprNode::evaluate): List -> ScopeChain.
+        * kjs/object.cpp: List -> ScopeChain.
+        * kjs/object.h: List -> ScopeChain.
+
+        * kjs/types.h: Remove needsMarking features from List.
+        * kjs/types.cpp: Ditto.
+
+2002-11-21  Maciej Stachowiak  <mjs@apple.com>
+
+	- reduced the size of PropertyMap by storing sizes and such in the
+	dynamically allocated part of the object to reduce the size of
+	ObjectImp - .5% speed improvement on JS iBench.
+	
+        * kjs/property_map.cpp:
+        * kjs/property_map.h:
+
+2002-11-21  Maciej Stachowiak  <mjs@apple.com>
+
+        * Makefile.am: Pass symroots for this tree to pbxbuild.
+
+=== Alexander-33 ===
+
+2002-11-21  Darin Adler  <darin@apple.com>
+
+        * kjs/property_map.cpp: More assertions.
+
+2002-11-21  Darin Adler  <darin@apple.com>
+
+        * kjs/property_map.cpp: Turn that consistency check back off.
+
+2002-11-21  Darin Adler  <darin@apple.com>
+
+	- someone somewhere must be defining a macro named check, causing a compile failure in WebCore
+
+	Rename check() to checkConsistency().
+
+        * kjs/property_map.h: Rename.
+        * kjs/property_map.cpp: Yes, rename.
+
+2002-11-21  Darin Adler  <darin@apple.com>
+
+	- add self-check to property map in hopes of finding the cnet.com bug
+
+        * kjs/property_map.h: Add check() function.
+        * kjs/property_map.cpp: Add the checking, controlled by DO_CONSISTENCY_CHECK.
+
+	 - fixed UChar interface so it's not so slow in debug builds
+
+        * kjs/ustring.h: Nothing in UChar needs to be private.
+
+        * kjs/function.cpp: (GlobalFuncImp::call):
+        * kjs/function_object.cpp: (FunctionObjectImp::construct):
+        * kjs/identifier.cpp:
+        * kjs/lexer.cpp: (Lexer::setCode), (Lexer::shift):
+        * kjs/lookup.cpp: (keysMatch):
+        * kjs/ustring.cpp: (UString::Rep::computeHash), (KJS::compare):
+	Use the "uc" field instead of the "unicode()" inline function.
+
+2002-11-21  Darin Adler  <darin@apple.com>
+
+	- fixed a null-dereference I ran into while trying to reproduce bug 3107351
+
+        * kjs/function.h: Change ActivationImp constructor to take context parameter.
+        * kjs/function.cpp: (ActivationImp::ActivationImp): Take context parameter,
+	not execution state parameter.
+
+        * kjs/internal.cpp: (ContextImp::ContextImp): Initialize activation object
+	from context, not execution state, because the new context is not yet in the
+	execution state.
+
+2002-11-20  Darin Adler  <darin@apple.com>
+
+	- added a feature for Richard to use in his back/forward cache
+
+        * kjs/object.h: Added save/restoreProperties.
+        * kjs/property_map.h: Here too.
+        * kjs/property_map.cpp: Here too.
+
+2002-11-20  Darin Adler  <darin@apple.com>
+
+	- created argument list objects only on demand for a 7.5% speedup
+
+        * kjs/function.h: Change ActivationImp around.
+        * kjs/function.cpp:
+        (FunctionImp::call): Pass a pointer to the arguments list to avoid ref/unref.
+        (FunctionImp::get): Get the function pointer from the context directly,
+	not the activation object.
+        (ArgumentsImp::ArgumentsImp): Add an overload that takes no arguments.
+        (ActivationImp::ActivationImp): Store a context pointer and an arguments object pointer.
+        (ActivationImp::get): Special case for arguments, create it and return it.
+        (ActivationImp::put): Special case for arguments, can't be set.
+        (ActivationImp::hasProperty): Special case for arguments, return true.
+        (ActivationImp::deleteProperty): Special case for arguments, refuse to delete.
+        (ActivationImp::mark): Mark the arguments object.
+        (ActivationImp::createArgumentsObject): Do the work of actually creating it.
+        (GlobalFuncImp::call): Use stack-based objects for the ContextImp and ExecState.
+
+        * kjs/internal.h: Keep function and arguments pointer in the context.
+        * kjs/internal.cpp:
+        (ContextImp::ContextImp): Don't pass in the func and args when making an ActivationImp.
+        (InterpreterImp::evaluate): Use stack-based objects here.
+
+        * kjs/types.h: Add ArgumentList as a synonym for List, soon to be separate.
+
+2002-11-20  Maciej Stachowiak  <mjs@apple.com>
+
+	Reduced the size of ValueImp by 8 bytes for a .5% speedup.
+	
+        * kjs/value.h: Removed destructed flag. Made refcount and flag 16
+	bits each.
+        * kjs/value.cpp:
+        (ValueImp::~ValueImp): Don't set destructed flag.
+
+2002-11-20  Darin Adler  <darin@apple.com>
+
+        * kjs/types.cpp: Keep ref count for the whole lists of nodes.
+	Doesn't speed things up much, less than 1%.
+
+2002-11-20  Maciej Stachowiak  <mjs@apple.com>
+
+        * kjs/collector.cpp:
+        (Collector::allocate): Clear the flags on newly allocated objects.
+
+2002-11-20  Darin Adler  <darin@apple.com>
+
+	- oops, checked in big regression instead of 5% speedup
+
+        * kjs/function.cpp: (ActivationImp::ActivationImp): Make a marking
+	list, not a refing list.
+
+	- a cut at the sparse array implementation
+
+        * kjs/array_instance.h: Keep storageLength separate from length.
+        * kjs/array_object.cpp:
+        (ArrayInstanceImp::ArrayInstanceImp): Start with storageLength == length.
+        (ArrayInstanceImp::get): Check against storage length.
+        (ArrayInstanceImp::put): Ditto.
+        (ArrayInstanceImp::hasProperty): Ditto.
+        (ArrayInstanceImp::deleteProperty): Ditto.
+        (ArrayInstanceImp::setLength): Only enlarge storage length up to a cutoff.
+        (ArrayInstanceImp::mark): Use storageLength.
+        (ArrayInstanceImp::pushUndefinedObjectsToEnd): Added FIXME.
+
+2002-11-20  Darin Adler  <darin@apple.com>
+
+	- decrease ref/deref -- 5% speedup in iBench
+
+        * JavaScriptCore.pbproj/project.pbxproj: Added array_instance.h
+        * kjs/array_instance.h: Added so it can be shared by function.h.
+
+        * kjs/array_object.cpp:
+        * kjs/array_object.h:
+        * kjs/bool_object.cpp:
+        * kjs/bool_object.h:
+        * kjs/collector.cpp:
+        * kjs/date_object.cpp:
+        * kjs/date_object.h:
+        * kjs/error_object.cpp:
+        * kjs/function.cpp:
+        * kjs/function.h:
+        * kjs/function_object.cpp:
+        * kjs/internal.cpp:
+        * kjs/internal.h:
+        * kjs/math_object.cpp:
+        * kjs/nodes.cpp:
+        * kjs/number_object.cpp:
+        * kjs/object.cpp:
+        * kjs/object.h:
+        * kjs/object_object.cpp:
+        * kjs/property_map.cpp:
+        * kjs/reference.cpp:
+        * kjs/reference.h:
+        * kjs/regexp_object.cpp:
+        * kjs/string_object.cpp:
+        * kjs/string_object.h:
+        * kjs/value.cpp:
+        * kjs/value.h:
+	Switched lots of interfaces so they don't require ref/deref.
+
+2002-11-20  Maciej Stachowiak  <mjs@apple.com>
+
+	Fixed the two most obvious problems with the new GC for another 6%
+	improvement.
+	
+        * kjs/collector.cpp:
+        (Collector::allocate): Don't bother doing the bit tests on a bitmap word if
+	all it's bits are on.
+        (Collector::collect): Track memoryFull boolean.
+        * kjs/collector.h: Inlined outOfMemory since it was showing up on profiles.
+
+2002-11-20  Maciej Stachowiak  <mjs@apple.com>
+
+	Rewrote garbage collector to make blocks of actual memory instead
+	of blocks of pointers. 7% improvement on JavaScript
+	iBench. There's still lots of room to tune the new GC, this is
+	just my first cut.
+	
+        * kjs/collector.cpp:
+        (Collector::allocate):
+        (Collector::collect):
+        (Collector::size):
+        (Collector::outOfMemory):
+        (Collector::finalCheck):
+        (Collector::numGCNotAllowedObjects):
+        (Collector::numReferencedObjects):
+        (Collector::liveObjectClasses):
+        * kjs/collector.h:
+        * kjs/function.cpp:
+        (ActivationImp::ActivationImp):
+        * kjs/function.h:
+
+2002-11-20  Darin Adler  <darin@apple.com>
+
+	- on the road to killing ActivationImp
+
+        * kjs/function.h: Add get/put to FunctionImp. Remove argumentsObject() from
+	ActivationImp. Add function() to ActivationImp.
+        * kjs/function.cpp:
+        (FunctionImp::FunctionImp): No arguments property.
+        (FunctionImp::call): No need to set up the arguments property.
+        (FunctionImp::parameterString): Remove ** strangeness.
+        (FunctionImp::processParameters): Ditto.
+        (FunctionImp::get): Added, handles arguments and length properties.
+        (FunctionImp::put): Ditto.
+        (FunctionImp::hasProperty): Ditto.
+        (FunctionImp::deleteProperty): Ditto.
+        (ActivationImp::ActivationImp): Store a function pointer so we can find it
+	in the context.
+
+        * kjs/function_object.cpp: (FunctionObjectImp::construct): No need to set up
+	arguments property.
+        * kjs/nodes.cpp: (FuncExprNode::evaluate): No need to set up length property.
+
+        * kjs/internal.h: Return ObjectImp * for activation object.
+
+        * kjs/interpreter.h: Remove stray declaration of ExecStateImp.
+
+2002-11-20  Darin Adler  <darin@apple.com>
+
+	- add a couple of list operations to avoid clearing lists so much during sorting; gives 1.5% iBench
+
+        * kjs/types.h: Added replaceFirst/replaceLast.
+        * kjs/types.cpp: (List::replaceFirst), (List::replaceLast): Added.
+
+        * kjs/array_object.cpp: (compareWithCompareFunctionForQSort): Use replaceFirst/replaceLast.
+
+        * kjs/property_map.cpp: Put in an ifdef so I can re-add/remove the single entry to see if
+	it has outlived its usefulness. (It hasn't yet.)
+
+2002-11-20  Darin Adler  <darin@apple.com>
+
+	- atomic identifiers; gives another 6.5% in the iBench suite
+
+        * kjs/identifier.h: Did the real thing.
+        * kjs/identifier.cpp: Ditto.
+
+        * kjs/property_map.h: _tableSizeHashMask -> _tableSizeMask
+        * kjs/property_map.cpp: The above, plus take advantage of comparing
+	by pointer instead of by comparing bytes.
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- a few more globals for often-used property names
+	- conversion to Identifier from UString must now be explicit
+
+        * kjs/error_object.cpp:
+        * kjs/function.cpp:
+        * kjs/function_object.cpp:
+        * kjs/identifier.cpp:
+        * kjs/identifier.h:
+        * kjs/lexer.cpp:
+        * kjs/nodes.cpp:
+        * kjs/number_object.cpp:
+        * kjs/object.cpp:
+        * kjs/object.h:
+        * kjs/string_object.cpp:
+        * kjs/testkjs.cpp:
+        * kjs/ustring.cpp:
+        * kjs/ustring.h:
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- another step towards atomic identifiers; storing hash in the string rep. gives about
+	a 1.5% speedup in the JavaScript iBench
+
+        * kjs/ustring.h: Add a hash field to UString::Rep.
+        * kjs/ustring.cpp:
+        (UString::Rep::create): Set hash to uninitialized value.
+        (UString::Rep::destroy): Do the deleting in her, and call Identifier if needed.
+        (UString::Rep::computeHash): Added.
+        (UString::append): Set hash to 0 when modifying the string in place.
+        (UString::operator=): Ditto.
+
+        * kjs/property_map.cpp: Use the hash from UString.
+
+        * kjs/identifier.h: Added aboutToDestroyUStringRep.
+        * kjs/identifier.cpp: (Identifier::aboutToDestroyUStringRep): Added.
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- next step towards atomic identifiers; Identifier is no longer derived from UString
+
+        * kjs/identifier.h: Remove base class and add _ustring member.
+        * kjs/identifier.cpp: Add null and an == that works with const char *.
+        * kjs/property_map.cpp: Get rep through _ustring.
+
+        * kjs/function.cpp: (FunctionImp::parameterString): Call ustring().
+        * kjs/function_object.cpp: (FunctionProtoFuncImp::call): Ditto.
+        * kjs/nodes.cpp:
+        (PropertyNode::evaluate): Ditto.
+        (VarDeclNode::evaluate): Ditto.
+        (ForInNode::execute): Ditto.
+        * kjs/nodes2string.cpp: (SourceStream::operator<<): Add overload for Identifier.
+        * kjs/reference.cpp: (Reference::getValue): Call ustring().
+        * kjs/regexp_object.cpp: (RegExpObjectImp::get): Call ustring().
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- fixed memory trasher
+
+        * kjs/ustring.cpp: (UString::from): Fix "end of buffer" computation.
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- a first step towards atomic identifiers in JavaScript
+
+	Most places that work with identifiers now use Identifier
+	instead of UString.
+
+        * kjs/identifier.cpp: Added.
+        * kjs/identifier.h: Added.
+        * JavaScriptCore.pbproj/project.pbxproj: Added files.
+
+        * kjs/array_object.cpp:
+        * kjs/array_object.h:
+        * kjs/completion.cpp:
+        * kjs/completion.h:
+        * kjs/date_object.cpp:
+        * kjs/date_object.h:
+        * kjs/function.cpp:
+        * kjs/function.h:
+        * kjs/function_object.cpp:
+        * kjs/grammar.cpp:
+        * kjs/grammar.cpp.h:
+        * kjs/grammar.h:
+        * kjs/grammar.y:
+        * kjs/internal.cpp:
+        * kjs/internal.h:
+        * kjs/lexer.cpp:
+        * kjs/lookup.cpp:
+        * kjs/lookup.h:
+        * kjs/math_object.cpp:
+        * kjs/math_object.h:
+        * kjs/nodes.cpp:
+        * kjs/nodes.h:
+        * kjs/number_object.cpp:
+        * kjs/number_object.h:
+        * kjs/object.cpp:
+        * kjs/object.h:
+        * kjs/property_map.cpp:
+        * kjs/property_map.h:
+        * kjs/reference.cpp:
+        * kjs/reference.h:
+        * kjs/regexp_object.cpp:
+        * kjs/regexp_object.h:
+        * kjs/string_object.cpp:
+        * kjs/string_object.h:
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- fix hash function and key comparison for the other kind of hash table; yields 3%
+
+        * kjs/lookup.cpp:
+        (keysMatch): Added.
+        (Lookup::findEntry): Don't allocate and convert to ASCII just to search.
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- another hash table fix; yields a 2% improvement on iBench JavaScript
+
+        * kjs/property_map.cpp: A few more places where we use & instead of %.
+
+	- some List changes that don't affect speed yet
+
+        * kjs/types.cpp:
+        (List::prependList): Tighten up a tiny bit.
+        (List::copy): Use prependList.
+        * kjs/types.h: Remove appendList and globalClear.
+
+        * kjs/interpreter.cpp: (Interpreter::finalCheck): Remove List::globalClear().
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- fixed 3105026 -- REGRESSION: DHTML menus are broken all over the place
+
+        * kjs/types.cpp: (List::prepend): Fix backwards links in new node.
+
+2002-11-19  Darin Adler  <darin@apple.com>
+
+	- a fix that gives another 1.5% on the iBench JavaScript test
+
+        * kjs/ustring.cpp: (UString::from): Stop using sprintf to format integers.
+
+2002-11-18  Darin Adler  <darin@apple.com>
+
+	- reduced the creation of Value objects and hoisted the property map
+        into Object for another gain of about 6%
+
+        * JavaScriptCore.pbproj/project.pbxproj: Made property_map.h public.
+        * kjs/array_object.cpp:
+        (compareWithCompareFunctionForQSort): Don't wrap the ValueImp * in a Value
+	just to add it to a list.
+        (ArrayProtoFuncImp::call): Pass the globalObject directly so we don't have
+	to ref/deref.
+        * kjs/function.cpp:
+        (FunctionImp::call): Use a reference for the global object to avoid ref/deref.
+        (GlobalFuncImp::call): Ditto.
+        * kjs/internal.cpp:
+        (BooleanImp::toObject): Put the object directly into the list, don't create a Value.
+        (StringImp::toObject): Ditto.
+        (NumberImp::toObject): Ditto.
+        (InterpreterImp::evaluate): Use a reference for the global object.
+        * kjs/internal.h: Return a reference for the global object.
+        * kjs/interpreter.cpp: (Interpreter::globalObject): Ditto.
+        * kjs/interpreter.h: Ditto.
+        * kjs/object.cpp: Use _prop directly in the object, not a separate pointer.
+        * kjs/object.h: Ditto.
+        * kjs/types.cpp: Added List methods that work directly with ValueImp.
+        (List::append): Added a ValueImp version.
+        (List::prepend): Ditto.
+        (List::appendList): Work directly with the ValueImp's.
+        (List::prependList): Ditto.
+        (List::copy): Use appendList.
+        (List::empty): Use a shared global List.
+        * kjs/types.h: Update for above changes.
+
+2002-11-18  Darin Adler  <darin@apple.com>
+
+        * kjs/property_map.cpp: Oops, copyright goes to Apple, not me.
+        * kjs/property_map.h: Ditto.
+
+2002-11-18  Darin Adler  <darin@apple.com>
+
+	- property and string improvements giving a 7% or so improvement in JavaScript iBench
+
+        * kjs/property_map.h: Rewrite to use a hash table.
+        * kjs/property_map.cpp: Ditto.
+
+        * kjs/string_object.h:
+        * kjs/string_object.cpp:
+        (StringInstanceImp::StringInstanceImp): Construct a string with the right value
+	instead of putting the string in later.
+        (StringInstanceImp::get): Get the length from the string, not a separate property.
+        (StringInstanceImp::put): Ignore attempts to set length, since we don't put it in
+	the property map.
+        (StringInstanceImp::hasProperty): Return true for length.
+        (StringInstanceImp::deleteProperty): Return false for length.
+        (StringObjectImp::construct): Call new StringInstanceImp constructor. Don't try
+	to set a length property.
+
+        * kjs/ustring.h: Make the rep deref know how to deallocate the rep.
+        * kjs/ustring.cpp:
+        (UString::release): Move the real work to the rep's deref, since the hash table
+	now uses the rep directly.
+
+        * kjs/object.h: Remove unused field.
+
+2002-11-18  Maciej Stachowiak  <mjs@apple.com>
+
+	Change List to completely avoid going through the GC
+	allocator. 3.6% performance improvement on JavaScript iBench.
+	
+        * kjs/internal.cpp:
+        (InterpreterImp::mark): Don't mark the empty list.
+
+	For all the methods below I basically lifted the ListImp version
+	up to the List method with minor tweaks.
+	
+        * kjs/types.cpp:
+        (ListIterator::ListIterator):
+        (List::List):
+        (List::operator=):
+        (List::~List):
+        (List::mark):
+        (List::append):
+        (List::prepend):
+        (List::appendList):
+        (List::prependList):
+        (List::removeFirst):
+        (List::removeLast):
+        (List::remove):
+        (List::clear):
+        (List::clearInternal):
+        (List::copy):
+        (List::begin):
+        (List::end):
+        (List::isEmpty):
+        (List::size):
+        (List::at):
+        (List::operator[]):
+        (List::empty):
+        (List::erase):
+        (List::refAll):
+        (List::derefAll):
+        (List::swap):
+        (List::globalClear):
+        * kjs/types.h:
+
+2002-11-18  Maciej Stachowiak  <mjs@apple.com>
+
+	Fixed a horrible leak introduced with my last change that
+	somehow did not show up on my machine.
+
+        * kjs/types.cpp:
+        (List::List): Mark ListImp as GC allowed.
+
+2002-11-18  Maciej Stachowiak  <mjs@apple.com>
+
+	Another step towards the List conversion: stop inheriting from Value.
+	
+        * kjs/types.cpp:
+        (ListIterator::ListIterator):
+        (List::List):
+        (List::operator=):
+        (List::~List):
+        (List::mark):
+        (List::append):
+        (List::prepend):
+        (List::appendList):
+        (List::prependList):
+        (List::removeFirst):
+        (List::removeLast):
+        (List::remove):
+        (List::clear):
+        (List::copy):
+        (List::begin):
+        (List::end):
+        (List::isEmpty):
+        (List::size):
+        (List::at):
+        (List::operator[]):
+        * kjs/types.h:
+
+2002-11-18  Maciej Stachowiak  <mjs@apple.com>
+
+	Partway to removing Value from List. Created a marking List
+	variant, used it in place of ListImp.
+	
+        * kjs/internal.h: Removed List stuff.
+        * kjs/internal.cpp:
+        (InterpreterImp::mark): Call appropriate List method to do marking of
+	empty ListImp.
+        * kjs/object.h:
+        * kjs/object.cpp: Use marking List instead of ListImp *.
+        * kjs/types.h:
+        * kjs/types.cpp:
+        (List::List): New boolean needsMarking parameter. 
+        (List::operator=): Perform trickery related to needsMarking.
+        (List::~List): Likewise.
+        (List::mark): Mark the ListImp.
+        (List::markEmptyList):
+	(ListImp::*): Moved here fron internal.cpp, they will be
+	integrated into the relevant List methods soon.
+
+2002-11-18  Darin Adler  <darin@apple.com>
+
+	- another string constant discovered that can be optimized
+
+        * kjs/object.h: Add a property name constant for "__proto__".
+        * kjs/object.cpp: Define it.
+	(ObjectImp::get): Use it.
+	(ObjectImp::hasProperty): Use it.
+
+	- prepare to turn PropertyMap into a hash table
+
+        * kjs/object.cpp:
+	(ObjectImp::mark): Use the new PropertyMap::mark().
+	(ObjectImp::put): Use the new overload of PropertyMap::get().
+	(ObjectImp::deleteProperty): Use the new overload of PropertyMap::get().
+	(ObjectImp::propList): Use PropertyMap::addEnumerablesToReferenceList().
+
+        * kjs/property_map.h: Remove PropertyMapNode and make all node-related methods private.
+	Add mark(), a new overload of get() that returns attributes, a clear() that takes no attributes,
+	and addEnumerablesToReferenceList().
+        * kjs/property_map.cpp:
+	(PropertyMap::get): Added new overload.
+	(PropertyMap::clear): Added new overload.
+	(PropertyMap::mark): Added.
+	(PropertyMap::addEnumerablesToReferenceList): Added.
+
+        * kjs/ustring.h: Added a hash function.
+        * kjs/ustring.cpp: (KJS::hash): Added.
+
+2002-11-18  Darin Adler  <darin@apple.com>
+
+	- simplified the ExecState class, which was showing up in profiles
+        
+        Sped up JavaScript iBench by 6%.
+
+        * kjs/interpreter.h: Removed the level of indirection, and made it all inline.
+        * kjs/interpreter.cpp: Removed ExecState implementation from here altogether.
+
+	- fixed an oversight in my sort speedup
+
+        * kjs/array_object.h: Add pushUndefinedObjectsToEnd.
+        * kjs/array_object.cpp:
+        (ArrayInstanceImp::sort): Call pushUndefinedObjectsToEnd.
+        (ArrayInstanceImp::pushUndefinedObjectsToEnd): Added.
+	Pushes all undefined to the end of the array.
+
+2002-11-18  Darin Adler  <darin@apple.com>
+
+	- fix worst speed problems on the sort page of the iBench JavaScript test
+
+	Sped up JavaScript iBench by 70%, the sort page by 88%.
+
+        * kjs/array_object.h: Add array-specific sort functions.
+        * kjs/array_object.cpp:
+        (compareByStringForQSort): Added.
+        (ArrayInstanceImp::sort): Added.
+        (compareWithCompareFunctionForQSort): Added.
+        (ArrayProtoFuncImp::call): Use ArrayInstanceImp::sort if the object being
+	sorted is actually an array.
+
+        * kjs/object.h: Add argumentsPropertyName.
+        * kjs/object.cpp: Add argumentsPropertyName.
+        * kjs/function.cpp:
+        (FunctionImp::FunctionImp): Use argumentsPropertyName to avoid making a UString.
+        (FunctionImp::call): Ditto.
+        (ActivationImp::ActivationImp): Ditto.
+        * kjs/function_object.cpp: (FunctionObjectImp::construct): Ditto.
+
+        * kjs/ustring.h: Added compare function for -1/0/+1 comparison.
+        * kjs/ustring.cpp: (KJS::compare): Added.
+
+2002-11-18  Maciej Stachowiak  <mjs@apple.com>
+
+	Change ArgumentListNode operations to be iterative instead of
+	recursive. This probably fixes 3095446 (Crash in
+	KJS::ArgumentListNode::ref()) but I can't reproduce it myself so
+	I'm not 100% sure. I think the original bug was a stack overflow
+	and this change would remove that possibility.
+	
+        * kjs/nodes.cpp:
+        (ArgumentListNode::ref): Make iterative.
+        (ArgumentListNode::deref): Make iterative.
+        (ArgumentListNode::evaluateList): Make iterative.
+
+=== Alexander-32 ===
+
+2002-11-14  Darin Adler  <darin@apple.com>
+
+	- fixed 3101243 -- excite passes date that can't be parsed, results in bogus date at top right corner
+
+        * kjs/date_object.cpp: (KJS::KRFCDate_parseDate): Handle errors from strtol
+	by checking errno. Check the "string in a haystack" to be sure it's a multiple
+	of 3. Add case that allows year to be after time.
+
+2002-11-14  Darin Adler  <darin@apple.com>
+
+	- fixed 3101191 -- REGRESSION: Hang loading excite.com
+
+        * kjs/date_object.cpp:
+        (mktimeUsingCF): Pick an arbitrary cutoff of 3000, and return -1 if the
+	year passed in is that big so we don't infinite loop. Also validate the
+	rest of the date with CFGregorianDateIsValid. 
+        (DateProtoFuncImp::call): Handle a -1 result from mktime.
+        (DateObjectImp::construct): Check for NaN before calling mktime, and also
+	handle a -1 result from mktime.
+        (DateObjectFuncImp::call): Check for NaN before calling mktime, and also
+	handle a -1 result from mktime.
+
+2002-11-13  Darin Adler  <darin@apple.com>
+
+	- fixed 3099930 -- dates/times without time zones are parsed as UTC by kjs,
+	local time by other browsers
+
+        * kjs/date_object.cpp:
+        (DateProtoFuncImp::call): Handle the NaN case better, like Mozilla and OmniWeb.
+        (DateObjectFuncImp::call): Return NaN rather than Undefined() for bad dates.
+        (KJS::parseDate): Return NaN rather than Undefined() or 0 for bad dates.
+        (KJS::KRFCDate_parseDate): Return -1 rather than 0 for bad dates.
+	Assume local time if no time zone is passed. Don't return 1 if we parse 0.
+
+2002-11-13  Darin Adler  <darin@apple.com>
+
+        - fixed 3073230 -- JavaScript time calls do I/O by lstat()ing /etc/localtime
+
+        * kjs/date_object.cpp:
+        (formatDate): Added.
+        (formatTime): Added.
+        (formatLocaleDate): Added.
+        (formatLocaleTime): Added.
+        (DateProtoFuncImp::call): Changed to use the above functions instead of
+	using strftime.
+
+2002-11-08  Darin Adler  <darin@apple.com>
+
+        * kjs/date_object.cpp:
+        (ctimeUsingCF): Added.
+        (timeUsingCF): Added.
+
+2002-11-07  Darin Adler  <darin@apple.com>
+
+        * kjs/date_object.cpp: (mktimeUsingCF): Fix storage leak.
+
+2002-11-07  Maciej Stachowiak  <mjs@apple.com>
+
+	- partial fix to 3073230 - JavaScript time calls do I/O by
+	lastat()ing /etc/localtime
+	
+        * kjs/date_object.cpp:
+        (mktimeUsingCF): Implementation of mktime using CF.
+
+=== Alexander-31 ===
+
+2002-11-01  Darin Adler  <darin@apple.com>
+
+        * kjs/object.cpp: Make the same change Maciej just did, but to the
+	other constructor right next to the one he changed.
+
+2002-10-31  Maciej Stachowiak  <mjs@apple.com>
+
+	- fixed 3082660 - REGRESSION: one ListImp leaks opening/closing nearly empty web page
+	
+        * kjs/object.cpp: Set gc allowed on freshly created ListImp, since
+	there is no List wrapper for it.
+
+2002-10-31  Darin Adler  <darin@apple.com>
+
+        * kjs/grammar.y: Fix the APPLE_CHANGES thing here too.
+        * kjs/grammar.cpp: Regenerated this file.
+
+=== Alexander-30 ===
+
+2002-10-30  Darin Adler  <darin@apple.com>
+
+	- fixed 3073230 -- Alex is doing file I/O when executing JavaScript by asking for localtime
+
+	I fixed this by using Core Foundation time functions instead.
+
+        * kjs/date_object.cpp:
+        (tmUsingCF): Function that uses Core Foundation to get the time and then puts it into
+	a tm struct.
+        (gmtimeUsingCF): Function used instead of gmtime (used a macro to make the substitution).
+        (localtimeUsingCF): Function used instead of localtime (used a macro to make the substitution).
+
+2002-10-26  Darin Adler  <darin@apple.com>
+
+	- changed to use #if APPLE_CHANGES and #if !APPLE_CHANGES consistently
+
+	We no longer do #ifdef APPLE_CHANGES or #ifndef APPLE_CHANGES.
+
+        * kjs/collector.cpp:
+        * kjs/collector.h:
+        * kjs/grammar.cpp:
+        * kjs/internal.cpp:
+        * kjs/ustring.h:
+
+2002-10-25  Darin Adler  <darin@apple.com>
+
+	- fixed 3038011 -- drop-down menu hierarchy broken at yahoo new acct page
+
+        * kjs/array_object.cpp: (ArrayProtoFuncImp::call):
+	Fix bug calling concat on an empty array. The old code tried to
+	optimize in a way that would prevent appending any arrays until
+	at least one element was in the destination array. So if you were
+	concatenating a non-empty array into an empty array, you got an empty array.
+
+=== Alexander-29 ===
+
+=== Alexander-28 ===
+
+2002-10-10  Darin Adler  <darin@apple.com>
+
+	- fixed 3072643 -- infinite loop in JavaScript code at walgreens.com
+
+	The problem is that "xxx".indexOf("", 1) needs to return 1, but we
+	were returning 0.
+
+        * kjs/ustring.cpp:
+        (UString::find): Return pos, not 0, when the search string is empty.
+        (UString::rfind): Make sure that pos is not past the end of the string,
+	taking into account the search string; fixes a potential read off the end
+	of the buffer. Also return pos, not 0, when the search string is empty.
+
+=== Alexander-27 ===
+
+2002-10-07  Darin Adler  <darin@apple.com>
+
+	Fixed absurdly high memory usage when looking at pages that use a lot of JavaScript.
+
+        * kjs/collector.cpp:
+        (Collector::allocate): Implement a new policy of doing a garbage collect every 1000
+	allocations. The old policy was both complicated and misguided.
+        (Collector::collect): Zero out the "number of allocations since last collect".
+
+2002-10-06  Darin Adler  <darin@apple.com>
+
+	I noticed some broken lists at mapblast.com and tracked it down to this.
+
+        * kjs/array_object.cpp:
+        (ArrayInstanceImp::put): Don't truncate the list; only extend the length if
+	it's not already long enough.
+        (ArrayProtoFuncImp::call): Fix some ifdef'd code so it compiles if you turn
+	the ifdefs on.
+
+2002-10-04  Darin Adler  <darin@apple.com>
+
+        Fixed problems parsing numbers that are larger than a long with parseInt.
+
+        * kjs/config.h: Define HAVE_FUNC_STRTOLL.
+        * kjs/function.cpp: (GlobalFuncImp::call):
+	Change parseInt to use strtoll if available.
+
+=== Alexander-26 ===
+
+2002-09-27  Darin Adler  <darin@apple.com>
+
+	- fixed 3033969 -- repro crash (infinite recursion in JavaScript)
+	clicking on "screens" option at fsv.sf.net
+
+        * kjs/object.h: Change recursion limit to 100 levels rather than 1000.
+
+=== Alexander-25 ===
+
+2002-09-26  Darin Adler  <darin@apple.com>
+
+	Fix the infinity problem Dave worked around. We didn't have the
+	configuration flags set right to make infinity work. Setting those
+	properly made everything work without changes to min and max.
+
+        * kjs/config.h: Define HAVE_FUNC_ISINF, HAVE_STRING_H, and
+	also WORDS_BIGENDIAN (if on ppc).
+
+        * kjs/math_object.cpp: (MathFuncImp::call): Roll out min and max
+	changes from yesterday.
+
+2002-09-25  David Hyatt  <hyatt@apple.com>
+
+	Fix the impls of min/max to not use +inf/-inf when you have
+	arguments.  Technically there's still a bug here for the no
+	argument case, probably caused by a screwup when +inf/-inf are
+	converted to doubles.
+	
+        * kjs/math_object.cpp:
+        (MathFuncImp::call):
+
+2002-09-25  Darin Adler  <darin@apple.com>
+
+	- fixed 3057964 -- JS problem performing MD5 script embedded in yahoo login page
+
+        * kjs/simple_number.h: Fix incorrect check for sign bit that was munging numbers
+	in the range 0x10000000 to 0x1FFFFFFF.
+
+=== Alexander-24 ===
+
+=== Alexander-22 ===
+
+2002-09-05  Maciej Stachowiak  <mjs@apple.com>
+
+	First baby step towards moving List away from garbage collection.
+	
+        * kjs/types.h: Add needsMarking boolean and make List inherit from
+	Value privately instead of publicly.
+
+2002-08-30  Darin Adler  <darin@apple.com>
+
+        * JavaScriptCore.pbproj/project.pbxproj: Allowed the new Project Builder to put in
+	encodings for each file.
+
+=== Alexander-21 ===
+
+=== Alexander-20 ===
+
+2002-08-20  Darin Adler  <darin@apple.com>
+
+	Three small changes to things that showed up in the sample.
+
+	5% speed increase on cvs-js-performance test.
+	
+        * kjs/simple_number.h: Check if double is an integer with d == (double)(int)d
+	instead of remainder(d, 1) == 0, saving a function call each time.
+
+        * kjs/ustring.cpp:
+        (UString::find): Compare the first character before calling memcmp for the rest.
+        (UString::rfind): Ditto.
+        (KJS::operator==): Don't do a strlen before starting to compare the characters.
+
+2002-08-20  Maciej Stachowiak  <mjs@apple.com>
+
+        * kjs/object.cpp: Don't reference other ValueImps in the
+	destructor, they may have already been destroyed, and will have
+	GC_ALLOWED set already in any case.
+
+2002-08-19  Maciej Stachowiak  <mjs@apple.com>
+
+	Fixed the bug that made sony.com menus come out wrong and made
+	aa.com crash (Radar 3027762).
+	
+	Mode most methods inline.
+	
+        * kjs/completion.cpp:
+        * kjs/completion.h:
+
+2002-08-19  Maciej Stachowiak  <mjs@apple.com>
+
+	Maintain stack of old "arguments" property values for functions
+	implicitly on the system stack instead of explicitly in the
+	FunctionImp. This eliminates only a trivial number of GC
+	allocations (less than 200) but eliminates one of the two cases
+	where a ListImp * is stored directly, paving the way to separate
+	List from Value.
+	
+        * kjs/function.h: Remove argStack, pushArgs and popArgs.
+        * kjs/function.cpp:
+        (FunctionImp::FunctionImp): Don't initalize argStack.
+        (FunctionImp::~FunctionImp): Remove comment about argStack.
+        (FunctionImp::mark): Don't mark the argStack.
+        (FunctionImp::call): Save old "arguments" property in a Value,
+	where it will be GC-protected, rather than keeping a list, and
+	restore the old value when done executing.
+
+2002-08-18  Darin Adler  <darin@apple.com>
+
+        * kjs/internal.cpp: (KJS::printInfo): Remove one more CompletionType
+	that Maciej missed.
+
+2002-08-18  Maciej Stachowiak  <mjs@apple.com>
+
+	Remove stray references to CompletionType and CompletionImp.
+	
+        * kjs/completion.h:
+        * kjs/object.cpp:
+        * kjs/value.h:
+
+2002-08-18  Maciej Stachowiak  <mjs@apple.com>
+
+	Separated Completion from Value and made it a pure stack
+	object. This removed another 160,000 of the remaining 580,000
+	garbage collected object allocations.
+
+	6% speed increase on cvs-js-performance test.
+	
+        * kjs/completion.cpp: Added. New implementation that doesn't
+	require a ValueImp *.
+        (Completion::Completion):
+        (Completion::complType):
+        (Completion::value):
+        (Completion::target):
+        (Completion::isValueCompletion):
+        * kjs/completion.h: Added.
+        * kjs/function.cpp:
+	(GlobalFuncImp::call): Removed some (apparently mistaken) uses of
+	Completion as a Value.
+        * kjs/internal.cpp:
+        * kjs/internal.h:
+        * kjs/types.cpp: Removed Completion stuff.
+        * kjs/types.h: Removed Completion stuff.
+        * JavaScriptCore.pbproj/project.pbxproj: Added new header.
+
+2002-08-16  Darin Adler  <darin@apple.com>
+
+	Fix the Development build.
+
+        * kjs/object.cpp: Take out a use of ReferenceType.
+
+        * kjs/ustring.h: Added a bit more inlining.
+        * kjs/ustring.cpp: Moved the function out of here.
+
+2002-08-16  Maciej Stachowiak  <mjs@apple.com>
+
+	Final step of the Reference change. Completely separate Reference
+	from Value, and eliminate ReferenceImp.
+
+	18% speedup on cvs-js-performance test.
+
+        * kjs/internal.cpp, kjs/internal.h: Remove ReferenceImp.
+        * kjs/nodes.cpp:
+        (Node::evaluateReference): Use Reference::makeValueReference(),
+	not ConstReference.
+        * kjs/reference.cpp:
+        (Reference::Reference): New implementation, handles both regular
+	and value references.
+        (Reference::makeValueReference): Incorporate functionality of ConstReference
+	into this class.
+        (Reference::getBase): New implementation (incorporates error vase
+	for value references).
+	(Reference::getPropertyName): New implementation (incorporates error case
+	for value references).
+        (Reference::putValue): New implementation (incorporates error case
+	for value references).
+        (Reference::deleteValue): New implementation (incorporates error case
+	for value references).
+        (Reference::getValue): New implementation (incorporates special case
+	for value references).
+        (Reference::isMutable): New implementation.
+	* kjs/reference.h: New implementation that merges ReferenceImp
+	into the stack object.
+        * kjs/value.h, kjs/value.cpp: Removed all reference-related method.
+
+2002-08-16  Darin Adler  <darin@apple.com>
+
+	- fixed 3026184 -- Hang going to http://aa.com/ while executing JavaScript
+
+        * kjs/simple_number.h: (SimpleNumber::value): Fixed conversion to a negative
+	number. The technique of using division was no good. Instead, or in the sign
+	bits as needed.
+
+2002-08-16  Maciej Stachowiak  <mjs@apple.com>
+
+        * kjs/reference_list.h: Must include headers with "", not
+	<>. D'oh!
+
+2002-08-16  Maciej Stachowiak  <mjs@apple.com>
+
+        * JavaScriptCore.pbproj/project.pbxproj: Install reference.h and
+	reference_list.h so WebCore compiles (duh).
+
+2002-08-16  Maciej Stachowiak  <mjs@apple.com>
+
+        * JavaScriptCore.pbproj/project.pbxproj:
+        * kjs/internal.cpp:
+        * kjs/internal.h:
+        * kjs/nodes.cpp:
+        (Node::evaluateReference):
+        * kjs/reference.cpp:
+        (Reference::Reference):
+        (Reference::makeValueReference):
+        (Reference::getBase):
+        (Reference::getPropertyName):
+        (Reference::getValue):
+        (Reference::putValue):
+        (Reference::deleteValue):
+        (Reference::isMutable):
+        * kjs/reference.h:
+        * kjs/reference_list.h:
+        * kjs/value.cpp:
+        (ValueImp::dispatchToUInt32):
+        * kjs/value.h:
+
+2002-08-16  Maciej Stachowiak  <mjs@apple.com>
+
+	Next step: reimplement ReferenceList from scratch, and store it as
+	an actual Reference object, so ReferenceList no longer depends on
+	Reference being a Value or having a ReferenceImp. A resizing
+	vector might be even better the way this is used.
+
+	Also moved Reference to its own header and implementation file in
+	preparation for reimplementing it.
+	
+        * JavaScriptCore.pbproj/project.pbxproj:
+        * kjs/nodes.cpp:
+        (ForInNode::execute):
+        * kjs/reference.cpp: Added.
+        (Reference::Reference):
+        (Reference::dynamicCast):
+        (ConstReference::ConstReference):
+        * kjs/reference.h: Added.
+        * kjs/reference_list.cpp: Added.
+        (ReferenceList::ReferenceList):
+        (ReferenceList::operator=):
+        (ReferenceList::swap):
+        (ReferenceList::append):
+        (ReferenceList::~ReferenceList):
+        (ReferenceList::begin):
+        (ReferenceList::end):
+        (ReferenceListIterator::ReferenceListIterator):
+        (ReferenceListIterator::operator!=):
+        (ReferenceListIterator::operator->):
+        (ReferenceListIterator::operator++):
+        * kjs/reference_list.h:
+        * kjs/types.cpp:
+        * kjs/types.h:
+
+2002-08-16  Maciej Stachowiak  <mjs@apple.com>
+
+	Fix Development build - some NDEBUG code had to be changed for the
+	Value/Reference split.
+	
+        * kjs/internal.cpp:
+        (KJS::printInfo):
+        * kjs/nodes.cpp:
+        (FunctionCallNode::evaluate):
+
+2002-08-16  Maciej Stachowiak  <mjs@apple.com>
+
+        * kjs/reference_list.h: Added file I forgot to check in last time.
+
+2002-08-15  Maciej Stachowiak  <mjs@apple.com>
+
+	Phase 1 of optimization to stop allocating references through the
+	collector. This step clearly splits evaluating to a reference and
+	evaluating to a value, and moves all of the reference-specific
+	operations from Value to Reference. A special ConstReference class
+	helps out for the one case where you need special reference
+	operations if the result is a reference, and not otherwise.
+
+	Also, Reference now inherits privately from Value, and there is a
+	new ReferenceList class that inherits privately from List, so the
+	uses of Reference and Value are now completely orthogonal. This
+	means that as the next step, their implementations can be
+	completely disentangled.
+	
+	This step has no actual performance impact.
+	
+        * kjs/collector.cpp:
+        (Collector::collect):
+        * kjs/nodes.cpp:
+        (Node::evaluateReference):
+        (ResolveNode::evaluate):
+        (ResolveNode::evaluateReference):
+        (ElementNode::evaluate):
+        (PropertyValueNode::evaluate):
+        (AccessorNode1::evaluate):
+        (AccessorNode1::evaluateReference):
+        (AccessorNode2::evaluate):
+        (AccessorNode2::evaluateReference):
+        (ArgumentListNode::evaluateList):
+        (NewExprNode::evaluate):
+        (FunctionCallNode::evaluate):
+        (PostfixNode::evaluate):
+        (DeleteNode::evaluate):
+        (VoidNode::evaluate):
+        (TypeOfNode::evaluate):
+        (PrefixNode::evaluate):
+        (UnaryPlusNode::evaluate):
+        (NegateNode::evaluate):
+        (BitwiseNotNode::evaluate):
+        (LogicalNotNode::evaluate):
+        (MultNode::evaluate):
+        (AddNode::evaluate):
+        (ShiftNode::evaluate):
+        (RelationalNode::evaluate):
+        (EqualNode::evaluate):
+        (BitOperNode::evaluate):
+        (BinaryLogicalNode::evaluate):
+        (ConditionalNode::evaluate):
+        (AssignNode::evaluate):
+        (CommaNode::evaluate):
+        (VarDeclNode::evaluate):
+        (ExprStatementNode::execute):
+        (IfNode::execute):
+        (DoWhileNode::execute):
+        (WhileNode::execute):
+        (ForNode::execute):
+        (ForInNode::execute):
+        (ReturnNode::execute):
+        (WithNode::execute):
+        (CaseClauseNode::evaluate):
+        (SwitchNode::execute):
+        (ThrowNode::execute):
+        * kjs/nodes.h:
+        * kjs/types.cpp:
+        (ConstReference::ConstReference):
+        * kjs/types.h:
+        * kjs/value.h:
+
+2002-08-15  Darin Adler  <darin@apple.com>
+
+	Tweaks and small bug fixes to Maciej's excellent new fixnum optimization.
+	Also updated or removed comments that call it "fixnum" instead of "simple number".
+
+        * kjs/simple_number.h: Change constant names so they don't SHOUT the way macro
+	names do. Added constants for shift, min, and max. Fixed off-by-1 error that
+	prevented us from using the extreme values on either end. Base the range of
+	numbers on a fixed 32 bits constant rather than the size of a long, because
+	code elsewhere depends on positive numbers fitting into both "unsigned" and
+	"UInt32" while assuming it doesn't need to check; we can easily change this
+	later. Used int types rather than long for essentially the same reason.
+	Fixed the value-extraction function so it will work for negative numbers even
+        if the shift is logical, not arithmetic, by using division instead.
+	Renamed functions to be quite terse since they are inside a class.
+
+        * kjs/value.h:
+        * kjs/value.cpp:
+        (ValueImp::dispatchToObject): Call NumberImp::toObject in a "non-virtual"
+	way rather than repeating the code here.
+        (ValueImp::dispatchToUInt32): Handle the negative number case correctly.
+        (ValueImp::dispatchGetBase): Call ValueImp::getBase in a "non-virtual"
+	way rather than repeating the code here.
+        (ValueImp::dispatchGetPropertyName): Call ValueImp::getPropertyName in a
+	"non-virtual" way rather than repeating the code here.
+        (ValueImp::dispatchPutValue): Call ValueImp::putValue in a "non-virtual"
+	way rather than repeating the code here.
+        (ValueImp::dispatchDeleteValue): Call ValueImp::deleteValue in a "non-virtual"
+	way rather than repeating the code here.
+        (Number::Number): Fixed a bug where the double-based constructor was casting
+	to long, so wouldn't do the "remainder" check.
+
+=== Alexander-19 ===
+
+=== Alexander-18 ===
+
+2002-08-15  Maciej Stachowiak  <mjs@apple.com>
+
+	Phase 2 of fixnum optimization. Store any integral number that
+	will fit in two bits less than a long inside the ValueImp *
+	itself, thus avoiding the need to deal with the garbage collector
+	at all for these types. Such numbers comprised .5 million of the
+	1.7 million ValueImps created during the cvs-js-performance test,
+	so traffic through the garbage collector should be
+
+	20% improvement on cvs-js-performance. This may also show up on
+	cvs-base, but I did not compare and I am too lazy to make clean in
+	WebCore yet again. 
+
+	This also significantly reduces memory footprint on
+	JavaScript-heavy pages. Size after going through
+	cvs-js-performance suite is now 22MB to 17.5MB.
+	
+        * JavaScriptCore.pbproj/project.pbxproj:
+        * kjs/simple_number.h: Added. Some inline static methods for handling
+	simple numbers that are stored in the pointer.
+        * kjs/ustring.h:
+        * kjs/ustring.cpp:
+        (UString::from): Added new overload for long.
+        * kjs/value.cpp:
+        (ValueImp::marked): Add special case for simple numbers.
+        (ValueImp::setGcAllowed): Likewise.
+	(ValueImp::toInteger): Call dispatch version of
+	toUInt32(unsigned&), not the real method.
+        (ValueImp::toInt32): Likewise.
+        (ValueImp::toUInt32): Likewise.
+        (ValueImp::toUInt16): Likewise.
+        (ValueImp::dispatchType): Add special case for simple numbers.
+        (ValueImp::dispatchToPrimitive): Likewise.
+        (ValueImp::dispatchToBoolean): Likewise.
+        (ValueImp::dispatchToNumber): Likewise.
+        (ValueImp::dispatchToString): Likewise.
+        (ValueImp::dispatchToObject): Likewise.
+        (ValueImp::dispatchToUInt32): Likewise.
+        (ValueImp::dispatchGetBase): Likewise.
+        (ValueImp::dispatchGetPropertyName): Likewise.
+        (ValueImp::dispatchPutValue): Likewise.
+        (ValueImp::dispatchDeleteValue): Likewise.
+        (Number::Number): Create a simple number instead of a full-blown
+	ValueImp when possible.
+        (Number::value): Likewise.
+        * kjs/value.h:
+
+2002-08-15  Maciej Stachowiak  <mjs@apple.com>
+
+	Phase one of the "fixnum" optimization (storing small enough
+	integers in the pointer). This just paves the way for the change
+	by making all the virtual functions of ValueImp private and adding
+	non-virtual dispatchers which can call the virtual function or
+	handle fixnums specially.
+
+	Also, I marked every place that should need a special case with a
+	FIXNUM comment.
+	
+        * kjs/bool_object.cpp:
+        (BooleanObjectImp::construct): Call dispatch method not the real method.
+        * kjs/internal.h: Make toUInt32 private to make sure no one calls it directly
+	on a NumberImp*.
+        * kjs/nodes.cpp:
+        (ForInNode::execute): Call dispatch method not the real method.
+        * kjs/object.cpp:
+	(ObjectImp::propList): Call dispatch method not the real method.
+        * kjs/object.h:
+        * kjs/string_object.cpp:
+        (StringProtoFuncImp::call): Call dispatch method not the real method.
+        (StringObjectImp::construct): Call dispatch method not the real method.
+        * kjs/value.h:
+        * kjs/value.cpp:
+        (ValueImp::marked): Put a comment about required FIXNUM change.
+        (ValueImp::setGcAllowed): Likewise.
+        (ValueImp::dispatchType): Just call the virtual method for now.
+        (ValueImp::dispatchToPrimitive): Likewise.
+        (ValueImp::dispatchToBoolean): Likewise.
+        (ValueImp::dispatchToNumber): Likewise.
+        (ValueImp::dispatchToString): Likewise.
+        (ValueImp::dispatchToObject): Likewise.
+        (ValueImp::dispatchToUInt32): Likewise.
+        (ValueImp::dispatchGetBase): Likewise.
+        (ValueImp::dispatchGetPropertyName): Likewise.
+        (ValueImp::dispatchGetValue): Likewise.
+        (ValueImp::dispatchPutValue): Likewise.
+        (ValueImp::dispatchDeleteValue): Likewise.
+
+2002-08-14  Darin Adler  <darin@apple.com>
+
+	Another pass of tweaks, including one bug fix.
+
+        * kjs/array_object.cpp:
+        (ArrayInstanceImp::ArrayInstanceImp): Use malloc, not new.
+        (ArrayInstanceImp::get): Use a local variable so we don't rely on the optimizer
+	to avoid indexing twice.
+        (ArrayInstanceImp::hasProperty): Use a local variable, and also check against
+	UndefinedImp::staticUndefined rather than doing type() != UndefinedType.
+
+2002-08-14  Maciej Stachowiak  <mjs@apple.com>
+
+        Simplified array handling by using NULL to represent empty cells
+	instead of the Undefined object, so we can use calloc, realloc and
+	memset instead of loops. Inspired by a suggestion of Darin's.
+
+	* kjs/array_object.cpp:
+        (ArrayInstanceImp::ArrayInstanceImp):
+        (ArrayInstanceImp::~ArrayInstanceImp):
+        (ArrayInstanceImp::get):
+        (ArrayInstanceImp::hasProperty):
+        (ArrayInstanceImp::deleteProperty):
+        (ArrayInstanceImp::setLength):
+        (ArrayInstanceImp::mark):
+
+2002-08-14  Maciej Stachowiak  <mjs@apple.com>
+
+        Fix major JavaScript memory leak. run-plt says cvs-base improved
+	by 2% and cvs-js-performance improved by 7%. However, this was
+	within the possible noise level in each case.
+        
+	The fix was to store ValueImp *'s in the array instead of Value
+	objects, since the Value wrapper will keep a ref and make the
+	object immortal.
+
+	* kjs/array_object.cpp:
+        (ArrayInstanceImp::ArrayInstanceImp):
+        (ArrayInstanceImp::get):
+        (ArrayInstanceImp::put):
+        (ArrayInstanceImp::hasProperty):
+        (ArrayInstanceImp::deleteProperty):
+        (ArrayInstanceImp::setLength):
+        (ArrayInstanceImp::mark):
+        * kjs/array_object.h:
+
+2002-08-13  Maciej Stachowiak  <mjs@apple.com>
+
+	Add the ability to determine the classes of live JavaScript
+	objects, to help with leak fixing.
+
+        * kjs/collector.h, kjs/collector.cpp:
+        (Collector::liveObjectClasses):
+
+2002-08-13  Maciej Stachowiak  <mjs@apple.com>
+
+	Small speed improvement. 3% faster on cvs-js-performance, no
+	measurable change on cvs-static-urls.
+	
+        * kjs/collector.cpp:
+        (Collector::collect): Combine 3 loops over all objects into one,
+	to reduce flat time and improve locality of reference.
+
+2002-08-12  Darin Adler  <darin@apple.com>
+
+	Speed improvements. 19% faster on cvs-js-performance, 1% on cvs-static-urls.
+
+	Use global string objects for length and other common property names rather
+	than constantly making and destroying them. Use integer versions of get() and
+	other related calls rather than always making a string.
+
+	Also get rid of many unneeded constructors, destructors, copy constructors, and
+	assignment operators. And make some functions non-virtual.
+
+        * kjs/internal.h:
+        * kjs/internal.cpp:
+        (NumberImp::toUInt32): Implement.
+        (ReferenceImp::ReferenceImp): Special case for numeric property names.
+        (ReferenceImp::getPropertyName): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::getValue): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::putValue): Moved guts here from ValueImp. Handle numeric case.
+        (ReferenceImp::deleteValue): Added. Handle numeric case.
+
+        * kjs/array_object.h:
+        * kjs/array_object.cpp: All-new array implementation that stores the elements
+	in a C++ array rather than in a property map.
+        (ArrayInstanceImp::ArrayInstanceImp): Allocate the C++ array.
+        (ArrayInstanceImp::~ArrayInstanceImp): Delete the C++ array.
+        (ArrayInstanceImp::get): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::put): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::hasProperty): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::deleteProperty): Implement both the old version and the new overload that
+	takes an unsigned index for speed.
+        (ArrayInstanceImp::setLength): Added. Used by the above to resize the array.
+        (ArrayInstanceImp::mark): Mark the elements of the array too.
+        (ArrayPrototypeImp::ArrayPrototypeImp): Pass the length to the array instance constructor.
+
+        * kjs/bool_object.cpp:
+        * kjs/date_object.cpp:
+        * kjs/error_object.cpp:
+        * kjs/function.cpp:
+        * kjs/function_object.cpp:
+        * kjs/math_object.cpp:
+        * kjs/nodes.cpp:
+        * kjs/nodes.h:
+        * kjs/number_object.cpp:
+        * kjs/object_object.cpp:
+        * kjs/regexp_object.cpp:
+        * kjs/string_object.cpp:
+
+        * kjs/nodes2string.cpp: (SourceStream::operator<<): Add a special case for char now that
+	you can't create a UString from a char implicitly.
+
+        * kjs/object.h:
+        * kjs/object.cpp:
+        (ObjectImp::get): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::put): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::hasProperty): Call through to the string version if the numeric version is not implemented.
+        (ObjectImp::deleteProperty): Call through to the string version if the numeric version is not implemented.
+
+        * kjs/types.h:
+        * kjs/types.cpp:
+        (Reference::Reference): Added constructors for the numeric property name case.
+
+        * kjs/ustring.h: Made the constructor that turns a character into a string be explicit so we
+	don't get numbers that turn themselves into strings.
+        * kjs/ustring.cpp:
+        (UString::UString): Detect the empty string case, and use a shared empty string.
+        (UString::find): Add an overload for single character finds.
+        (UString::rfind): Add an overload for single character finds.
+        (KJS::operator==): Fix bug where it would call strlen(0) if the first string was not null.
+	Also handle non-ASCII characters consistently with the rest of the code by casting to unsigned char
+	just in case.
+
+        * kjs/value.h: Make ValueImp and all subclasses non-copyable and non-assignable.
+        * kjs/value.cpp:
+        (ValueImp::toUInt32): New interface, mainly useful so we can detect array indices and not turn
+	them into strings and back.
+        (ValueImp::toInteger): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::toInt32): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::toUInt16): Use the new toUInt32. Probably can use more improvement.
+        (ValueImp::getBase): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::getPropertyName): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::getValue): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::putValue): Remove handling of the Reference case. That's in ReferenceImp now.
+        (ValueImp::deleteValue): Added. Used so we can do delete the same way we do put.
+
+=== Alexander-17 ===
+
+2002-08-09  Darin Adler  <darin@apple.com>
+
+	Some string speedups. Makes sony.com cached 11% faster on Development, but
+        the improvement for Deployment should be greater.
+
+        * kjs/ustring.h: Made it possible for UChar objects to be uninitialized, which
+	gives a speed boost. Inlined CString's +=, UString's destructor, +=, and +.
+        * kjs/ustring.cpp:
+        (UString::UString): Optimize const char * version, which showed up
+	heavily in performance analysis. Added new two-UString version, which
+	makes the + operator fast. 
+        (UString::ascii): Remove thread safety changes. Change static buffer to remember
+	its size, and to always be at least 4096 bytes long; that way we never have to
+	reallocate unless it's for a long string. Also make code to extract the characters
+	significantly faster by getting rid of two pointer dereferences per character.
+        (UString::is8Bit): Avoid one pointer dereference per character.
+        (UString::toDouble): Use ascii() instead of cstring() to avoid copying the string.
+
+        * kjs/collector.cpp: Remove unneeded APPLE_CHANGES.
+        * kjs/regexp.cpp: Remove ifdefs around some APPLE_CHANGES that we
+	want to keep, because they just fix warnings.
+        * kjs/value.h: Remove obsolete APPLE_CHANGES comment.
+
+        * JavaScriptCore.pbproj/project.pbxproj: Project Builder decided
+	to move a line around in the file.
+
+2002-08-09  Maciej Stachowiak  <mjs@apple.com>
+
+	Fix my last change to actually call the versions of the lock functions
+	that are recursive and initialize as needed.
+	
+        * kjs/internal.cpp:
+        (InterpreterImp::InterpreterImp):
+        (InterpreterImp::clear):
+        (InterpreterImp::evaluate):
+
+2002-08-09  Maciej Stachowiak  <mjs@apple.com>
+
+        - fixed 2948835 - JavaScriptCore locking is too fine grained, makes it too slow
+
+	* kjs/collector.cpp:
+        (Collector::allocate):
+        (Collector::collect):
+        (Collector::finalCheck):
+        (Collector::numInterpreters):
+        (Collector::numGCNotAllowedObjects):
+        (Collector::numReferencedObjects):
+        * kjs/collector.h:
+        * kjs/internal.cpp:
+        (initializeInterpreterLock):
+        (lockInterpreter):
+        (unlockInterpreter):
+        (Parser::parse):
+        (InterpreterImp::InterpreterImp):
+        (InterpreterImp::clear):
+        (InterpreterImp::evaluate):
+        * kjs/value.cpp:
+        (ValueImp::ValueImp):
+        (ValueImp::setGcAllowed):
+
+=== milestone 0.5 ===
+
+=== Alexander-16 ===
+
+2002-08-05  Maciej Stachowiak  <mjs@apple.com>
+
+	- fixed 3007072 - need to be able to build fat
+	
+        * JavaScriptCore.pbproj/project.pbxproj: Fixed DeploymentFat build.
+
+=== Alexander-15 ===
+
+2002-07-25  Darin Adler  <darin@apple.com>
+
+        * JavaScriptCore.pbproj/project.pbxproj: Add DeploymentFat build style.
+
+=== Alexander-14 ===
+
+2002-07-21  Darin Adler  <darin@apple.com>
+
+        * kjs/*: Roll KDE 3.0.2 changes in. Also switch to not using APPLE_CHANGES
+	for some of the changes that we definitely want to contribute upstream.
+
+2002-07-21  Maciej Stachowiak  <mjs@apple.com>
+
+        * Makefile.am: Remove products from symroots on `make clean'.
+
+=== Alexander-13 ===
+
+2002-07-13  Darin Adler  <darin@apple.com>
+
+        * Makefile.am: Don't use embed.am any more.
+        * JavaScriptCore.pbproj/project.pbxproj: Use embed-into-alex instead
+	of make embed.
+
+2002-07-12  Darin Adler  <darin@apple.com>
+
+        * kjs/ustring.h: Since <sys/types.h> includes ushort and uint now, had
+	to change the includes here to be compatible with that.
+
+2002-07-11  Darin Adler  <darin@apple.com>
+
+        * JavaScriptCore.pbproj/project.pbxproj: To make the build of
+	WebCore work without using -I to peek at JavaScriptCore sources,
+	made all the Public sources Private so they are all in one directory.
+	Also, made lookup.h be Private.
+
+=== Alexander-11 ===
+
+=== Alexander-10 ===
+
+2002-06-25  Darin Adler  <darin@apple.com>
+
+        * JavaScriptCore.pbproj/project.pbxproj: Re-add -Wmissing-format-attribute.
+
+=== Alexander-9 ===
+
+2002-06-19  Kenneth Kocienda  <kocienda@apple.com>
+
+        I just played alchemical voodoo games with the linker to 
+        make all our frameworks and Alexander prebound.
+
+	* JavaScriptCore.pbproj/project.pbxproj
+
+2002-06-15  Darin Adler  <darin@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Removed explicit PFE_FILE_C_DIALECTS now that
+	Project Builder handles this automatically. Removed explicit USE_GCC3 since that's implicit
+	now. Also, since this project is all C++, only use WARNING_CFLAGS with flags that are appropriate
+	for C++; don't bother breaking out C vs. C++.
+
+	* kjs/collector.cpp: Now that the system warning is fixed, use PTHREAD_MUTEX_INITIALIZER and
+	PTHREAD_COND_INITIALIZER.
+	* kjs/internal.cpp: Use PTHREAD_MUTEX_INITIALIZER.
+	* kjs/ustring.cpp: Use PTHREAD_ONCE_INIT.
+
+2002-06-15  Maciej Stachowiak  <mjs@apple.com>
+
+        Made Development build mode mean what Unoptimized used to mean. Removed Unoptimized build mode. 
+        Added a Mixed build mode which does what Deployment used to. All this to fix:
+        
+        Radar 2955367 - Change default build style to "Unoptimized"
+        
+	* JavaScriptCore.pbproj/project.pbxproj:
+
+2002-06-12  Darin Adler  <darin@apple.com>
+
+	* kjs/nodes.cpp: (Node::finalCheck): A bit of APPLE_CHANGES so we
+	can compile with KJS_DEBUG_MEM defined if we want to.
+
+2002-06-10  Darin Adler  <darin@apple.com>
+
+	Merged in changes from KDE 3.0.1.
+
+	* kjs/collector.cpp:
+	* kjs/date_object.cpp:
+	* kjs/function.cpp:
+	* kjs/internal.cpp:
+	* kjs/lookup.h:
+	* kjs/object.cpp:
+	* kjs/operations.cpp:
+	* kjs/regexp.cpp:
+	* kjs/regexp_object.cpp:
+	* kjs/regexp_object.h:
+	* kjs/string_object.cpp:
+	* kjs/testkjs.cpp:
+	* kjs/ustring.cpp:
+	* kjs/value.cpp:
+	* kjs/value.h:
+	Do the merge, and add APPLE_CHANGES as needed to make things compile.
+
+	* kjs/date_object.lut.h: Re-generated.
+
+2002-06-07  Darin Adler  <darin@apple.com>
+
+	* Makefile.am: Use new shared "embed.am" file so we don't need four copies of
+	the embedding rules for WebFoundation, JavaScriptCore, WebCore, and WebKit.
+
+2002-06-07  Darin Adler  <darin@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Don't use any warning flags for C that won't work
+	for C++, because PFE uses the C warning flags on a C++ compile.
+
+=== Alexander-8 ===
+
+2002-06-06  Darin Adler  <darin@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Update warning flags for compatibility
+	with new C++.
+
+2002-06-05  Darin Adler  <darin@apple.com>
+
+	Fix problem seen as build failure on Jersey.
+
+	* Makefile.am: JavaScriptCore-stamp needs to be a dependency, not a
+	source file, because it doesn't have a corresponding object file.
+	Making it a dependency causes things to compile in the right order.
+
+2002-06-04  Darin Adler  <darin@apple.com>
+
+	Improve the speed of the JavaScript string append operation by growing
+	the capacity so we don't need to reallocate the string every time.
+
+	Also fix script execution so it doesn't use recursion to advance from
+	one statement to the next, using iteration instead.
+
+	* Makefile.am: Stop using BUILT_SOURCES to build JavaScriptCore-stamp,
+	because this causes the Project Builder project to build *before* the
+	subdir. Intead, use an all-am rule in a way more similar to all our
+	other directories.
+
+	* kjs/grammar.y: Link the SourceElementsNode in the opposite direction,
+	so we can walk the list and execute each element instead of using
+	recursion to reverse the list.
+	* kjs/grammar.cpp: Check in new generated file.
+
+	* kjs/nodes.cpp:
+	(SourceElementsNode::execute):
+	(SourceElementsNode::processFuncDecl):
+	(SourceElementsNode::processVarDecls):
+	Use loops instead of recursion.
+
+	* kjs/ustring.h: Don't initialize all UChar objects to 0. This was
+	wasting a *huge* amount of time.
+	* kjs/ustring.cpp:
+	(UString::Rep::create): Add a "capacity" along with the length.
+	(UString::append): Include 50% extra capacity when appending.
+	(UString::operator=): Reuse the buffer if possible rather than
+	always creating a new one.
+
+2002-06-02  Darin Adler  <darin@apple.com>
+
+	* COPYING.LIB: Fix line endings. It was using CRs.
+
+2002-05-31  Darin Adler  <darin@apple.com>
+
+	* Makefile.am:
+	* kjs/Makefile.am:
+	Slight improvements to rules that touch stamp files.
+
+2002-05-28  Maciej Stachowiak  <mjs@apple.com>
+
+	* THANKS: Demangled.
+
+=== Alexander-7 ===
+
+2002-05-24  Maciej Stachowiak  <mjs@apple.com>
+
+	Added license and acknowledgements.
+
+	* AUTHORS: Added.
+	* COPYING.LIB: Added.
+	* THANKS: Added.
+
+=== 0.3 ===
+
+=== Alexander-6 ===
+
+=== Alexander-5 ===
+
+=== Alexander-4 ===
+
+=== JavaScriptCore-5 ===
+
+2002-05-21  Maciej Stachowiak  <mjs@apple.com>
+
+	Reviewed by: Richard Williamson
+
+	Fixed Radar 2928775 - Sherlock crashes sitting in stocks channel
+
+	* kjs/internal.cpp:
+	(InterpreterImp::InterpreterImp): Set the interp pointer earlier,
+	in case garbage collection takes place while creating the global
+	values.
+
+2002-05-15  Darin Adler  <darin@apple.com>
+
+	Reviewed by: Maciej Stachowiak
+	
+	* Makefile.am:
+	Use all-am and clean-am instead of all and clean because it's better and
+	to make "make check" at the top level work right.
+
+2002-05-13  Darin Adler  <darin@apple.com>
+
+	Reviewed by: Maciej Stachowiak
+
+	* kjs/value.h: Fix comment typos.
+
+=== JavaScriptCore-4 ===
+
+2002-05-10  Maciej Stachowiak  <mjs@apple.com>
+
+	Reviewed by: Ken Kocienda and Darin Adler
+
+	Fixed the following bug:
+
+	Radar 2890573 - JavaScriptCore needs to be thread-safe
+
+	Actually this is only a weak form of thread-safety - you can safely
+	use different interpreters from different threads at the same
+	time. If you try to use a single interpreter object from multiple
+	threads, you need to provide your own locking.
+
+	* kjs/collector.h, kjs/collector.cpp:
+	(Collector::lock, Collector::unlock): Trivial implementation of a
+	recursive mutex.
+	(Collector::allocate): Lock around the body of this function.
+	(Collector::collect): Likewise.
+	(Collector::finalCheck): Likewise.
+	(Collector::numInterpreters): Likewise.
+	(Collector::numGCNotAllowedObjects): Likewise.
+	(Collector::numReferencedObjects): Likewise.
+	* kjs/internal.cpp:
+	(Parser::parse): use a mutex to lock around the whole parse, since
+	it uses a bunch of global state.
+	(InterpreterImp::InterpreterImp): Grab the Collector lock here,
+	both the mutually exclude calls to the body of this function, and
+	to protect the s_hook static member which the collector pokes at.
+	(InterpreterImp::clear): Likewise.
+	* kjs/ustring.cpp:
+	(statBufferKeyCleanup, statBufferKeyInit, UString::ascii): Convert
+	use of static variable
+	* kjs/value.cpp:
+	(ValueImp::ValueImp, ValueImp::mark, ValueImp::marked,
+	ValueImp::setGcAllowed): Grab the GC lock around any flag changes.
+
+=== Alexander-3 ===
+
+2002-05-08  Darin Adler  <darin@apple.com>
+
+	* kjs/collector.h:
+	* kjs/collector.cpp:
+	(Collector::numInterpreters):
+	(Collector::numGCNotAllowedObjects):
+	(Collector::numReferencedObjects):
+	Add three new functions so we can see a bit more about leaking JavaScriptCore.
+
+2002-05-06  Darin Adler  <darin@apple.com>
+
+	* JavaScriptCorePrefix.h: Added.
+	* JavaScriptCore.pbproj/project.pbxproj: Use PFE precompiling.
+	Also switch from xNDEBUG to NDEBUG.
+
+=== Alexander 0.3c2 (v1) ===
+
+2002-04-18  Darin Adler  <darin@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Oops. Take out -Wstrict-prototypes, put back
+	-Wmissing-prototypes.
+
+2002-04-18  Darin Adler  <darin@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Take out -Wmissing-prototypes
+	because system headers are triggering it when we don't have
+	precompiled headers on.
+
+2002-04-18  Darin Adler  <darin@apple.com>
+
+	Reviewed by Maciej
+
+	* JavaScriptCore.pbproj/project.pbxproj: Turn on gcc3 and the same set of warnings
+	as in the rest of Labyrinth (see top level ChangeLog for details).
+
+2002-04-17  Maciej Stachowiak  <mjs@apple.com>
+
+	Reviewed by: Darin Adler  <darin@apple.com>
+
+	* kjs/testkjs.cpp: Don't include <iostream.h> to avoid gcc3
+	warning.
+
+2002-04-15  Darin Adler  <darin@apple.com>
+
+	Reviwed by: Maciej Stachowiak  <mjs@apple.com>
+
+	* kjs/internal.cpp:
+	* kjs/property_map.cpp:
+	* kjs/ustring.h:
+	Removed some unneeded <config.h> includes so we are more similar
+	to the real KDE sources.
+
+2002-04-15  Darin Adler  <darin@apple.com>
+
+	Reviwed by: Maciej Stachowiak  <mjs@apple.com>
+
+	Merged changes from KDE 3.0 final and did some build fixes.
+
+	* JavaScriptCore.pbproj/project.pbxproj: Added nodes2string.cpp.
+
+	* kjs/grammar.*: Regenerated.
+	* kjs/*.lut.h: Regenerated.
+
+2002-04-08  Darin Adler  <darin@apple.com>
+
+	Reviwed by: Maciej Stachowiak  <mjs@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Re-added -Wno-format-y2k.
+
+2002-04-04  Darin Adler  <darin@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Add an Unoptimized build
+	style: exactly like Development except without the -O.
+
+2002-04-03  Darin Adler  <darin@apple.com>
+
+	* kjs/Makefile.am: Gratuitous cleanup.
+
+2002-04-02  Darin Adler  <darin@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Update flags as I did for
+	WebFoundation.
+
+2002-04-02  Maciej Stachowiak  <mjs@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Pass -Wno-format-y2k so
+	the project builds with gcc3.
+	
+	* kjs/nodes.cpp: Avoid including an obsolete header to avoid
+	warning with gcc3.
+
+2002-04-02  Darin Adler  <darin@apple.com>
+
+	* kjs/property_map.cpp: (PropertyMap::~PropertyMap): Deallocate the
+        map by calling clear so we don't leak the entire map.
+
+2002-04-02  Darin Adler  <darin@apple.com>
+
+	* kjs/internal.cpp: (InterpreterImp::globalClear): Add code to
+        deallocate and null out emptyList, because once the last interpreter
+        is destroyed there's nothing to keep it from being garbage collected.
+
+2002-04-01  Darin Adler  <darin@apple.com>
+
+        Got rid of KWQDef.h because it's dangerous to have two files with
+        the same name and different contents.
+
+	* JavaScriptCore.pbproj/project.pbxproj:
+	* kjs/KWQDef.h: Removed.
+	* kjs/ustring.h: Defines unsigned int types inline now.
+
+2002-03-30  Maciej Stachowiak  <mjs@apple.com>
+
+	Fixed Radar 2891272 (JavaScript crashes loading quicktime.com and
+	apple.com)
+
+	* kjs/object.cpp: (ObjectImp::~ObjectImp): Don't call setGCAlloc
+	on object internals pointed to, because they may have already been
+	collected by the time this object is collected, and in that case
+	we would corrupt the malloc arena.
+
+	* Makefile.am: Make the stamp file depend on all the sources and
+	headers so the framework gets rebuilt properly.
+
+	* JavaScriptCore.pbproj/project.pbxproj: Some random numbers moved
+	around. No idea what I really changed.
+
+2002-03-30  Darin Adler  <darin@apple.com>
+
+	* kjs/grammar.y: Took out Id tag so we won't constantly need to
+        update grammar.cpp.
+	* kjs/grammar.cpp: Regenerated without Id tag.
+
+	* .cvsignore: Ignore some additional autogenerated files.
+	* kjs/.cvsignore: Ignore some additional autogenerated files.
+
+2002-03-30  Maciej Stachowiak  <mjs@apple.com>
+
+	* JavaScriptCore.pbproj/project.pbxproj: Install some of the
+	headers.
+
+2002-03-30  Maciej Stachowiak  <mjs@apple.com>
+
+	Converted JavaScriptCore to build with Project Builder, in
+	preparation for B&I submission.
+
+	* English.lproj/InfoPlist.strings: Added.
+	* JavaScriptCore.pbproj/.cvsignore: Added.
+	* JavaScriptCore.pbproj/project.pbxproj: Added.
+	
+	* .cvsignore: Update the set of ignored things.
+
+	* Makefile.am: Hand off to PB for the main build, but still handle
+	the generated files and the test program.
+
+	* kjs/Makefile.am: Don't build anything except the generated
+	source files.
+
+	* kjs/KWQDef.h, kjs/config.h: Added minimal versions of these
+	files to get kjs to build.
+
+	Check in all the genrated files, since Project Builder isn't up to
+	the task of handling built sources:
+	
+	* kjs/array_object.lut.h: Added.
+	* kjs/date_object.lut.h: Added.
+	* kjs/grammar.cpp: Added.
+	* kjs/grammar.cpp.h: Added.
+	* kjs/grammar.h: Added.
+	* kjs/lexer.lut.h: Added.
+	* kjs/math_object.lut.h: Added.
+	* kjs/number_object.lut.h: Added.
+	* kjs/string_object.lut.h: Added.
+
+	* kjs/.cvsignore: Update set of ignored things.
+
+2002-03-28  Maciej Stachowiak  <mjs@apple.com>
+
+	* kjs/kjs-test.chk: Update output for new test results.
+
+2002-03-26  Maciej Stachowiak  <mjs@apple.com>
+
+	Set up kjs to build by itself into libJavaScriptCore.dylib.
+	
+	* .cvsignore: Added.
+	* Makefile.am: Added.
+	* dummy.cpp: Added.
+	* kjs/.cvsignore: Added.