[webkit-changes] cvs commit: WebCore/khtml/ecma kjs_binding.cpp kjs_events.cpp kjs_proxy.cpp

Adele adele at opensource.apple.com
Thu Jul 14 10:33:37 PDT 2005


adele       05/07/14 10:33:36

  Modified:    .        Tag: gcc-4-0-branch ChangeLog
               JavaScriptCore.pbproj Tag: gcc-4-0-branch project.pbxproj
               kjs      Tag: gcc-4-0-branch collector.cpp context.h
                        identifier.cpp internal.cpp internal.h list.cpp
                        list.h lookup.cpp nodes.cpp nodes.h operations.cpp
                        operations.h property_map.cpp protected_values.h
                        reference.cpp reference.h scope_chain.h
                        simple_number.h string_object.cpp ustring.cpp
                        ustring.h value.cpp value.h
               tests/mozilla Tag: gcc-4-0-branch expected.html
               .        Tag: gcc-4-0-branch ChangeLog
               khtml/ecma Tag: gcc-4-0-branch kjs_binding.cpp
                        kjs_events.cpp kjs_proxy.cpp
  Log:
  JavaScriptCore:
  
          Merged changes from TOT.
  
      2005-04-22  Darin Adler  <darin at apple.com>
  
          Reviewed by Maciej.
  
          * kjs/ustring.cpp: (KJS::UString::UTF8String): Fix off-by-one error in surrogate pair logic.
  
      2005-04-22  Darin Adler  <darin at apple.com>
  
          Reviewed by John.
  
          - fixed <rdar://problem/4090046> JavaScript throw statement causes parse error when no semicolon is present
  
          * kjs/grammar.y: Added an additional rule for throw like the ones we have for all the other semicolon rules.
          Not sure why we missed this one earlier.
  
          * kjs/grammar.cpp: Regenerated.
  
      2005-04-20  Darin Adler  <darin at apple.com>
  
          Reviewed by Maciej.
  
          - speedups, total 12% on JavaScript iBench
  
          I ran the benchmark under Shark and followed its advice a lot, mainly.
  
          * kjs/collector.cpp:
          (KJS::Collector::allocate): Take out special case for 0; costing speed but unexercised.
          Use numLiveObjectsAtLastCollect instead of numAllocationsSinceLastCollect so we don't
          have to bump it each time we call allocate. Put numLiveObjects into a local variable to
          cut down on global variable accesses. Make "next" cell pointer be a byte offset rather
          than a pointer so we don't need a special case for NULL. Allow freeList to point to some
          bogus item when the entire block is full rather than going out of our way to make it
          point to NULL.
          (KJS::Collector::markProtectedObjects): Get table size and pointer into locals outside
          the loop to avoid re-loading them over and over again.
          (KJS::Collector::collect): Put numLiveObjects into a local variable to cut down on global
          variable accesses. Make "next" cell pointer be a byte offset as above. Put numLiveObjects
          into a local variable to cut down on global variable accesses. Set numLiveObjectsAtLastCollect
          rather than numAllocationsSinceLastCollect.
          (KJS::Collector::numReferencedObjects): Get table size and pointer into locals outside
          the loop to avoid re-loading them over and over again.
          (KJS::Collector::rootObjectClasses): Ditto.
  
          * kjs/internal.h: Make Value be a friend of NumberImp so it can construct number objects
          directly, avoiding the conversion from Number to Value.
  
          * kjs/internal.cpp: (StringImp::toObject): Don't use Object::dynamicCast, because we know
          the thing is an object and we don't want to do all the extra work; just cast directly.
  
          * kjs/list.cpp: (KJS::List::List): Construct valueRefCount in a way that avoids the need for
          a branch -- in the hot case this just meant avoiding checking a variable we just set to false.
  
          * kjs/lookup.cpp: (keysMatch): Marked this inline.
  
          * kjs/nodes.cpp: Disabled KJS_BREAKPOINT, to avoid calling hitStatement all the time.
          (BooleanNode::evaluate): Make a Value directly, rather than making a Boolean which is converted
          into a Value.
          (NumberNode::evaluate): Ditto.
          (StringNode::evaluate): Ditto.
          (ArrayNode::evaluate): Ditto.
          (FunctionCallNode::evaluate): Use new inline baseIfMutable to avoid unnecessary getBase function.
          Also just use a pointer for func, rather than an Object.
          (PostfixNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
          passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
          integer and back.
          (DeleteNode::evaluate): Make a Value directly.
          (TypeOfNode::evaluate): Use new inline baseIfMutable and make Value directly.
          (PrefixNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
          passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
          integer and back.
          (UnaryPlusNode::evaluate): Make a Value directly.
          (NegateNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
          passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
          integer and back.
          (BitwiseNotNode::evaluate): Make a Value directly.
          (LogicalNotNode::evaluate): Ditto.
          (ShiftNode::evaluate): Don't convert to a double before making a Value.
          (RelationalNode::evaluate): Make a Value directly.
          (EqualNode::evaluate): Ditto.
          (BitOperNode::evaluate): Ditto.
          (AssignNode::evaluate): Make a Value directly. Change code so that it passes a "known to be integer"
          boolean in, often avoiding a conversion from floating point to integer and back.
          (VarDeclNode::evaluate): Make a Value directly.
          (ForNode::execute): Remove unused local variable.
  
          * kjs/operations.h:
          (KJS::isNaN): Inlined.
          (KJS::isInf): Ditto.
          (KJS::isPosInf): Ditto.
          (KJS::isNegInf): Ditto.
  
          * kjs/operations.cpp: Change isNaN, isInf, isPosInf, and isNegInf to be inlines.
          (KJS::equal): Rewrite to avoid creating values and recursing back into the function.
          (KJS::relation): Rearranged code so that we don't need explicit isNaN checks.
          (KJS::add): Changed code to make Value directly, and so that it passes a "known to be integer"
          boolean in, often avoiding a conversion from floating point to integer and back.
          (KJS::mult): Ditto.
  
          * kjs/property_map.cpp:
          (KJS::PropertyMap::~PropertyMap): Get size and entries pointer outside loop to avoid
          re-getting them inside the loop.
          (KJS::PropertyMap::clear): Ditto. Clear value pointer in addition to key, so we can just
          look at the value pointer in the mark function.
          (KJS::PropertyMap::get): Get sizeMask and entries pointer outside loop to avoid
          re-getting them inside the loop.
          (KJS::PropertyMap::put): Ditto.
          (KJS::PropertyMap::insert): Ditto.
          (KJS::PropertyMap::remove): Ditto.
          (KJS::PropertyMap::mark): Get size and entries pointer outside loop to avoid
          re-getting them inside the loop. Don't bother checking key for 0, since we already have
          to check value for 0. (Also had to change clear() to set value to 0.)
          (KJS::PropertyMap::addEnumerablesToReferenceList): Get size and entries pointer outside
          loop to avoid re-getting them inside the loop.
          (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList): Ditto.
          (KJS::PropertyMap::save): Ditto.
  
          - other changes
  
          * kjs/protected_values.h: Remove unneeded class name qualifiers.
  
          * kjs/reference.h:
          (KJS::Reference::baseIfMutable): New inline function: replaces isMutable().
          (KJS::Reference::Reference): Inlined.
          * kjs/reference.cpp:
          (KJS::Reference::getValue): Rewrite to not use getBase.
          (KJS::Reference::putValue): Ditto.
          (KJS::Reference::deleteValue): Dittol
  
          * kjs/simple_number.h:
          (KJS::SimpleNumber::integerFits): Added. For use when the parameter is known to be integral.
  
          * kjs/string_object.cpp: (StringProtoFuncImp::call): Create the number without first converting
          to double in various cases that involve integers.
  
          * kjs/ustring.h:
          (KJS::UString::attach): Inlined.
          (KJS::UString::release): Inlined.
          * kjs/ustring.cpp:
          (KJS::UString::find): Get first character outside the loop instead of re-fetching it each time.
  
          * kjs/value.cpp:
          (Value::Value): Added overloads for all the various specific types of values, so you don't have
          to convert from, say, Number to Value, just to create one.
          (Number::Number): Added an overload that takes a boolean to indicate the number is already
          known to be an integer.
  
          * kjs/value.h: Added more Value constructors, added a version of toNumber that returns
          a boolean to indicate if the number is known to be an integer (because it was a "simple number").
          (KJS::ValueImp::marked): Inlined.
          (KJS::ValueImp::dispatchType): Inlined.
          (KJS::ValueImp::dispatchToPrimitive): Inlined.
          (KJS::ValueImp::dispatchToBoolean): Inlined.
          (KJS::ValueImp::dispatchToNumber): Inlined.
          (KJS::ValueImp::dispatchToString): Inlined.
          (KJS::ValueImp::dispatchToUInt32): Inlined.
  
      2005-04-14  Maciej Stachowiak  <mjs at apple.com>
  
          - make fast_malloc.h a private header, not project
  
          * JavaScriptCore.pbproj/project.pbxproj:
  
      2005-04-12  Maciej Stachowiak  <mjs at apple.com>
  
          Reviewed by Richard.
  
  	<rdar://problem/4089734> JavaScript iBench can be sped up ~10% with custom allocator
  
  	- use custom single-threaded malloc for all non-GC JavaScriptCore
  	allocations, for a 9.1% speedup on JavaScript iBench
  
          * JavaScriptCore.pbproj/project.pbxproj:
          * kjs/collector.cpp:
          (KJS::Collector::allocate): Use dlmalloc to allocate the collector blocks.
          (KJS::Collector::collect): And dlfree to free it.
          * kjs/fast_malloc.cpp: Added, just the standard dlmalloc here.
          * kjs/fast_malloc.h: Added. Declarations for the functions. Also added a handy
  	macro to give a class custom operator new/delete
          * kjs/identifier.cpp:
          (KJS::Identifier::add): Use dlmalloc/dlfree.
          * kjs/nodes.h: make nodes KJS_FAST_ALLOCATED.
          * kjs/property_map.cpp:
          (KJS::PropertyMap::~PropertyMap): Use dlmalloc/dlfree.
          (KJS::PropertyMap::rehash): ditto
          * kjs/scope_chain.h:
          * kjs/ustring.cpp:
          (KJS::UString::Rep::createCopying): New named constructor that copies a passed-in
  	buffer, to hide allocation details from webcore.
          (KJS::UString::UString): use createCopying when appropriate.
          (KJS::UString::Rep::destroy): Use dlmalloc/dlfree.
          (KJS::UString::expandedSize): likewise
          (KJS::UString::expandCapacity): likewise
          (KJS::UString::expandPreCapacity): likewise
          (KJS::UString::spliceSubstringsWithSeparators): likewise
          (KJS::UString::append): likewise
          (KJS::UString::operator=): likewise
          (KJS::UString::detach): likewise
          * kjs/ustring.h: make UString and UString::Rep KJS_FAST_ALLOCATED.
  
      2005-04-11  Maciej Stachowiak  <mjs at apple.com>
  
          Reviewed by John.
  
  	<rdar://problem/4086819> Avoid using protect count hash table so much for 5.6% JS iBench speedup
  
  	- Avoid using protected values hash for the two most common cases
  	- Bump up ListImp high water mark, new testing shows 508 ListImps are
  	created during JS iBench.
  
  	Net result is a 5.6% speedup on JavaScript iBench
  
          * kjs/collector.cpp:
          (KJS::Collector::collect): mark protected lists as appropriate.
          * kjs/context.h:
          * kjs/list.cpp:
          (KJS::ListImp::markValues): Moved implementation from List::markValues
          (KJS::List::markProtectedLists): Implemented - scan pool and overflow
  	list.
          (KJS::allocateListImp): link lists outside the pool into a separate
  	doubly linked list to be able to mark protected lists
          (KJS::deallocateListImp): do the corresponding delinking
          (KJS::List::derefValues): do nothing in conservative GC mode
          (KJS::List::refValues): do nothing in conservative GC mode
          (KJS::List::markValues): call ListImp version
          (KJS::List::append):
          * kjs/list.h:
  
  WebCore:
  
          Merged change from TOT.
  
      2005-04-12  Maciej Stachowiak  <mjs at apple.com>
  
          Reviewed by Richard.
  
  	- use custom single-threaded malloc for all non-GC JavaScriptCore
  	allocations, for a 9.1% speedup on JavaScript iBench
  
          * khtml/ecma/kjs_binding.cpp:
          (KJS::UString::UString):
          * khtml/ecma/kjs_events.cpp:
          (JSAbstractEventListener::handleEvent):
          * khtml/ecma/kjs_proxy.cpp:
          (KJSProxyImpl::evaluate):
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.677.8.3 +231 -0    JavaScriptCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/ChangeLog,v
  retrieving revision 1.677.8.2
  retrieving revision 1.677.8.3
  diff -u -r1.677.8.2 -r1.677.8.3
  --- ChangeLog	17 Jun 2005 21:51:37 -0000	1.677.8.2
  +++ ChangeLog	14 Jul 2005 17:33:21 -0000	1.677.8.3
  @@ -1,3 +1,234 @@
  +2005-07-14  Adele Peterson  <adele at apple.com>
  +
  +        Merged changes from TOT.
  +
  +    2005-04-22  Darin Adler  <darin at apple.com>
  +
  +        Reviewed by Maciej.
  +
  +        * kjs/ustring.cpp: (KJS::UString::UTF8String): Fix off-by-one error in surrogate pair logic.
  +
  +    2005-04-22  Darin Adler  <darin at apple.com>
  +
  +        Reviewed by John.
  +
  +        - fixed <rdar://problem/4090046> JavaScript throw statement causes parse error when no semicolon is present
  +
  +        * kjs/grammar.y: Added an additional rule for throw like the ones we have for all the other semicolon rules.
  +        Not sure why we missed this one earlier.
  +
  +        * kjs/grammar.cpp: Regenerated.
  +
  +    2005-04-20  Darin Adler  <darin at apple.com>
  +
  +        Reviewed by Maciej.
  +
  +        - speedups, total 12% on JavaScript iBench
  +
  +        I ran the benchmark under Shark and followed its advice a lot, mainly.
  +
  +        * kjs/collector.cpp:
  +        (KJS::Collector::allocate): Take out special case for 0; costing speed but unexercised.
  +        Use numLiveObjectsAtLastCollect instead of numAllocationsSinceLastCollect so we don't
  +        have to bump it each time we call allocate. Put numLiveObjects into a local variable to
  +        cut down on global variable accesses. Make "next" cell pointer be a byte offset rather
  +        than a pointer so we don't need a special case for NULL. Allow freeList to point to some
  +        bogus item when the entire block is full rather than going out of our way to make it
  +        point to NULL.
  +        (KJS::Collector::markProtectedObjects): Get table size and pointer into locals outside
  +        the loop to avoid re-loading them over and over again.
  +        (KJS::Collector::collect): Put numLiveObjects into a local variable to cut down on global
  +        variable accesses. Make "next" cell pointer be a byte offset as above. Put numLiveObjects
  +        into a local variable to cut down on global variable accesses. Set numLiveObjectsAtLastCollect
  +        rather than numAllocationsSinceLastCollect.
  +        (KJS::Collector::numReferencedObjects): Get table size and pointer into locals outside
  +        the loop to avoid re-loading them over and over again.
  +        (KJS::Collector::rootObjectClasses): Ditto.
  +
  +        * kjs/internal.h: Make Value be a friend of NumberImp so it can construct number objects
  +        directly, avoiding the conversion from Number to Value.
  +
  +        * kjs/internal.cpp: (StringImp::toObject): Don't use Object::dynamicCast, because we know
  +        the thing is an object and we don't want to do all the extra work; just cast directly.
  +
  +        * kjs/list.cpp: (KJS::List::List): Construct valueRefCount in a way that avoids the need for
  +        a branch -- in the hot case this just meant avoiding checking a variable we just set to false.
  +
  +        * kjs/lookup.cpp: (keysMatch): Marked this inline.
  +
  +        * kjs/nodes.cpp: Disabled KJS_BREAKPOINT, to avoid calling hitStatement all the time.
  +        (BooleanNode::evaluate): Make a Value directly, rather than making a Boolean which is converted
  +        into a Value.
  +        (NumberNode::evaluate): Ditto.
  +        (StringNode::evaluate): Ditto.
  +        (ArrayNode::evaluate): Ditto.
  +        (FunctionCallNode::evaluate): Use new inline baseIfMutable to avoid unnecessary getBase function.
  +        Also just use a pointer for func, rather than an Object.
  +        (PostfixNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
  +        passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
  +        integer and back.
  +        (DeleteNode::evaluate): Make a Value directly.
  +        (TypeOfNode::evaluate): Use new inline baseIfMutable and make Value directly.
  +        (PrefixNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
  +        passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
  +        integer and back.
  +        (UnaryPlusNode::evaluate): Make a Value directly.
  +        (NegateNode::evaluate): Change code so that it doesn't make an excess Number, and so that it
  +        passes a "known to be integer" boolean in, often avoiding a conversion from floating point to
  +        integer and back.
  +        (BitwiseNotNode::evaluate): Make a Value directly.
  +        (LogicalNotNode::evaluate): Ditto.
  +        (ShiftNode::evaluate): Don't convert to a double before making a Value.
  +        (RelationalNode::evaluate): Make a Value directly.
  +        (EqualNode::evaluate): Ditto.
  +        (BitOperNode::evaluate): Ditto.
  +        (AssignNode::evaluate): Make a Value directly. Change code so that it passes a "known to be integer"
  +        boolean in, often avoiding a conversion from floating point to integer and back.
  +        (VarDeclNode::evaluate): Make a Value directly.
  +        (ForNode::execute): Remove unused local variable.
  +
  +        * kjs/operations.h:
  +        (KJS::isNaN): Inlined.
  +        (KJS::isInf): Ditto.
  +        (KJS::isPosInf): Ditto.
  +        (KJS::isNegInf): Ditto.
  +
  +        * kjs/operations.cpp: Change isNaN, isInf, isPosInf, and isNegInf to be inlines.
  +        (KJS::equal): Rewrite to avoid creating values and recursing back into the function.
  +        (KJS::relation): Rearranged code so that we don't need explicit isNaN checks.
  +        (KJS::add): Changed code to make Value directly, and so that it passes a "known to be integer"
  +        boolean in, often avoiding a conversion from floating point to integer and back.
  +        (KJS::mult): Ditto.
  +
  +        * kjs/property_map.cpp:
  +        (KJS::PropertyMap::~PropertyMap): Get size and entries pointer outside loop to avoid
  +        re-getting them inside the loop.
  +        (KJS::PropertyMap::clear): Ditto. Clear value pointer in addition to key, so we can just
  +        look at the value pointer in the mark function.
  +        (KJS::PropertyMap::get): Get sizeMask and entries pointer outside loop to avoid
  +        re-getting them inside the loop.
  +        (KJS::PropertyMap::put): Ditto.
  +        (KJS::PropertyMap::insert): Ditto.
  +        (KJS::PropertyMap::remove): Ditto.
  +        (KJS::PropertyMap::mark): Get size and entries pointer outside loop to avoid
  +        re-getting them inside the loop. Don't bother checking key for 0, since we already have
  +        to check value for 0. (Also had to change clear() to set value to 0.)
  +        (KJS::PropertyMap::addEnumerablesToReferenceList): Get size and entries pointer outside
  +        loop to avoid re-getting them inside the loop.
  +        (KJS::PropertyMap::addSparseArrayPropertiesToReferenceList): Ditto.
  +        (KJS::PropertyMap::save): Ditto.
  +
  +        - other changes
  +
  +        * kjs/protected_values.h: Remove unneeded class name qualifiers.
  +
  +        * kjs/reference.h:
  +        (KJS::Reference::baseIfMutable): New inline function: replaces isMutable().
  +        (KJS::Reference::Reference): Inlined.
  +        * kjs/reference.cpp:
  +        (KJS::Reference::getValue): Rewrite to not use getBase.
  +        (KJS::Reference::putValue): Ditto.
  +        (KJS::Reference::deleteValue): Dittol
  +
  +        * kjs/simple_number.h:
  +        (KJS::SimpleNumber::integerFits): Added. For use when the parameter is known to be integral.
  +
  +        * kjs/string_object.cpp: (StringProtoFuncImp::call): Create the number without first converting
  +        to double in various cases that involve integers.
  +
  +        * kjs/ustring.h:
  +        (KJS::UString::attach): Inlined.
  +        (KJS::UString::release): Inlined.
  +        * kjs/ustring.cpp:
  +        (KJS::UString::find): Get first character outside the loop instead of re-fetching it each time.
  +
  +        * kjs/value.cpp:
  +        (Value::Value): Added overloads for all the various specific types of values, so you don't have
  +        to convert from, say, Number to Value, just to create one.
  +        (Number::Number): Added an overload that takes a boolean to indicate the number is already
  +        known to be an integer.
  +
  +        * kjs/value.h: Added more Value constructors, added a version of toNumber that returns
  +        a boolean to indicate if the number is known to be an integer (because it was a "simple number").
  +        (KJS::ValueImp::marked): Inlined.
  +        (KJS::ValueImp::dispatchType): Inlined.
  +        (KJS::ValueImp::dispatchToPrimitive): Inlined.
  +        (KJS::ValueImp::dispatchToBoolean): Inlined.
  +        (KJS::ValueImp::dispatchToNumber): Inlined.
  +        (KJS::ValueImp::dispatchToString): Inlined.
  +        (KJS::ValueImp::dispatchToUInt32): Inlined.
  +
  +    2005-04-14  Maciej Stachowiak  <mjs at apple.com>
  +
  +        - make fast_malloc.h a private header, not project
  +
  +        * JavaScriptCore.pbproj/project.pbxproj:
  +
  +    2005-04-12  Maciej Stachowiak  <mjs at apple.com>
  +
  +        Reviewed by Richard.
  +
  +	<rdar://problem/4089734> JavaScript iBench can be sped up ~10% with custom allocator
  +
  +	- use custom single-threaded malloc for all non-GC JavaScriptCore
  +	allocations, for a 9.1% speedup on JavaScript iBench
  +	
  +        * JavaScriptCore.pbproj/project.pbxproj:
  +        * kjs/collector.cpp:
  +        (KJS::Collector::allocate): Use dlmalloc to allocate the collector blocks.
  +        (KJS::Collector::collect): And dlfree to free it.
  +        * kjs/fast_malloc.cpp: Added, just the standard dlmalloc here.
  +        * kjs/fast_malloc.h: Added. Declarations for the functions. Also added a handy
  +	macro to give a class custom operator new/delete
  +        * kjs/identifier.cpp:
  +        (KJS::Identifier::add): Use dlmalloc/dlfree.
  +        * kjs/nodes.h: make nodes KJS_FAST_ALLOCATED.
  +        * kjs/property_map.cpp:
  +        (KJS::PropertyMap::~PropertyMap): Use dlmalloc/dlfree.
  +        (KJS::PropertyMap::rehash): ditto
  +        * kjs/scope_chain.h:
  +        * kjs/ustring.cpp:
  +        (KJS::UString::Rep::createCopying): New named constructor that copies a passed-in
  +	buffer, to hide allocation details from webcore.
  +        (KJS::UString::UString): use createCopying when appropriate.
  +        (KJS::UString::Rep::destroy): Use dlmalloc/dlfree.
  +        (KJS::UString::expandedSize): likewise
  +        (KJS::UString::expandCapacity): likewise
  +        (KJS::UString::expandPreCapacity): likewise
  +        (KJS::UString::spliceSubstringsWithSeparators): likewise
  +        (KJS::UString::append): likewise
  +        (KJS::UString::operator=): likewise
  +        (KJS::UString::detach): likewise
  +        * kjs/ustring.h: make UString and UString::Rep KJS_FAST_ALLOCATED.
  +
  +    2005-04-11  Maciej Stachowiak  <mjs at apple.com>
  +
  +        Reviewed by John.
  +
  +	<rdar://problem/4086819> Avoid using protect count hash table so much for 5.6% JS iBench speedup
  +
  +	- Avoid using protected values hash for the two most common cases
  +	- Bump up ListImp high water mark, new testing shows 508 ListImps are
  +	created during JS iBench.
  +
  +	Net result is a 5.6% speedup on JavaScript iBench
  +	
  +        * kjs/collector.cpp:
  +        (KJS::Collector::collect): mark protected lists as appropriate.
  +        * kjs/context.h:
  +        * kjs/list.cpp:
  +        (KJS::ListImp::markValues): Moved implementation from List::markValues
  +        (KJS::List::markProtectedLists): Implemented - scan pool and overflow
  +	list.
  +        (KJS::allocateListImp): link lists outside the pool into a separate
  +	doubly linked list to be able to mark protected lists
  +        (KJS::deallocateListImp): do the corresponding delinking
  +        (KJS::List::derefValues): do nothing in conservative GC mode
  +        (KJS::List::refValues): do nothing in conservative GC mode
  +        (KJS::List::markValues): call ListImp version
  +        (KJS::List::append):
  +        * kjs/list.h:
  +
   === Safari-412.0.1 ===
   
   2005-05-24  Darin Adler  <darin at apple.com>
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.415.4.3 +35 -0     JavaScriptCore/JavaScriptCore.pbproj/project.pbxproj
  
  Index: project.pbxproj
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/JavaScriptCore.pbproj/project.pbxproj,v
  retrieving revision 1.415.4.2
  retrieving revision 1.415.4.3
  diff -u -r1.415.4.2 -r1.415.4.3
  --- project.pbxproj	17 Jun 2005 21:51:38 -0000	1.415.4.2
  +++ project.pbxproj	14 Jul 2005 17:33:22 -0000	1.415.4.3
  @@ -267,6 +267,7 @@
   				51CA3B5006CC2166005600E3,
   				51DFF2CA06CC36F6006F1ECC,
   				84ABF1DF070B628C00A3AC05,
  +				651BDC7A080F10CC00F10856,
   			);
   			isa = PBXHeadersBuildPhase;
   			runOnlyForDeploymentPostprocessing = 0;
  @@ -344,6 +345,7 @@
   				51863FC506542D3100E9E8DD,
   				517EF37406D695930007C1BA,
   				8442A378074175C2000AE2ED,
  +				651BDC79080F10CC00F10856,
   			);
   			isa = PBXSourcesBuildPhase;
   			runOnlyForDeploymentPostprocessing = 0;
  @@ -1369,6 +1371,37 @@
   				);
   			};
   		};
  +		651BDC77080F10CC00F10856 = {
  +			fileEncoding = 30;
  +			isa = PBXFileReference;
  +			lastKnownFileType = sourcecode.cpp.cpp;
  +			path = fast_malloc.cpp;
  +			refType = 4;
  +			sourceTree = "<group>";
  +		};
  +		651BDC78080F10CC00F10856 = {
  +			fileEncoding = 30;
  +			isa = PBXFileReference;
  +			lastKnownFileType = sourcecode.c.h;
  +			path = fast_malloc.h;
  +			refType = 4;
  +			sourceTree = "<group>";
  +		};
  +		651BDC79080F10CC00F10856 = {
  +			fileRef = 651BDC77080F10CC00F10856;
  +			isa = PBXBuildFile;
  +			settings = {
  +			};
  +		};
  +		651BDC7A080F10CC00F10856 = {
  +			fileRef = 651BDC78080F10CC00F10856;
  +			isa = PBXBuildFile;
  +			settings = {
  +				ATTRIBUTES = (
  +					Private,
  +				);
  +			};
  +		};
   		651F6412039D5B5F0078395C = {
   			fileEncoding = 30;
   			isa = PBXFileReference;
  @@ -2112,6 +2145,8 @@
   		};
   		F5C290E50284F960018635CA = {
   			children = (
  +				651BDC77080F10CC00F10856,
  +				651BDC78080F10CC00F10856,
   				45E12D8806A49B0F00E9DF84,
   				F692A8540255597D01FF60F7,
   				F692A8C802555BA201FF60F7,
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.30.10.2 +52 -52    JavaScriptCore/kjs/collector.cpp
  
  Index: collector.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/collector.cpp,v
  retrieving revision 1.30.10.1
  retrieving revision 1.30.10.2
  diff -u -r1.30.10.1 -r1.30.10.2
  --- collector.cpp	25 May 2005 00:06:22 -0000	1.30.10.1
  +++ collector.cpp	14 Jul 2005 17:33:23 -0000	1.30.10.2
  @@ -21,19 +21,14 @@
   
   #include "collector.h"
   
  -#include "value.h"
  +#include "fast_malloc.h"
   #include "internal.h"
  +#include "list.h"
  +#include "value.h"
   
   #if APPLE_CHANGES
   #include <CoreFoundation/CoreFoundation.h>
   #include <cxxabi.h>
  -#endif
  -
  -#include <collector.h>
  -#include <value.h>
  -#include <internal.h>
  -
  -#if APPLE_CHANGES
   #include <pthread.h>
   #include <mach/mach_port.h>
   #include <mach/task.h>
  @@ -63,7 +58,7 @@
       double memory[CELL_ARRAY_LENGTH];
       struct {
         void *zeroIfFree;
  -      CollectorCell *next;
  +      ptrdiff_t next;
       } freeCell;
     } u;
   };
  @@ -86,7 +81,7 @@
     int usedOversizeCells;
   
     int numLiveObjects;
  -  int numAllocationsSinceLastCollect;
  +  int numLiveObjectsAtLastCollect;
   };
   
   static CollectorHeap heap = {NULL, 0, 0, 0, NULL, 0, 0, 0, 0};
  @@ -97,29 +92,29 @@
   {
     assert(Interpreter::lockCount() > 0);
   
  -  if (s == 0)
  -    return 0L;
  -  
     // collect if needed
  -  if (++heap.numAllocationsSinceLastCollect >= ALLOCATIONS_PER_COLLECTION) {
  +  int numLiveObjects = heap.numLiveObjects;
  +  if (numLiveObjects - heap.numLiveObjectsAtLastCollect >= ALLOCATIONS_PER_COLLECTION) {
       collect();
  +    numLiveObjects = heap.numLiveObjects;
     }
     
  -  if (s > (unsigned)CELL_SIZE) {
  +  if (s > static_cast<size_t>(CELL_SIZE)) {
       // oversize allocator
       if (heap.usedOversizeCells == heap.numOversizeCells) {
         heap.numOversizeCells = MAX(MIN_ARRAY_SIZE, heap.numOversizeCells * GROWTH_FACTOR);
  -      heap.oversizeCells = (CollectorCell **)realloc(heap.oversizeCells, heap.numOversizeCells * sizeof(CollectorCell *));
  +      heap.oversizeCells = (CollectorCell **)kjs_fast_realloc(heap.oversizeCells, heap.numOversizeCells * sizeof(CollectorCell *));
       }
       
  -    void *newCell = malloc(s);
  +    void *newCell = kjs_fast_malloc(s);
       heap.oversizeCells[heap.usedOversizeCells] = (CollectorCell *)newCell;
       heap.usedOversizeCells++;
  -    heap.numLiveObjects++;
  +    heap.numLiveObjects = numLiveObjects + 1;
   
   #if !USE_CONSERVATIVE_GC
       ((ValueImp *)(newCell))->_flags = 0;
   #endif
  +
       return newCell;
     }
     
  @@ -142,10 +137,10 @@
       
       if (heap.usedBlocks == heap.numBlocks) {
         heap.numBlocks = MAX(MIN_ARRAY_SIZE, heap.numBlocks * GROWTH_FACTOR);
  -      heap.blocks = (CollectorBlock **)realloc(heap.blocks, heap.numBlocks * sizeof(CollectorBlock *));
  +      heap.blocks = (CollectorBlock **)kjs_fast_realloc(heap.blocks, heap.numBlocks * sizeof(CollectorBlock *));
       }
       
  -    targetBlock = (CollectorBlock *)calloc(1, sizeof(CollectorBlock));
  +    targetBlock = (CollectorBlock *)kjs_fast_calloc(1, sizeof(CollectorBlock));
       targetBlock->freeList = targetBlock->cells;
       heap.blocks[heap.usedBlocks] = targetBlock;
       heap.usedBlocks++;
  @@ -154,23 +149,18 @@
     // find a free spot in the block and detach it from the free list
     CollectorCell *newCell = targetBlock->freeList;
   
  -  if (newCell->u.freeCell.next != NULL) {
  -    targetBlock->freeList = newCell->u.freeCell.next;
  -  } else if (targetBlock->usedCells == (CELLS_PER_BLOCK - 1)) {
  -    // last cell in this block
  -    targetBlock->freeList = NULL;
  -  } else {
  -    // all next pointers are initially 0, meaning "next cell"
  -    targetBlock->freeList = newCell + 1;
  -  }
  +  // "next" field is a byte offset -- 0 means next cell, so a zeroed block is already initialized
  +  // could avoid the casts by using a cell offset, but this avoids a relatively-slow multiply
  +  targetBlock->freeList = reinterpret_cast<CollectorCell *>(reinterpret_cast<char *>(newCell + 1) + newCell->u.freeCell.next);
   
     targetBlock->usedCells++;
  -  heap.numLiveObjects++;
  +  heap.numLiveObjects = numLiveObjects + 1;
   
   #if !USE_CONSERVATIVE_GC
     ((ValueImp *)(newCell))->_flags = 0;
   #endif
  -  return (void *)(newCell);
  +
  +  return newCell;
   }
   
   #if TEST_CONSERVATIVE_GC || USE_CONSERVATIVE_GC
  @@ -340,8 +330,10 @@
   
   void Collector::markProtectedObjects()
   {
  -  for (int i = 0; i < ProtectedValues::_tableSize; i++) {
  -    ValueImp *val = ProtectedValues::_table[i].key;
  +  int size = ProtectedValues::_tableSize;
  +  ProtectedValues::KeyValue *table = ProtectedValues::_table;
  +  for (int i = 0; i < size; i++) {
  +    ValueImp *val = table[i].key;
       if (val && !val->marked()) {
         val->mark();
       }
  @@ -373,6 +365,7 @@
   
     markStackObjectsConservatively();
     markProtectedObjects();
  +  List::markProtectedLists();
   #endif
   
   #if TEST_CONSERVATIVE_GC
  @@ -429,20 +422,22 @@
     // SWEEP: delete everything with a zero refcount (garbage) and unmark everything else
     
     int emptyBlocks = 0;
  +  int numLiveObjects = heap.numLiveObjects;
   
     for (int block = 0; block < heap.usedBlocks; block++) {
       CollectorBlock *curBlock = heap.blocks[block];
   
       int minimumCellsToProcess = curBlock->usedCells;
   
  -    for (int cell = 0; cell < CELLS_PER_BLOCK; cell++) {
  -      if (minimumCellsToProcess < cell) {
  +    for (int i = 0; i < CELLS_PER_BLOCK; i++) {
  +      if (minimumCellsToProcess < i) {
   	goto skip_block_sweep;
         }
   
  -      ValueImp *imp = (ValueImp *)(curBlock->cells + cell);
  +      CollectorCell *cell = curBlock->cells + i;
  +      ValueImp *imp = reinterpret_cast<ValueImp *>(cell);
   
  -      if (((CollectorCell *)imp)->u.freeCell.zeroIfFree != 0) {
  +      if (cell->u.freeCell.zeroIfFree != 0) {
   #if USE_CONSERVATIVE_GC
   	if (!imp->_marked)
   #else
  @@ -453,13 +448,13 @@
   	  // emulate destructing part of 'operator delete()'
   	  imp->~ValueImp();
   	  curBlock->usedCells--;
  -	  heap.numLiveObjects--;
  +	  numLiveObjects--;
   	  deleted = true;
   
   	  // put it on the free list
  -	  ((CollectorCell *)imp)->u.freeCell.zeroIfFree = 0;
  -	  ((CollectorCell *)imp)->u.freeCell.next = curBlock->freeList;
  -	  curBlock->freeList = (CollectorCell *)imp;
  +	  cell->u.freeCell.zeroIfFree = 0;
  +	  cell->u.freeCell.next = reinterpret_cast<char *>(curBlock->freeList) - reinterpret_cast<char *>(cell + 1);
  +	  curBlock->freeList = cell;
   
   	} else {
   #if USE_CONSERVATIVE_GC
  @@ -481,7 +476,7 @@
         emptyBlocks++;
         if (emptyBlocks > SPARE_EMPTY_BLOCKS) {
   #if !DEBUG_COLLECTOR
  -	free(heap.blocks[block]);
  +	kjs_fast_free(heap.blocks[block]);
   #endif
   	// swap with the last block so we compact as we go
   	heap.blocks[block] = heap.blocks[heap.usedBlocks - 1];
  @@ -490,7 +485,7 @@
   
   	if (heap.numBlocks > MIN_ARRAY_SIZE && heap.usedBlocks < heap.numBlocks / LOW_WATER_FACTOR) {
   	  heap.numBlocks = heap.numBlocks / GROWTH_FACTOR; 
  -	  heap.blocks = (CollectorBlock **)realloc(heap.blocks, heap.numBlocks * sizeof(CollectorBlock *));
  +	  heap.blocks = (CollectorBlock **)kjs_fast_realloc(heap.blocks, heap.numBlocks * sizeof(CollectorBlock *));
   	}
         } 
       }
  @@ -515,7 +510,7 @@
   #if DEBUG_COLLECTOR
         heap.oversizeCells[cell]->u.freeCell.zeroIfFree = 0;
   #else
  -      free((void *)imp);
  +      kjs_fast_free((void *)imp);
   #endif
   
         // swap with the last oversize cell so we compact as we go
  @@ -523,11 +518,11 @@
   
         heap.usedOversizeCells--;
         deleted = true;
  -      heap.numLiveObjects--;
  +      numLiveObjects--;
   
         if (heap.numOversizeCells > MIN_ARRAY_SIZE && heap.usedOversizeCells < heap.numOversizeCells / LOW_WATER_FACTOR) {
   	heap.numOversizeCells = heap.numOversizeCells / GROWTH_FACTOR; 
  -	heap.oversizeCells = (CollectorCell **)realloc(heap.oversizeCells, heap.numOversizeCells * sizeof(CollectorCell *));
  +	heap.oversizeCells = (CollectorCell **)kjs_fast_realloc(heap.oversizeCells, heap.numOversizeCells * sizeof(CollectorCell *));
         }
   
       } else {
  @@ -542,9 +537,10 @@
       }
     }
     
  -  heap.numAllocationsSinceLastCollect = 0;
  +  heap.numLiveObjects = numLiveObjects;
  +  heap.numLiveObjectsAtLastCollect = numLiveObjects;
     
  -  memoryFull = (heap.numLiveObjects >= KJS_MEM_LIMIT);
  +  memoryFull = (numLiveObjects >= KJS_MEM_LIMIT);
   
     return deleted;
   }
  @@ -608,8 +604,10 @@
     int count = 0;
   
   #if USE_CONSERVATIVE_GC
  -  for (int i = 0; i < ProtectedValues::_tableSize; i++) {
  -    ValueImp *val = ProtectedValues::_table[i].key;
  +  int size = ProtectedValues::_tableSize;
  +  ProtectedValues::KeyValue *table = ProtectedValues::_table;
  +  for (int i = 0; i < size; i++) {
  +    ValueImp *val = table[i].key;
       if (val) {
         ++count;
       }
  @@ -646,8 +644,10 @@
     CFMutableSetRef classes = CFSetCreateMutable(NULL, 0, &kCFTypeSetCallBacks);
   
   #if USE_CONSERVATIVE_GC
  -  for (int i = 0; i < ProtectedValues::_tableSize; i++) {
  -    ValueImp *val = ProtectedValues::_table[i].key;
  +  int size = ProtectedValues::_tableSize;
  +  ProtectedValues::KeyValue *table = ProtectedValues::_table;
  +  for (int i = 0; i < size; i++) {
  +    ValueImp *val = table[i].key;
       if (val) {
         const char *mangled_name = typeid(*val).name();
         int status;
  
  
  
  1.8.16.1  +6 -3      JavaScriptCore/kjs/context.h
  
  Index: context.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/context.h,v
  retrieving revision 1.8
  retrieving revision 1.8.16.1
  diff -u -r1.8 -r1.8.16.1
  --- context.h	22 Apr 2004 16:53:35 -0000	1.8
  +++ context.h	14 Jul 2005 17:33:23 -0000	1.8.16.1
  @@ -59,11 +59,14 @@
       ContextImp *_callingContext;
       FunctionImp *_function;
       const List *_arguments;
  -    ProtectedObject activation;
  +    // because ContextImp is always allocated on the stack,
  +    // there is no need to protect various pointers from conservative
  +    // GC since they will be caught by the conservative sweep anyway!
  +    Object activation;
       
       ScopeChain scope;
  -    ProtectedObject variable;
  -    ProtectedObject thisVal;
  +    Object variable;
  +    Object thisVal;
   
       LabelStack ls;
       CodeType codeType;
  
  
  
  1.13.18.1 +4 -2      JavaScriptCore/kjs/identifier.cpp
  
  Index: identifier.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/identifier.cpp,v
  retrieving revision 1.13
  retrieving revision 1.13.18.1
  diff -u -r1.13 -r1.13.18.1
  --- identifier.cpp	14 Apr 2004 02:33:59 -0000	1.13
  +++ identifier.cpp	14 Jul 2005 17:33:23 -0000	1.13.18.1
  @@ -35,6 +35,8 @@
   
   #include "identifier.h"
   
  +#include "fast_malloc.h"
  +
   #define DUMP_STATISTICS 0
   
   namespace KJS {
  @@ -122,7 +124,7 @@
           i = (i + 1) & _tableSizeMask;
       }
       
  -    UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) * length));
  +    UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * length));
       for (int j = 0; j != length; j++)
           d[j] = c[j];
       
  @@ -161,7 +163,7 @@
           i = (i + 1) & _tableSizeMask;
       }
       
  -    UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) * length));
  +    UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * length));
       for (int j = 0; j != length; j++)
           d[j] = s[j];
       
  
  
  
  1.53.12.1 +1 -1      JavaScriptCore/kjs/internal.cpp
  
  Index: internal.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/internal.cpp,v
  retrieving revision 1.53
  retrieving revision 1.53.12.1
  diff -u -r1.53 -r1.53.12.1
  --- internal.cpp	23 Nov 2004 02:06:13 -0000	1.53
  +++ internal.cpp	14 Jul 2005 17:33:23 -0000	1.53.12.1
  @@ -225,7 +225,7 @@
   {
     List args;
     args.append(const_cast<StringImp*>(this));
  -  return Object::dynamicCast(exec->lexicalInterpreter()->builtinString().construct(exec,args));
  +  return Object(static_cast<ObjectImp *>(exec->lexicalInterpreter()->builtinString().construct(exec, args).imp()));
   }
   
   // ------------------------------ NumberImp ------------------------------------
  
  
  
  1.25.12.1 +1 -0      JavaScriptCore/kjs/internal.h
  
  Index: internal.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/internal.h,v
  retrieving revision 1.25
  retrieving revision 1.25.12.1
  diff -u -r1.25 -r1.25.12.1
  --- internal.h	5 Oct 2004 23:19:20 -0000	1.25
  +++ internal.h	14 Jul 2005 17:33:23 -0000	1.25.12.1
  @@ -120,6 +120,7 @@
     inline String::String(StringImp *imp) : Value(imp) { }
   
     class NumberImp : public ValueImp {
  +    friend class Value;
       friend class Number;
       friend class InterpreterImp;
     public:
  
  
  
  1.8.14.1  +76 -54    JavaScriptCore/kjs/list.cpp
  
  Index: list.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/list.cpp,v
  retrieving revision 1.8
  retrieving revision 1.8.14.1
  diff -u -r1.8 -r1.8.14.1
  --- list.cpp	6 May 2004 06:41:06 -0000	1.8
  +++ list.cpp	14 Jul 2005 17:33:23 -0000	1.8.14.1
  @@ -28,7 +28,7 @@
   namespace KJS {
   
   // tunable parameters
  -const int poolSize = 384;
  +const int poolSize = 512;
   const int inlineValuesSize = 4;
   
   
  @@ -42,14 +42,19 @@
       ValueImp **overflow;
   
       ListImp *nextInFreeList;
  +    ListImp *nextInOutsideList;
  +    ListImp *prevInOutsideList;
   
   #if DUMP_STATISTICS
       int sizeHighWaterMark;
   #endif
  +
  +    void markValues();
   };
   
   static ListImp pool[poolSize];
   static ListImp *poolFreeList;
  +static ListImp *outsidePoolList;
   static int poolUsed;
   
   #if DUMP_STATISTICS
  @@ -86,6 +91,49 @@
   
   #endif
   
  +
  +inline void ListImp::markValues()
  +{
  +    int inlineSize = MIN(size, inlineValuesSize);
  +    for (int i = 0; i != inlineSize; ++i) {
  +	if (!values[i]->marked()) {
  +	    values[i]->mark();
  +	}
  +    }
  +
  +    int overflowSize = size - inlineSize;
  +    for (int i = 0; i != overflowSize; ++i) {
  +	if (!overflow[i]->marked()) {
  +	    overflow[i]->mark();
  +	}
  +    }
  +}
  +
  +void List::markProtectedLists()
  +{
  +#if TEST_CONSERVATIVE_GC || USE_CONSERVATIVE_GC
  +    int seen = 0;
  +    for (int i = 0; i < poolSize; i++) {
  +        if (seen >= poolUsed)
  +            break;
  +
  +        if (pool[i].state == usedInPool) {
  +            seen++;
  +            if (pool[i].valueRefCount > 0) {
  +                pool[i].markValues();
  +            }
  +        }
  +    }
  +
  +    for (ListImp *l = outsidePoolList; l; l = l->nextInOutsideList) {
  +        if (l->valueRefCount > 0) {
  +            l->markValues();
  +        }
  +    }
  +#endif
  +}
  +
  +
   static inline ListImp *allocateListImp()
   {
       // Find a free one in the pool.
  @@ -99,6 +147,14 @@
       
       ListImp *imp = new ListImp;
       imp->state = usedOnHeap;
  +    // link into outside pool list
  +    if (outsidePoolList) {
  +        outsidePoolList->prevInOutsideList = imp;
  +    }
  +    imp->nextInOutsideList = outsidePoolList;
  +    imp->prevInOutsideList = NULL;
  +    outsidePoolList = imp;
  +
       return imp;
   }
   
  @@ -110,6 +166,19 @@
   	poolFreeList = imp;
   	poolUsed--;
       } else {
  +        // unlink from outside pool list
  +        if (!imp->prevInOutsideList) {
  +            outsidePoolList = imp->nextInOutsideList;
  +            if (outsidePoolList) {
  +                outsidePoolList->prevInOutsideList = NULL;
  +            }
  +        } else {
  +            imp->prevInOutsideList->nextInOutsideList = imp->nextInOutsideList;
  +            if (imp->nextInOutsideList) {
  +                imp->nextInOutsideList->prevInOutsideList = imp->prevInOutsideList;
  +            }
  +        }
  +
           delete imp;
       }
   }
  @@ -119,12 +188,9 @@
       ListImp *imp = static_cast<ListImp *>(_impBase);
       imp->size = 0;
       imp->refCount = 1;
  +    imp->valueRefCount = 1;
       imp->capacity = 0;
       imp->overflow = 0;
  -
  -    if (!_needsMarking) {
  -	imp->valueRefCount = 1;
  -    }
   #if DUMP_STATISTICS
       if (++numLists > numListsHighWaterMark)
           numListsHighWaterMark = numLists;
  @@ -137,13 +203,10 @@
       ListImp *imp = static_cast<ListImp *>(_impBase);
       imp->size = 0;
       imp->refCount = 1;
  +    imp->valueRefCount = !needsMarking;
       imp->capacity = 0;
       imp->overflow = 0;
   
  -    if (!_needsMarking) {
  -	imp->valueRefCount = 1;
  -    }
  -
   #if DUMP_STATISTICS
       if (++numLists > numListsHighWaterMark)
           numListsHighWaterMark = numLists;
  @@ -153,82 +216,44 @@
   
   void List::derefValues()
   {
  +#if !USE_CONSERVATIVE_GC
       ListImp *imp = static_cast<ListImp *>(_impBase);
       
       int size = imp->size;
       
       int inlineSize = MIN(size, inlineValuesSize);
  -#if !USE_CONSERVATIVE_GC
       for (int i = 0; i != inlineSize; ++i)
           imp->values[i]->deref();
  -#endif
   
  -#if USE_CONSERVATIVE_GC | TEST_CONSERVATIVE_GC
  -    for (int i = 0; i != inlineSize; ++i)
  -        gcUnprotect(imp->values[i]);
  -#endif
  -    
       int overflowSize = size - inlineSize;
       ValueImp **overflow = imp->overflow;
  -#if !USE_CONSERVATIVE_GC
  -    for (int i = 0; i != overflowSize; ++i)
  -        overflow[i]->deref();
  -#endif
   
  -#if USE_CONSERVATIVE_GC | TEST_CONSERVATIVE_GC
       for (int i = 0; i != overflowSize; ++i)
  -        gcUnprotect(overflow[i]);
  +        overflow[i]->deref();
   #endif
   }
   
   void List::refValues()
   {
  +#if !USE_CONSERVATIVE_GC
       ListImp *imp = static_cast<ListImp *>(_impBase);
       
       int size = imp->size;
       
       int inlineSize = MIN(size, inlineValuesSize);
  -#if !USE_CONSERVATIVE_GC
       for (int i = 0; i != inlineSize; ++i)
           imp->values[i]->ref();
  -#endif
  -#if USE_CONSERVATIVE_GC | TEST_CONSERVATIVE_GC
  -    for (int i = 0; i != inlineSize; ++i)
  -        gcProtect(imp->values[i]);
  -#endif
       
       int overflowSize = size - inlineSize;
       ValueImp **overflow = imp->overflow;
  -#if !USE_CONSERVATIVE_GC
       for (int i = 0; i != overflowSize; ++i)
           overflow[i]->ref();
   #endif
  -#if USE_CONSERVATIVE_GC | TEST_CONSERVATIVE_GC
  -    for (int i = 0; i != overflowSize; ++i)
  -        gcProtect(overflow[i]);
  -#endif
   }
   
   void List::markValues()
   {
  -    ListImp *imp = static_cast<ListImp *>(_impBase);
  -    
  -    int size = imp->size;
  -    
  -    int inlineSize = MIN(size, inlineValuesSize);
  -    for (int i = 0; i != inlineSize; ++i) {
  -	if (!imp->values[i]->marked()) {
  -	    imp->values[i]->mark();
  -	}
  -    }
  -
  -    int overflowSize = size - inlineSize;
  -    ValueImp **overflow = imp->overflow;
  -    for (int i = 0; i != overflowSize; ++i) {
  -	if (!overflow[i]->marked()) {
  -	    overflow[i]->mark();
  -	}
  -    }
  +    static_cast<ListImp *>(_impBase)->markValues();
   }
   
   void List::release()
  @@ -280,9 +305,6 @@
   #if !USE_CONSERVATIVE_GC
   	v->ref();
   #endif
  -#if USE_CONSERVATIVE_GC | TEST_CONSERVATIVE_GC
  -	gcProtect(v);
  -#endif
       }
       
       if (i < inlineValuesSize) {
  
  
  
  1.5.62.1  +2 -0      JavaScriptCore/kjs/list.h
  
  Index: list.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/list.h,v
  retrieving revision 1.5
  retrieving revision 1.5.62.1
  diff -u -r1.5 -r1.5.62.1
  --- list.h	22 Jan 2003 00:11:43 -0000	1.5
  +++ list.h	14 Jul 2005 17:33:23 -0000	1.5.62.1
  @@ -120,6 +120,8 @@
           static const List &empty();
           
   	void mark() { if (_impBase->valueRefCount == 0) markValues(); }
  +
  +        static void markProtectedLists();
       private:
           ListImpBase *_impBase;
   	bool _needsMarking;
  
  
  
  1.9.64.1  +1 -1      JavaScriptCore/kjs/lookup.cpp
  
  Index: lookup.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/lookup.cpp,v
  retrieving revision 1.9
  retrieving revision 1.9.64.1
  diff -u -r1.9 -r1.9.64.1
  --- lookup.cpp	22 Jan 2003 00:11:43 -0000	1.9
  +++ lookup.cpp	14 Jul 2005 17:33:23 -0000	1.9.64.1
  @@ -31,7 +31,7 @@
   
   using namespace KJS;
   
  -static bool keysMatch(const UChar *c, unsigned len, const char *s)
  +static inline bool keysMatch(const UChar *c, unsigned len, const char *s)
   {
     for (unsigned i = 0; i != len; i++, c++, s++)
       if (c->uc != (unsigned char)*s)
  
  
  
  1.52.14.2 +71 -80    JavaScriptCore/kjs/nodes.cpp
  
  Index: nodes.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/nodes.cpp,v
  retrieving revision 1.52.14.1
  retrieving revision 1.52.14.2
  diff -u -r1.52.14.1 -r1.52.14.2
  --- nodes.cpp	25 May 2005 00:06:22 -0000	1.52.14.1
  +++ nodes.cpp	14 Jul 2005 17:33:23 -0000	1.52.14.2
  @@ -47,6 +47,9 @@
   
   using namespace KJS;
   
  +// Disabled for now because it shows up on benchmark (0.5%).
  +#if DEBUGGER_SUPPORT
  +
   #define KJS_BREAKPOINT \
     if (!hitStatement(exec)) \
       return Completion(Normal);
  @@ -56,6 +59,13 @@
         exec->dynamicInterpreter()->imp()->debugger()->imp()->aborted()) \
       return Completion(Normal);
   
  +#else
  +
  +#define KJS_BREAKPOINT
  +#define KJS_ABORTPOINT
  +
  +#endif
  +
   #define KJS_CHECKEXCEPTION \
     if (exec->hadException()) \
       return Completion(Throw, exec->exception()); \
  @@ -209,21 +219,21 @@
   
   Value BooleanNode::evaluate(ExecState */*exec*/)
   {
  -  return Boolean(value);
  +  return Value(value);
   }
   
   // ------------------------------ NumberNode -----------------------------------
   
   Value NumberNode::evaluate(ExecState */*exec*/)
   {
  -  return Number(value);
  +  return Value(value);
   }
   
   // ------------------------------ StringNode -----------------------------------
   
   Value StringNode::evaluate(ExecState */*exec*/)
   {
  -  return String(value);
  +  return value;
   }
   
   // ------------------------------ RegExpNode -----------------------------------
  @@ -378,7 +388,7 @@
     }
   
     if (opt)
  -    array.put(exec,lengthPropertyName, Number(elision + length), DontEnum | DontDelete);
  +    array.put(exec,lengthPropertyName, Value(elision + length), DontEnum | DontDelete);
   
     return array;
   }
  @@ -698,37 +708,29 @@
       return throwError(exec, TypeError, "Value %s (result of expression %s) is not object.", v, expr);
     }
   
  -  Object func = Object(static_cast<ObjectImp*>(v.imp()));
  +  ObjectImp *func = static_cast<ObjectImp*>(v.imp());
   
  -  if (!func.implementsCall()) {
  +  if (!func->implementsCall()) {
       return throwError(exec, TypeError, "Object %s (result of expression %s) does not allow calls.", v, expr);
     }
   
  -  Value thisVal;
  -  if (ref.isMutable())
  -    thisVal = ref.getBase(exec);
  -  else
  -    thisVal = Null();
  -
  -  if (thisVal.type() == ObjectType &&
  -      Object::dynamicCast(thisVal).inherits(&ActivationImp::info))
  -    thisVal = Null();
  +  ObjectImp *thisObjImp = 0;
  +  ValueImp *thisValImp = ref.baseIfMutable();
  +  if (thisValImp && thisValImp->type() == ObjectType && !static_cast<ObjectImp *>(thisValImp)->inherits(&ActivationImp::info))
  +    thisObjImp = static_cast<ObjectImp *>(thisValImp);
   
  -  if (thisVal.type() != ObjectType) {
  +  if (!thisObjImp) {
       // ECMA 11.2.3 says that in this situation the this value should be null.
       // However, section 10.2.3 says that in the case where the value provided
       // by the caller is null, the global object should be used. It also says
       // that the section does not apply to interal functions, but for simplicity
       // of implementation we use the global object anyway here. This guarantees
       // that in host objects you always get a valid object for this.
  -    // thisVal = Null();
  -    thisVal = exec->dynamicInterpreter()->globalObject();
  +    thisObjImp = exec->dynamicInterpreter()->globalObject().imp();
     }
   
  -  Object thisObj = Object::dynamicCast(thisVal);
  -  Value result = func.call(exec,thisObj, argList);
  -
  -  return result;
  +  Object thisObj(thisObjImp);
  +  return func->call(exec, thisObj, argList);
   }
   
   // ------------------------------ PostfixNode ----------------------------------
  @@ -753,14 +755,14 @@
     Reference ref = expr->evaluateReference(exec);
     KJS_CHECKEXCEPTIONVALUE
     Value v = ref.getValue(exec);
  -  Number n = v.toNumber(exec);
   
  -  double newValue = (oper == OpPlusPlus) ? n.value() + 1 : n.value() - 1;
  -  Value n2 = Number(newValue);
  +  bool knownToBeInteger;
  +  double n = v.toNumber(exec, knownToBeInteger);
   
  -  ref.putValue(exec,n2);
  +  double newValue = (oper == OpPlusPlus) ? n + 1 : n - 1;
  +  ref.putValue(exec, Value(newValue, knownToBeInteger));
   
  -  return n;
  +  return Value(n, knownToBeInteger);
   }
   
   // ------------------------------ DeleteNode -----------------------------------
  @@ -784,7 +786,7 @@
   {
     Reference ref = expr->evaluateReference(exec);
     KJS_CHECKEXCEPTIONVALUE
  -  return Boolean(ref.deleteValue(exec));
  +  return Value(ref.deleteValue(exec));
   }
   
   // ------------------------------ VoidNode -------------------------------------
  @@ -834,11 +836,9 @@
     const char *s = 0L;
     Reference ref = expr->evaluateReference(exec);
     KJS_CHECKEXCEPTIONVALUE
  -  if (ref.isMutable()) {
  -    Value b = ref.getBase(exec);
  -    if (b.type() == NullType)
  -      return String("undefined");
  -  }
  +  ValueImp *b = ref.baseIfMutable();
  +  if (b && b->dispatchType() == NullType)
  +    return Value("undefined");
     Value v = ref.getValue(exec);
     switch (v.type())
       {
  @@ -865,7 +865,7 @@
         break;
       }
   
  -  return String(s);
  +  return Value(s);
   }
   
   // ------------------------------ PrefixNode -----------------------------------
  @@ -890,12 +890,14 @@
     Reference ref = expr->evaluateReference(exec);
     KJS_CHECKEXCEPTIONVALUE
     Value v = ref.getValue(exec);
  -  Number n = v.toNumber(exec);
   
  -  double newValue = (oper == OpPlusPlus) ? n.value() + 1 : n.value() - 1;
  -  Value n2 = Number(newValue);
  +  bool knownToBeInteger;
  +  double n = v.toNumber(exec, knownToBeInteger);
  +
  +  double newValue = (oper == OpPlusPlus) ? n + 1 : n - 1;
  +  Value n2(newValue, knownToBeInteger);
   
  -  ref.putValue(exec,n2);
  +  ref.putValue(exec, n2);
   
     return n2;
   }
  @@ -922,7 +924,7 @@
     Value v = expr->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
   
  -  return Number(v.toNumber(exec)); /* TODO: optimize */
  +  return Value(v.toNumber(exec)); /* TODO: optimize */
   }
   
   // ------------------------------ NegateNode -----------------------------------
  @@ -946,11 +948,10 @@
   {
     Value v = expr->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
  -  Number n = v.toNumber(exec);
  -
  -  double d = -n.value();
   
  -  return Number(d);
  +  bool knownToBeInteger;
  +  double n = v.toNumber(exec, knownToBeInteger);
  +  return Value(-n, knownToBeInteger && n != 0);
   }
   
   // ------------------------------ BitwiseNotNode -------------------------------
  @@ -974,9 +975,7 @@
   {
     Value v = expr->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
  -  int i32 = v.toInt32(exec);
  -
  -  return Number(~i32);
  +  return Value(~v.toInt32(exec));
   }
   
   // ------------------------------ LogicalNotNode -------------------------------
  @@ -1000,9 +999,7 @@
   {
     Value v = expr->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
  -  bool b = v.toBoolean(exec);
  -
  -  return Boolean(!b);
  +  return Value(!v.toBoolean(exec));
   }
   
   // ------------------------------ MultNode -------------------------------------
  @@ -1034,7 +1031,7 @@
     Value v2 = term2->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
   
  -  return mult(exec,v1, v2, oper);
  +  return mult(exec, v1, v2, oper);
   }
   
   // ------------------------------ AddNode --------------------------------------
  @@ -1066,7 +1063,7 @@
     Value v2 = term2->evaluate(exec);
     KJS_CHECKEXCEPTIONVALUE
   
  -  return add(exec,v1, v2, oper);
  +  return add(exec, v1, v2, oper);
   }
   
   // ------------------------------ ShiftNode ------------------------------------
  @@ -1099,23 +1096,17 @@
     unsigned int i2 = v2.toUInt32(exec);
     i2 &= 0x1f;
   
  -  double result;
     switch (oper) {
     case OpLShift:
  -    result = v1.toInt32(exec) << i2;
  -    break;
  +    return Value(v1.toInt32(exec) << i2);
     case OpRShift:
  -    result = v1.toInt32(exec) >> i2;
  -    break;
  +    return Value(v1.toInt32(exec) >> i2);
     case OpURShift:
  -    result = v1.toUInt32(exec) >> i2;
  -    break;
  +    return Value(v1.toUInt32(exec) >> i2);
     default:
       assert(!"ShiftNode: unhandled switch case");
  -    result = 0;
  +    return Undefined();
     }
  -
  -  return Number(result);
   }
   
   // ------------------------------ RelationalNode -------------------------------
  @@ -1177,14 +1168,14 @@
         // But we are supposed to throw an exception where the object does not "have" the [[HasInstance]]
         // property. It seems that all object have the property, but not all implement it, so in this
         // case we return false (consistent with mozilla)
  -      return Boolean(false);
  +      return Value(false);
         //      return throwError(exec, TypeError,
         //			"Object does not implement the [[HasInstance]] method." );
       }
       return o2.hasInstance(exec, v1);
     }
   
  -  return Boolean(b);
  +  return Value(b);
   }
   
   // ------------------------------ EqualNode ------------------------------------
  @@ -1225,7 +1216,7 @@
       bool eq = strictEqual(exec,v1, v2);
       result = oper == OpStrEq ? eq : !eq;
     }
  -  return Boolean(result);
  +  return Value(result);
   }
   
   // ------------------------------ BitOperNode ----------------------------------
  @@ -1265,7 +1256,7 @@
     else
       result = i1 | i2;
   
  -  return Number(result);
  +  return Value(result);
   }
   
   // ------------------------------ BinaryLogicalNode ----------------------------
  @@ -1395,37 +1386,39 @@
       case OpLShift:
         i1 = v1.toInt32(exec);
         i2 = v2.toInt32(exec);
  -      v = Number(i1 <<= i2);
  +      v = Value(i1 << i2);
         break;
       case OpRShift:
         i1 = v1.toInt32(exec);
         i2 = v2.toInt32(exec);
  -      v = Number(i1 >>= i2);
  +      v = Value(i1 >> i2);
         break;
       case OpURShift:
         ui = v1.toUInt32(exec);
         i2 = v2.toInt32(exec);
  -      v = Number(ui >>= i2);
  +      v = Value(ui >> i2);
         break;
       case OpAndEq:
         i1 = v1.toInt32(exec);
         i2 = v2.toInt32(exec);
  -      v = Number(i1 &= i2);
  +      v = Value(i1 & i2);
         break;
       case OpXOrEq:
         i1 = v1.toInt32(exec);
         i2 = v2.toInt32(exec);
  -      v = Number(i1 ^= i2);
  +      v = Value(i1 ^ i2);
         break;
       case OpOrEq:
         i1 = v1.toInt32(exec);
         i2 = v2.toInt32(exec);
  -      v = Number(i1 |= i2);
  +      v = Value(i1 | i2);
         break;
       case OpModEq: {
  -      double d1 = v1.toNumber(exec);
  -      double d2 = v2.toNumber(exec);
  -      v = Number(fmod(d1,d2));
  +      bool d1KnownToBeInteger;
  +      double d1 = v1.toNumber(exec, d1KnownToBeInteger);
  +      bool d2KnownToBeInteger;
  +      double d2 = v2.toNumber(exec, d2KnownToBeInteger);
  +      v = Value(fmod(d1, d2), d1KnownToBeInteger && d2KnownToBeInteger && d2 != 0);
       }
         break;
       default:
  @@ -1595,7 +1588,7 @@
   // ECMA 12.2
   Value VarDeclNode::evaluate(ExecState *exec)
   {
  -  Object variable = Object::dynamicCast(exec->context().imp()->variableObject());
  +  Object variable = exec->context().imp()->variableObject();
   
     Value val;
     if (init) {
  @@ -1616,7 +1609,7 @@
     // "var location" creates a dynamic property instead of activating window.location.
     variable.put(exec, ident, val, DontDelete | Internal);
   
  -  return String(ident.ustring());
  +  return ident.ustring();
   }
   
   void VarDeclNode::processVarDecls(ExecState *exec)
  @@ -1979,8 +1972,7 @@
   // ECMA 12.6.3
   Completion ForNode::execute(ExecState *exec)
   {
  -  Value e, v, cval;
  -  bool b;
  +  Value v, cval;
   
     if (expr1) {
       v = expr1->evaluate(exec);
  @@ -1990,8 +1982,7 @@
       if (expr2) {
         v = expr2->evaluate(exec);
         KJS_CHECKEXCEPTION
  -      b = v.toBoolean(exec);
  -      if (b == false)
  +      if (!v.toBoolean(exec))
   	return Completion(Normal, cval);
       }
       // bail out on error
  
  
  
  1.19.14.1 +5 -0      JavaScriptCore/kjs/nodes.h
  
  Index: nodes.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/nodes.h,v
  retrieving revision 1.19
  retrieving revision 1.19.14.1
  diff -u -r1.19 -r1.19.14.1
  --- nodes.h	12 Aug 2004 17:21:29 -0000	1.19
  +++ nodes.h	14 Jul 2005 17:33:23 -0000	1.19.14.1
  @@ -25,6 +25,8 @@
   #ifndef _NODES_H_
   #define _NODES_H_
   
  +#include "fast_malloc.h"
  +
   #include "internal.h"
   //#include "debugger.h"
   #ifndef NDEBUG
  @@ -77,6 +79,9 @@
     public:
       Node();
       virtual ~Node();
  +
  +    KJS_FAST_ALLOCATED;
  +
       virtual Value evaluate(ExecState *exec) = 0;
       virtual Reference evaluateReference(ExecState *exec);
       UString toString() const;
  
  
  
  1.5.14.1  +68 -65    JavaScriptCore/kjs/operations.cpp
  
  Index: operations.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/operations.cpp,v
  retrieving revision 1.5
  retrieving revision 1.5.14.1
  diff -u -r1.5 -r1.5.14.1
  --- operations.cpp	10 Aug 2004 18:43:51 -0000	1.5
  +++ operations.cpp	14 Jul 2005 17:33:23 -0000	1.5.14.1
  @@ -48,6 +48,8 @@
   
   using namespace KJS;
   
  +#if !APPLE_CHANGES
  +
   bool KJS::isNaN(double d)
   {
   #ifdef HAVE_FUNC_ISNAN
  @@ -106,57 +108,61 @@
   #endif
   }
   
  +#endif
  +
   // ECMA 11.9.3
   bool KJS::equal(ExecState *exec, const Value& v1, const Value& v2)
   {
     Type t1 = v1.type();
     Type t2 = v2.type();
   
  -  if (t1 == t2) {
  +    if (t1 != t2) {
  +        if (t1 == UndefinedType)
  +            t1 = NullType;
  +        if (t2 == UndefinedType)
  +            t2 = NullType;
  +
  +        if (t1 == BooleanType)
  +            t1 = NumberType;
  +        if (t2 == BooleanType)
  +            t2 = NumberType;
  +
  +        if (t1 == NumberType && t2 == StringType) {
  +            // use toNumber
  +        } else if (t1 == StringType && t2 == NumberType) {
  +            t1 = NumberType;
  +            // use toNumber
  +        } else {
  +            if ((t1 == StringType || t1 == NumberType) && t2 >= ObjectType)
  +                return equal(exec, v1, v2.toPrimitive(exec));
  +            if (t1 >= ObjectType && (t2 == StringType || t2 == NumberType))
  +                return equal(exec, v1.toPrimitive(exec), v2);
  +            if (t1 != t2)
  +                return false;
  +        }
  +    }
  +
       if (t1 == UndefinedType || t1 == NullType)
         return true;
  -    if (t1 == NumberType)
  -    {
  +
  +    if (t1 == NumberType) {
         double d1 = v1.toNumber(exec);
         double d2 = v2.toNumber(exec);
  -      if ( isNaN( d1 ) || isNaN( d2 ) )
  +        // FIXME: Isn't this already how NaN behaves?
  +        // Why the extra line of code?
  +        if (isNaN(d1) || isNaN(d2))
           return false;
  -      return ( d1 == d2 ); /* TODO: +0, -0 ? */
  +        return d1 == d2; /* TODO: +0, -0 ? */
       }
  +
       if (t1 == StringType)
  -      return (v1.toString(exec) == v2.toString(exec));
  +        return v1.toString(exec) == v2.toString(exec);
  +
       if (t1 == BooleanType)
  -      return (v1.toBoolean(exec) == v2.toBoolean(exec));
  +        return v1.toBoolean(exec) == v2.toBoolean(exec);
   
       // types are Object
  -    return (v1.imp() == v2.imp());
  -  }
  -
  -  // different types
  -  if ((t1 == NullType && t2 == UndefinedType) || (t1 == UndefinedType && t2 == NullType))
  -    return true;
  -  if (t1 == NumberType && t2 == StringType) {
  -    Number n2 = v2.toNumber(exec);
  -    return equal(exec,v1, n2);
  -  }
  -  if ((t1 == StringType && t2 == NumberType) || t1 == BooleanType) {
  -    Number n1 = v1.toNumber(exec);
  -    return equal(exec,n1, v2);
  -  }
  -  if (t2 == BooleanType) {
  -    Number n2 = v2.toNumber(exec);
  -    return equal(exec,v1, n2);
  -  }
  -  if ((t1 == StringType || t1 == NumberType) && t2 >= ObjectType) {
  -    Value p2 = v2.toPrimitive(exec);
  -    return equal(exec,v1, p2);
  -  }
  -  if (t1 >= ObjectType && (t2 == StringType || t2 == NumberType)) {
  -    Value p1 = v1.toPrimitive(exec);
  -    return equal(exec,p1, v2);
  -  }
  -
  -  return false;
  +    return v1.imp() == v2.imp();
   }
   
   bool KJS::strictEqual(ExecState *exec, const Value &v1, const Value &v2)
  @@ -171,6 +177,8 @@
     if (t1 == NumberType) {
       double n1 = v1.toNumber(exec);
       double n2 = v2.toNumber(exec);
  +    // FIXME: Isn't this already how NaN behaves?
  +    // Why the extra line of code?
       if (isNaN(n1) || isNaN(n2))
         return false;
       if (n1 == n2)
  @@ -199,24 +207,11 @@
   
     double n1 = p1.toNumber(exec);
     double n2 = p2.toNumber(exec);
  -  if ( isNaN( n1 ) || isNaN( n2 ) )
  -    return -1; // means undefined
  -#if APPLE_CHANGES
  -  return n1 < n2;
  -#else
  -  if (n1 == n2)
  -    return 0;
  -  /* TODO: +0, -0 */
  -  if ( isPosInf( n1 ) )
  -    return 0;
  -  if ( isPosInf( n2 ) )
  +  if (n1 < n2)
       return 1;
  -  if ( isNegInf( n2 ) )
  +  if (n1 >= n2)
       return 0;
  -  if ( isNegInf( n1 ) )
  -    return 1;
  -  return (n1 < n2) ? 1 : 0;
  -#endif
  +  return -1; // must be NaN, so undefined
   }
   
   int KJS::maxInt(int d1, int d2)
  @@ -238,35 +233,43 @@
     Value p2 = v2.toPrimitive(exec, preferred);
   
     if ((p1.type() == StringType || p2.type() == StringType) && oper == '+') {
  -    UString s1 = p1.toString(exec);
  -    UString s2 = p2.toString(exec);
  -
  -    return String(s1 + s2);
  +    return p1.toString(exec) + p2.toString(exec);
     }
   
  -  double n1 = p1.toNumber(exec);
  -  double n2 = p2.toNumber(exec);
  +  bool n1KnownToBeInteger;
  +  double n1 = p1.toNumber(exec, n1KnownToBeInteger);
  +  bool n2KnownToBeInteger;
  +  double n2 = p2.toNumber(exec, n2KnownToBeInteger);
  +
  +  bool resultKnownToBeInteger = n1KnownToBeInteger && n2KnownToBeInteger;
   
     if (oper == '+')
  -    return Number(n1 + n2);
  +    return Value(n1 + n2, resultKnownToBeInteger);
     else
  -    return Number(n1 - n2);
  +    return Value(n1 - n2, resultKnownToBeInteger);
   }
   
   // ECMA 11.5
   Value KJS::mult(ExecState *exec, const Value &v1, const Value &v2, char oper)
   {
  -  double n1 = v1.toNumber(exec);
  -  double n2 = v2.toNumber(exec);
  +  bool n1KnownToBeInteger;
  +  double n1 = v1.toNumber(exec, n1KnownToBeInteger);
  +  bool n2KnownToBeInteger;
  +  double n2 = v2.toNumber(exec, n2KnownToBeInteger);
   
     double result;
  +  bool resultKnownToBeInteger;
   
  -  if (oper == '*')
  +  if (oper == '*') {
       result = n1 * n2;
  -  else if (oper == '/')
  +    resultKnownToBeInteger = n1KnownToBeInteger && n2KnownToBeInteger;
  +  } else if (oper == '/') {
       result = n1 / n2;
  -  else
  +    resultKnownToBeInteger = false;
  +  } else {
       result = fmod(n1, n2);
  +    resultKnownToBeInteger = n1KnownToBeInteger && n2KnownToBeInteger && n2 != 0;
  +  }
   
  -  return Number(result);
  +  return Value(result, resultKnownToBeInteger);
   }
  
  
  
  1.3.74.1  +8 -0      JavaScriptCore/kjs/operations.h
  
  Index: operations.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/operations.h,v
  retrieving revision 1.3
  retrieving revision 1.3.74.1
  diff -u -r1.3 -r1.3.74.1
  --- operations.h	15 Apr 2002 23:41:18 -0000	1.3
  +++ operations.h	14 Jul 2005 17:33:23 -0000	1.3.74.1
  @@ -29,6 +29,12 @@
   
     class ExecState;
   
  +#if APPLE_CHANGES
  +  inline bool isNaN(double d) { return isnan(d); }
  +  inline bool isInf(double d) { return isinf(d); }
  +  inline bool isPosInf(double d) { return isinf(d) && d > 0; }
  +  inline bool isNegInf(double d) { return isinf(d) && d < 0; }
  +#else
     /**
      * @return True if d is not a number (platform support required).
      */
  @@ -39,6 +45,8 @@
     bool isInf(double d);
     bool isPosInf(double d);
     bool isNegInf(double d);
  +#endif
  +
     bool equal(ExecState *exec, const Value& v1, const Value& v2);
     bool strictEqual(ExecState *exec, const Value &v1, const Value &v2);
     /**
  
  
  
  1.39.14.1 +86 -65    JavaScriptCore/kjs/property_map.cpp
  
  Index: property_map.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/property_map.cpp,v
  retrieving revision 1.39
  retrieving revision 1.39.14.1
  diff -u -r1.39 -r1.39.14.1
  --- property_map.cpp	19 Aug 2004 16:21:29 -0000	1.39
  +++ property_map.cpp	14 Jul 2005 17:33:23 -0000	1.39.14.1
  @@ -21,6 +21,7 @@
   
   #include "property_map.h"
   
  +#include "fast_malloc.h"
   #include "object.h"
   #include "protect.h"
   #include "reference_list.h"
  @@ -112,12 +113,14 @@
           return;
       }
       
  -    for (int i = 0; i < _table->size; i++) {
  -        UString::Rep *key = _table->entries[i].key;
  +    int size = _table->size;
  +    Entry *entries = _table->entries;
  +    for (int i = 0; i < size; i++) {
  +        UString::Rep *key = entries[i].key;
           if (key)
               key->deref();
       }
  -    free(_table);
  +    kjs_fast_free(_table);
   }
   
   void PropertyMap::clear()
  @@ -133,11 +136,14 @@
           return;
       }
   
  -    for (int i = 0; i < _table->size; i++) {
  -        UString::Rep *key = _table->entries[i].key;
  +    int size = _table->size;
  +    Entry *entries = _table->entries;
  +    for (int i = 0; i < size; i++) {
  +        UString::Rep *key = entries[i].key;
           if (key) {
               key->deref();
  -            _table->entries[i].key = 0;
  +            entries[i].key = 0;
  +            entries[i].value = 0;
           }
       }
       _table->keyCount = 0;
  @@ -162,20 +168,22 @@
       }
       
       unsigned h = rep->hash();
  -    int i = h & _table->sizeMask;
  +    int sizeMask = _table->sizeMask;
  +    Entry *entries = _table->entries;
  +    int i = h & sizeMask;
       int k = 0;
   #if DUMP_STATISTICS
       ++numProbes;
  -    numCollisions += _table->entries[i].key && _table->entries[i].key != rep;
  +    numCollisions += entries[i].key && entries[i].key != rep;
   #endif
  -    while (UString::Rep *key = _table->entries[i].key) {
  +    while (UString::Rep *key = entries[i].key) {
           if (rep == key) {
  -            attributes = _table->entries[i].attributes;
  -            return _table->entries[i].value;
  +            attributes = entries[i].attributes;
  +            return entries[i].value;
           }
           if (k == 0)
  -            k = 1 | (h % _table->sizeMask);
  -        i = (i + k) & _table->sizeMask;
  +            k = 1 | (h % sizeMask);
  +        i = (i + k) & sizeMask;
   #if DUMP_STATISTICS
           ++numRehashes;
   #endif
  @@ -199,18 +207,20 @@
       }
       
       unsigned h = rep->hash();
  -    int i = h & _table->sizeMask;
  +    int sizeMask = _table->sizeMask;
  +    Entry *entries = _table->entries;
  +    int i = h & sizeMask;
       int k = 0;
   #if DUMP_STATISTICS
       ++numProbes;
  -    numCollisions += _table->entries[i].key && _table->entries[i].key != rep;
  +    numCollisions += entries[i].key && entries[i].key != rep;
   #endif
  -    while (UString::Rep *key = _table->entries[i].key) {
  +    while (UString::Rep *key = entries[i].key) {
           if (rep == key)
  -            return _table->entries[i].value;
  +            return entries[i].value;
           if (k == 0)
  -            k = 1 | (h % _table->sizeMask);
  -        i = (i + k) & _table->sizeMask;
  +            k = 1 | (h % sizeMask);
  +        i = (i + k) & sizeMask;
   #if DUMP_STATISTICS
           ++numRehashes;
   #endif
  @@ -276,18 +286,20 @@
           expand();
       
       unsigned h = rep->hash();
  -    int i = h & _table->sizeMask;
  +    int sizeMask = _table->sizeMask;
  +    Entry *entries = _table->entries;
  +    int i = h & sizeMask;
       int k = 0;
       bool foundDeletedElement = false;
       int deletedElementIndex = 0;    /* initialize to make the compiler happy */
   #if DUMP_STATISTICS
       ++numProbes;
  -    numCollisions += _table->entries[i].key && _table->entries[i].key != rep;
  +    numCollisions += entries[i].key && entries[i].key != rep;
   #endif
  -    while (UString::Rep *key = _table->entries[i].key) {
  +    while (UString::Rep *key = entries[i].key) {
           if (rep == key) {
               // Put a new value in an existing hash table entry.
  -            _table->entries[i].value = value;
  +            entries[i].value = value;
               // Attributes are intentionally not updated.
               return;
           }
  @@ -297,8 +309,8 @@
               deletedElementIndex = i;
           }
           if (k == 0)
  -            k = 1 | (h % _table->sizeMask);
  -        i = (i + k) & _table->sizeMask;
  +            k = 1 | (h % sizeMask);
  +        i = (i + k) & sizeMask;
   #if DUMP_STATISTICS
           ++numRehashes;
   #endif
  @@ -307,16 +319,16 @@
       // Use either the deleted element or the 0 at the end of the chain.
       if (foundDeletedElement) {
           i = deletedElementIndex;
  -        _table->entries[i].key->deref();
  +        entries[i].key->deref();
           --_table->sentinelCount;
       }
   
       // Create a new hash table entry.
       rep->ref();
  -    _table->entries[i].key = rep;
  -    _table->entries[i].value = value;
  -    _table->entries[i].attributes = attributes;
  -    _table->entries[i].index = ++_table->lastIndexUsed;
  +    entries[i].key = rep;
  +    entries[i].value = value;
  +    entries[i].attributes = attributes;
  +    entries[i].index = ++_table->lastIndexUsed;
       ++_table->keyCount;
   
       checkConsistency();
  @@ -327,26 +339,28 @@
       assert(_table);
   
       unsigned h = key->hash();
  -    int i = h & _table->sizeMask;
  +    int sizeMask = _table->sizeMask;
  +    Entry *entries = _table->entries;
  +    int i = h & sizeMask;
       int k = 0;
   #if DUMP_STATISTICS
       ++numProbes;
  -    numCollisions += _table->entries[i].key && _table->entries[i].key != key;
  +    numCollisions += entries[i].key && entries[i].key != key;
   #endif
  -    while (_table->entries[i].key) {
  -        assert(_table->entries[i].key != &UString::Rep::null);
  +    while (entries[i].key) {
  +        assert(entries[i].key != &UString::Rep::null);
           if (k == 0)
  -            k = 1 | (h % _table->sizeMask);
  -        i = (i + k) & _table->sizeMask;
  +            k = 1 | (h % sizeMask);
  +        i = (i + k) & sizeMask;
   #if DUMP_STATISTICS
           ++numRehashes;
   #endif
       }
       
  -    _table->entries[i].key = key;
  -    _table->entries[i].value = value;
  -    _table->entries[i].attributes = attributes;
  -    _table->entries[i].index = index;
  +    entries[i].key = key;
  +    entries[i].value = value;
  +    entries[i].attributes = attributes;
  +    entries[i].index = index;
   }
   
   void PropertyMap::expand()
  @@ -371,7 +385,7 @@
       int oldTableSize = oldTable ? oldTable->size : 0;
       int oldTableKeyCount = oldTable ? oldTable->keyCount : 0;
       
  -    _table = (Table *)calloc(1, sizeof(Table) + (newTableSize - 1) * sizeof(Entry) );
  +    _table = (Table *)kjs_fast_calloc(1, sizeof(Table) + (newTableSize - 1) * sizeof(Entry) );
       _table->size = newTableSize;
       _table->sizeMask = newTableSize - 1;
       _table->keyCount = oldTableKeyCount;
  @@ -405,7 +419,7 @@
       }
       _table->lastIndexUsed = lastIndexUsed;
   
  -    free(oldTable);
  +    kjs_fast_free(oldTable);
   
       checkConsistency();
   }
  @@ -434,19 +448,21 @@
   
       // Find the thing to remove.
       unsigned h = rep->hash();
  -    int i = h & _table->sizeMask;
  +    int sizeMask = _table->sizeMask;
  +    Entry *entries = _table->entries;
  +    int i = h & sizeMask;
       int k = 0;
   #if DUMP_STATISTICS
       ++numProbes;
       ++numRemoves;
  -    numCollisions += _table->entries[i].key && _table->entries[i].key != rep;
  +    numCollisions += entries[i].key && entries[i].key != rep;
   #endif
  -    while ((key = _table->entries[i].key)) {
  +    while ((key = entries[i].key)) {
           if (rep == key)
               break;
           if (k == 0)
  -            k = 1 | (h % _table->sizeMask);
  -        i = (i + k) & _table->sizeMask;
  +            k = 1 | (h % sizeMask);
  +        i = (i + k) & sizeMask;
   #if DUMP_STATISTICS
           ++numRehashes;
   #endif
  @@ -460,9 +476,9 @@
       key->deref();
       key = &UString::Rep::null;
       key->ref();
  -    _table->entries[i].key = key;
  -    _table->entries[i].value = 0;
  -    _table->entries[i].attributes = DontEnum;
  +    entries[i].key = key;
  +    entries[i].value = 0;
  +    entries[i].attributes = DontEnum;
       assert(_table->keyCount >= 1);
       --_table->keyCount;
       ++_table->sentinelCount;
  @@ -486,16 +502,13 @@
           return;
       }
   
  -    for (int i = 0; i != _table->size; ++i) {
  -        UString::Rep *key = _table->entries[i].key;
  -        if (key) {
  -            ValueImp *v = _table->entries[i].value;
  -            // Check v against 0 to handle deleted elements
  -            // without comparing key to UString::Rep::null.
  +    int size = _table->size;
  +    Entry *entries = _table->entries;
  +    for (int i = 0; i != size; ++i) {
  +        ValueImp *v = entries[i].value;
               if (v && !v->marked())
                   v->mark();
           }
  -    }
   }
   
   static int comparePropertyMapEntryIndices(const void *a, const void *b)
  @@ -530,8 +543,10 @@
   
       // Get pointers to the enumerable entries in the buffer.
       Entry **p = sortedEnumerables;
  -    for (int i = 0; i != _table->size; ++i) {
  -        Entry *e = &_table->entries[i];
  +    int size = _table->size;
  +    Entry *entries = _table->entries;
  +    for (int i = 0; i != size; ++i) {
  +        Entry *e = &entries[i];
           if (e->key && !(e->attributes & DontEnum))
               *p++ = e;
       }
  @@ -565,8 +580,10 @@
           return;
       }
   
  -    for (int i = 0; i != _table->size; ++i) {
  -        UString::Rep *key = _table->entries[i].key;
  +    int size = _table->size;
  +    Entry *entries = _table->entries;
  +    for (int i = 0; i != size; ++i) {
  +        UString::Rep *key = entries[i].key;
           if (key && key != &UString::Rep::null)
           {
               UString k(key);
  @@ -588,8 +605,10 @@
               ++count;
   #endif
       } else {
  -        for (int i = 0; i != _table->size; ++i)
  -            if (_table->entries[i].key && !(_table->entries[i].attributes & (ReadOnly | Function)))
  +        int size = _table->size;
  +        Entry *entries = _table->entries;
  +        for (int i = 0; i != size; ++i)
  +            if (entries[i].key && !(entries[i].attributes & (ReadOnly | Function)))
                   ++count;
       }
   
  @@ -629,8 +648,10 @@
   
           // Get pointers to the entries in the buffer.
           Entry **p = sortedEntries;
  -        for (int i = 0; i != _table->size; ++i) {
  -            Entry *e = &_table->entries[i];
  +        int size = _table->size;
  +        Entry *entries = _table->entries;
  +        for (int i = 0; i != size; ++i) {
  +            Entry *e = &entries[i];
               if (e->key && !(e->attributes & (ReadOnly | Function)))
                   *p++ = e;
           }
  
  
  
  1.1.18.1  +5 -6      JavaScriptCore/kjs/protected_values.h
  
  Index: protected_values.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/protected_values.h,v
  retrieving revision 1.1
  retrieving revision 1.1.18.1
  diff -u -r1.1 -r1.1.18.1
  --- protected_values.h	23 Apr 2004 22:40:31 -0000	1.1
  +++ protected_values.h	14 Jul 2005 17:33:23 -0000	1.1.18.1
  @@ -46,14 +46,13 @@
   	static void rehash(int newTableSize);
   	static unsigned computeHash(ValueImp *pointer);
   
  -	// let the collector scan the table directly for protected
  -	// values
  +	// let the collector scan the table directly for protected values
   	friend class Collector;
   
  -	static KeyValue * ProtectedValues::_table;
  -	static int ProtectedValues::_tableSize;
  -	static int ProtectedValues::_tableSizeMask;
  -	static int ProtectedValues::_keyCount;
  +	static KeyValue *_table;
  +	static int _tableSize;
  +	static int _tableSizeMask;
  +	static int _keyCount;
       };
   }
   
  
  
  
  1.9.12.1  +22 -24    JavaScriptCore/kjs/reference.cpp
  
  Index: reference.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/reference.cpp,v
  retrieving revision 1.9
  retrieving revision 1.9.12.1
  diff -u -r1.9 -r1.9.12.1
  --- reference.cpp	9 Oct 2004 21:22:43 -0000	1.9
  +++ reference.cpp	14 Jul 2005 17:33:23 -0000	1.9.12.1
  @@ -23,7 +23,7 @@
   #include "reference.h"
   #include "internal.h"
   
  -using namespace KJS;
  +namespace KJS {
   
   // ------------------------------ Reference ------------------------------------
   
  @@ -83,10 +83,6 @@
     return valueRef;
   }
   
  -Reference::Reference()
  -{
  -}
  -
   Value Reference::getBase(ExecState *exec) const
   {
     if (baseIsValue) {
  @@ -118,16 +114,17 @@
       return base;
     }
   
  -  Value o = getBase(exec);
  +  ValueImp *o = base.imp();
  +  Type t = o ? o->dispatchType() : NullType;
   
  -  if (o.isNull() || o.type() == NullType) {
  +  if (t == NullType) {
       UString m = I18N_NOOP("Can't find variable: ") + getPropertyName(exec).ustring();
       Object err = Error::create(exec, ReferenceError, m.ascii());
       exec->setException(err);
       return err;
     }
   
  -  if (o.type() != ObjectType) {
  +  if (t != ObjectType) {
       UString m = I18N_NOOP("Base is not an object");
       Object err = Error::create(exec, ReferenceError, m.ascii());
       exec->setException(err);
  @@ -135,14 +132,14 @@
     }
   
     if (propertyNameIsNumber)
  -    return static_cast<ObjectImp*>(o.imp())->get(exec,propertyNameAsNumber);
  -  return static_cast<ObjectImp*>(o.imp())->get(exec,prop);
  +    return static_cast<ObjectImp*>(o)->get(exec, propertyNameAsNumber);
  +  return static_cast<ObjectImp*>(o)->get(exec, prop);
   }
   
   void Reference::putValue(ExecState *exec, const Value &w)
   {
     if (baseIsValue) {
  -    Object err = Error::create(exec,ReferenceError);
  +    Object err = Error::create(exec, ReferenceError);
       exec->setException(err);
       return;
     }
  @@ -150,13 +147,16 @@
   #ifdef KJS_VERBOSE
     printInfo(exec,(UString("setting property ")+getPropertyName(exec)).cstring().c_str(),w);
   #endif
  -  Value o = getBase(exec);
  -  if (o.type() == NullType)
  -    o = exec->lexicalInterpreter()->globalObject();
  +
  +  ValueImp *o = base.imp();
  +  Type t = o ? o->dispatchType() : NullType;
  +
  +  if (t == NullType)
  +    o = exec->lexicalInterpreter()->globalObject().imp();
   
     if (propertyNameIsNumber)
  -    return static_cast<ObjectImp*>(o.imp())->put(exec,propertyNameAsNumber, w);
  -  return static_cast<ObjectImp*>(o.imp())->put(exec,prop, w);
  +    return static_cast<ObjectImp*>(o)->put(exec, propertyNameAsNumber, w);
  +  return static_cast<ObjectImp*>(o)->put(exec, prop, w);
   }
   
   bool Reference::deleteValue(ExecState *exec)
  @@ -167,20 +167,18 @@
       return false;
     }
   
  -  Value b = getBase(exec);
  +  ValueImp *o = base.imp();
  +  Type t = o ? o->dispatchType() : NullType;
   
     // The spec doesn't mention what to do if the base is null... just return true
  -  if (b.type() != ObjectType) {
  -    assert(b.type() == NullType);
  +  if (t != ObjectType) {
  +    assert(t == NullType);
       return true;
     }
   
     if (propertyNameIsNumber)
  -    return static_cast<ObjectImp*>(b.imp())->deleteProperty(exec,propertyNameAsNumber);
  -  return static_cast<ObjectImp*>(b.imp())->deleteProperty(exec,prop);
  +    return static_cast<ObjectImp*>(o)->deleteProperty(exec,propertyNameAsNumber);
  +  return static_cast<ObjectImp*>(o)->deleteProperty(exec,prop);
   }
   
  -bool Reference::isMutable()
  -{ 
  -  return !baseIsValue;
   }
  
  
  
  1.8.18.1  +2 -2      JavaScriptCore/kjs/reference.h
  
  Index: reference.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/reference.h,v
  retrieving revision 1.8
  retrieving revision 1.8.18.1
  diff -u -r1.8 -r1.8.18.1
  --- reference.h	22 Apr 2004 16:53:35 -0000	1.8
  +++ reference.h	14 Jul 2005 17:33:23 -0000	1.8.18.1
  @@ -68,10 +68,10 @@
       void putValue(ExecState *exec, const Value &w);
       bool deleteValue(ExecState *exec);
   
  -    bool isMutable();
  +    ValueImp *baseIfMutable() const { return baseIsValue ? 0 : base.imp(); }
   
     private:
  -    Reference();
  +    Reference() { }
   
       Value base;
       unsigned propertyNameAsNumber;
  
  
  
  1.7.12.1  +4 -0      JavaScriptCore/kjs/scope_chain.h
  
  Index: scope_chain.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/scope_chain.h,v
  retrieving revision 1.7
  retrieving revision 1.7.12.1
  diff -u -r1.7 -r1.7.12.1
  --- scope_chain.h	13 Sep 2004 22:44:28 -0000	1.7
  +++ scope_chain.h	14 Jul 2005 17:33:23 -0000	1.7.12.1
  @@ -22,6 +22,8 @@
   #ifndef KJS_SCOPE_CHAIN_H
   #define KJS_SCOPE_CHAIN_H
   
  +#include "fast_malloc.h"
  +
   namespace KJS {
   
       class ObjectImp;
  @@ -31,6 +33,8 @@
           ScopeChainNode(ScopeChainNode *n, ObjectImp *o)
               : next(n), object(o), refCount(1) { }
   
  +        KJS_FAST_ALLOCATED;
  +
           ScopeChainNode *next;
           ObjectImp *object;
           int refCount;
  
  
  
  1.9.24.1  +3 -4      JavaScriptCore/kjs/simple_number.h
  
  Index: simple_number.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/simple_number.h,v
  retrieving revision 1.9
  retrieving revision 1.9.24.1
  diff -u -r1.9 -r1.9.24.1
  --- simple_number.h	22 Oct 2003 23:18:37 -0000	1.9
  +++ simple_number.h	14 Jul 2005 17:33:23 -0000	1.9.24.1
  @@ -23,11 +23,10 @@
   #ifndef _KJS_SIMPLE_NUMBER_H_
   #define _KJS_SIMPLE_NUMBER_H_
   
  -#include <limits.h>
   #include <math.h>
   #include <string.h>
   
  -#define IS_NEGATIVE_ZERO(num) (num == 0.0 && !memcmp(&num,&SimpleNumber::negZero,sizeof(double)))
  +#define IS_NEGATIVE_ZERO(num) (num == 0.0 && !memcmp(&num, &SimpleNumber::negZero, sizeof(double)))
   
   namespace KJS {
       class ValueImp;
  @@ -43,8 +42,8 @@
   	static inline bool fits(unsigned i) { return i <= (unsigned)max; }
   	static inline bool fits(long i) { return i <= max && i >= min; }
   	static inline bool fits(unsigned long i) { return i <= (unsigned)max; }
  -	static inline bool fits(double d) { return d <= max && d >= min && d == (double)(long)d &&
  -					    !IS_NEGATIVE_ZERO(d); }
  +	static inline bool integerFits(double d) { return !(d < min || d > max); }
  +	static inline bool fits(double d) { return d >= min && d <= max && d == (double)(long)d && !IS_NEGATIVE_ZERO(d); }
   	static inline ValueImp *make(long i) { return (ValueImp *)((i << shift) | tag); }
   
   	static double negZero;
  
  
  
  1.31.10.2 +4 -7      JavaScriptCore/kjs/string_object.cpp
  
  Index: string_object.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/string_object.cpp,v
  retrieving revision 1.31.10.1
  retrieving revision 1.31.10.2
  diff -u -r1.31.10.1 -r1.31.10.2
  --- string_object.cpp	25 May 2005 00:06:22 -0000	1.31.10.1
  +++ string_object.cpp	14 Jul 2005 17:33:23 -0000	1.31.10.2
  @@ -377,10 +377,9 @@
       // That doesn't match the ECMA standard, but is needed for site compatibility.
       dpos = a0.isA(UndefinedType) ? 0 : a0.toInteger(exec);
       if (dpos >= 0 && dpos < len) // false for NaN
  -      d = s[static_cast<int>(dpos)].unicode();
  +      result = Number(s[static_cast<int>(dpos)].unicode());
       else
  -      d = NaN;
  -    result = Number(d);
  +      result = Number(NaN);
       break;
     case Concat: {
       ListIterator it = args.begin();
  @@ -402,8 +401,7 @@
         } else
           dpos = 0;
       }
  -    d = s.find(u2, static_cast<int>(dpos));
  -    result = Number(d);
  +    result = Number(s.find(u2, static_cast<int>(dpos)));
       break;
     case LastIndexOf:
       u2 = a0.toString(exec);
  @@ -418,8 +416,7 @@
         } else
           dpos = 0;
       }
  -    d = s.rfind(u2, static_cast<int>(dpos));
  -    result = Number(d);
  +    result = Number(s.rfind(u2, static_cast<int>(dpos)));
       break;
     case Match:
     case Search: {
  
  
  
  1.51.12.2 +32 -43    JavaScriptCore/kjs/ustring.cpp
  
  Index: ustring.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/ustring.cpp,v
  retrieving revision 1.51.12.1
  retrieving revision 1.51.12.2
  diff -u -r1.51.12.1 -r1.51.12.2
  --- ustring.cpp	25 May 2005 00:06:22 -0000	1.51.12.1
  +++ ustring.cpp	14 Jul 2005 17:33:24 -0000	1.51.12.2
  @@ -35,6 +35,7 @@
   #include <strings.h>
   #endif
   
  +#include "fast_malloc.h"
   #include "ustring.h"
   #include "operations.h"
   #include "identifier.h"
  @@ -45,11 +46,6 @@
   
   #include <unicode/uchar.h>
   
  -// malloc_good_size is not prototyped anywhere!
  -extern "C" {
  -  size_t malloc_good_size(size_t size);
  -}
  -
   #endif
   
   namespace KJS {
  @@ -195,6 +191,15 @@
     }
   }
   
  +UString::Rep *UString::Rep::createCopying(const UChar *d, int l)
  +{
  +  int sizeInBytes = l * sizeof(UChar);
  +  UChar *copyD = static_cast<UChar *>(kjs_fast_malloc(sizeInBytes));
  +  memcpy(copyD, d, sizeInBytes);
  +
  +  return create(copyD, l);
  +}
  +
   UString::Rep *UString::Rep::create(UChar *d, int l)
   {
     Rep *r = new Rep;
  @@ -248,7 +253,7 @@
     if (baseString) {
       baseString->deref();
     } else {
  -    free(buf);
  +    kjs_fast_free(buf);
     }
     delete this;
   }
  @@ -330,9 +335,6 @@
   inline int UString::expandedSize(int size, int otherSize) const
   {
     int s = (size * 11 / 10) + 1 + otherSize;
  -#if APPLE_CHANGES
  -  s = malloc_good_size(s * sizeof(UChar)) / sizeof(UChar);
  -#endif
     return s;
   }
   
  @@ -352,7 +354,7 @@
   
     if (requiredLength > r->capacity) {
       int newCapacity = expandedSize(requiredLength, r->preCapacity);
  -    r->buf = static_cast<UChar *>(realloc(r->buf, newCapacity * sizeof(UChar)));
  +    r->buf = static_cast<UChar *>(kjs_fast_realloc(r->buf, newCapacity * sizeof(UChar)));
       r->capacity = newCapacity - r->preCapacity;
     }
     if (requiredLength > r->usedCapacity) {
  @@ -368,9 +370,9 @@
       int newCapacity = expandedSize(requiredPreCap, r->capacity);
       int delta = newCapacity - r->capacity - r->preCapacity;
   
  -    UChar *newBuf = static_cast<UChar *>(malloc(newCapacity * sizeof(UChar)));
  +    UChar *newBuf = static_cast<UChar *>(kjs_fast_malloc(newCapacity * sizeof(UChar)));
       memcpy(newBuf + delta, r->buf, (r->capacity + r->preCapacity) * sizeof(UChar));
  -    free(r->buf);
  +    kjs_fast_free(r->buf);
       r->buf = newBuf;
   
       r->preCapacity = newCapacity - r->capacity;
  @@ -388,7 +390,7 @@
   
   UString::UString(char c)
   {
  -    UChar *d = static_cast<UChar *>(malloc(sizeof(UChar)));
  +    UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar)));
       d[0] = c;
       rep = Rep::create(d, 1);
   }
  @@ -404,7 +406,7 @@
       attach(&Rep::empty);
       return;
     }
  -  UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) * length));
  +  UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * length));
     for (int i = 0; i < length; i++)
       d[i].uc = c[i];
     rep = Rep::create(d, length);
  @@ -416,9 +418,7 @@
       attach(&Rep::empty);
       return;
     }
  -  UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) *length));
  -  memcpy(d, c, length * sizeof(UChar));
  -  rep = Rep::create(d, length);
  +  rep = Rep::createCopying(c, length);
   }
   
   UString::UString(UChar *c, int length, bool copy)
  @@ -427,13 +427,11 @@
       attach(&Rep::empty);
       return;
     }
  -  UChar *d;
     if (copy) {
  -    d = static_cast<UChar *>(malloc(sizeof(UChar) * length));
  -    memcpy(d, c, length * sizeof(UChar));
  -  } else
  -    d = c;
  -  rep = Rep::create(d, length);
  +    rep = Rep::createCopying(c, length);
  +  } else {
  +    rep = Rep::create(c, length);
  +  }
   }
   
   UString::UString(const UString &a, const UString &b)
  @@ -473,7 +471,7 @@
     } else {
       // a does not qualify for append, and b does not qualify for prepend, gotta make a whole new string
       int newCapacity = expandedSize(length, 0);
  -    UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) * newCapacity));
  +    UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * newCapacity));
       memcpy(d, a.data(), aSize * sizeof(UChar));
       memcpy(d + aSize, b.data(), bSize * sizeof(UChar));
       rep = Rep::create(d, length);
  @@ -619,7 +617,7 @@
       totalLength += separators[i].size();
     }
   
  -  UChar *buffer = static_cast<UChar *>(malloc(totalLength * sizeof(UChar)));
  +  UChar *buffer = static_cast<UChar *>(kjs_fast_malloc(totalLength * sizeof(UChar)));
   
     int maxCount = MAX(rangeCount, separatorCount);
     int bufferPos = 0;
  @@ -672,7 +670,7 @@
     } else {
       // this is shared with someone using more capacity, gotta make a whole new string
       int newCapacity = expandedSize(length, 0);
  -    UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) * newCapacity));
  +    UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * newCapacity));
       memcpy(d, data(), thisSize * sizeof(UChar));
       memcpy(const_cast<UChar *>(d + thisSize), t.data(), tSize * sizeof(UChar));
       release();
  @@ -716,7 +714,7 @@
     } else {
       // this is shared with someone using more capacity, gotta make a whole new string
       int newCapacity = expandedSize(length, 0);
  -    UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) * newCapacity));
  +    UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * newCapacity));
       memcpy(d, data(), thisSize * sizeof(UChar));
       for (int i = 0; i < tSize; ++i)
         d[thisSize+i] = t[i];
  @@ -737,7 +735,7 @@
     if (length == 0) {
       // this is empty - must make a new rep because we don't want to pollute the shared empty one 
       int newCapacity = expandedSize(1, 0);
  -    UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) * newCapacity));
  +    UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * newCapacity));
       d[0] = c;
       release();
       rep = Rep::create(d, 1);
  @@ -760,7 +758,7 @@
     } else {
       // this is shared with someone using more capacity, gotta make a whole new string
       int newCapacity = expandedSize((length + 1), 0);
  -    UChar *d = static_cast<UChar *>(malloc(sizeof(UChar) * newCapacity));
  +    UChar *d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * newCapacity));
       memcpy(d, data(), length * sizeof(UChar));
       d[length] = c;
       release();
  @@ -822,7 +820,7 @@
       rep->_hash = 0;
     } else {
       release();
  -    d = static_cast<UChar *>(malloc(sizeof(UChar) * l));
  +    d = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * l));
       rep = Rep::create(d, l);
     }
     for (int i = 0; i < l; i++)
  @@ -1049,8 +1047,10 @@
     const UChar *end = data() + sz - fsz;
     long fsizeminusone = (fsz - 1) * sizeof(UChar);
     const UChar *fdata = f.data();
  +  unsigned short fchar = fdata->uc;
  +  ++fdata;
     for (const UChar *c = data() + pos; c <= end; c++)
  -    if (*c == *fdata && !memcmp(c + 1, fdata + 1, fsizeminusone))
  +    if (c->uc == fchar && !memcmp(c + 1, fdata, fsizeminusone))
         return (c-data());
   
     return -1;
  @@ -1127,28 +1127,17 @@
     return result;
   }
   
  -void UString::attach(Rep *r)
  -{
  -  rep = r;
  -  rep->ref();
  -}
  -
   void UString::detach()
   {
     if (rep->rc > 1 || rep->baseString) {
       int l = size();
  -    UChar *n = static_cast<UChar *>(malloc(sizeof(UChar) * l));
  +    UChar *n = static_cast<UChar *>(kjs_fast_malloc(sizeof(UChar) * l));
       memcpy(n, data(), l * sizeof(UChar));
       release();
       rep = Rep::create(n, l);
     }
   }
   
  -void UString::release()
  -{
  -  rep->deref();
  -}
  -
   bool operator==(const UString& s1, const UString& s2)
   {
     if (s1.rep->len != s2.rep->len)
  
  
  
  1.34.12.1 +9 -2      JavaScriptCore/kjs/ustring.h
  
  Index: ustring.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/ustring.h,v
  retrieving revision 1.34
  retrieving revision 1.34.12.1
  diff -u -r1.34 -r1.34.12.1
  --- ustring.h	15 Sep 2004 00:16:34 -0000	1.34
  +++ ustring.h	14 Jul 2005 17:33:24 -0000	1.34.12.1
  @@ -24,6 +24,8 @@
   #ifndef _KJS_USTRING_H_
   #define _KJS_USTRING_H_
   
  +#include "fast_malloc.h"
  +
   #if APPLE_CHANGES
   #include <sys/types.h>
   #ifndef KWQ_UNSIGNED_TYPES_DEFINED
  @@ -206,6 +208,7 @@
         friend bool operator==(const UString&, const UString&);
         
         static Rep *create(UChar *d, int l);
  +      static Rep *createCopying(const UChar *d, int l);
         static Rep *create(Rep *base, int offset, int length);
         void destroy();
         
  @@ -216,6 +219,8 @@
         static unsigned computeHash(const UChar *, int length);
         static unsigned computeHash(const char *);
   
  +      KJS_FAST_ALLOCATED;
  +
         void ref() { ++rc; }
         void deref() { if (--rc == 0) destroy(); }
   
  @@ -289,6 +294,8 @@
        */
       ~UString() { release(); }
   
  +    KJS_FAST_ALLOCATED;
  +
       /**
        * Constructs a string from an int.
        */
  @@ -463,9 +470,9 @@
   #endif
     private:
       UString(Rep *r) { attach(r); }
  -    void attach(Rep *r);
  +    void attach(Rep *r) { rep = r; r->ref(); }
       void detach();
  -    void release();
  +    void release() { rep->deref(); }
       int expandedSize(int size, int otherSize) const;
       int usedCapacity() const;
       int usedPreCapacity() const;
  
  
  
  1.23.12.1 +40 -67    JavaScriptCore/kjs/value.cpp
  
  Index: value.cpp
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/value.cpp,v
  retrieving revision 1.23
  retrieving revision 1.23.12.1
  diff -u -r1.23 -r1.23.12.1
  --- value.cpp	8 Dec 2004 22:54:45 -0000	1.23
  +++ value.cpp	14 Jul 2005 17:33:24 -0000	1.23.12.1
  @@ -86,22 +86,6 @@
   #endif
   }
   
  -bool ValueImp::marked() const
  -{
  -  // Simple numbers are always considered marked.
  -#if USE_CONSERVATIVE_GC
  -  return SimpleNumber::is(this) || _marked;
  -#elif TEST_CONSERVATIVE_GC
  -  if (conservativeMark) {
  -    return SimpleNumber::is(this) || (_flags & VI_CONSERVATIVE_MARKED);
  -  } else {
  -    return SimpleNumber::is(this) || (_flags & VI_MARKED);
  -  }
  -#else
  -  return SimpleNumber::is(this) || (_flags & VI_MARKED);
  -#endif
  -}
  -
   #if !USE_CONSERVATIVE_GC
   void ValueImp::setGcAllowed()
   {
  @@ -190,44 +174,6 @@
     return static_cast<uint16_t>(d16);
   }
   
  -// Dispatchers for virtual functions, to special-case simple numbers which
  -// won't be real pointers.
  -
  -Type ValueImp::dispatchType() const
  -{
  -  if (SimpleNumber::is(this))
  -    return NumberType;
  -  return type();
  -}
  -
  -Value ValueImp::dispatchToPrimitive(ExecState *exec, Type preferredType) const
  -{
  -  if (SimpleNumber::is(this))
  -    return Value(const_cast<ValueImp *>(this));
  -  return toPrimitive(exec, preferredType);
  -}
  -
  -bool ValueImp::dispatchToBoolean(ExecState *exec) const
  -{
  -  if (SimpleNumber::is(this))
  -    return SimpleNumber::value(this);
  -  return toBoolean(exec);
  -}
  -
  -double ValueImp::dispatchToNumber(ExecState *exec) const
  -{
  -  if (SimpleNumber::is(this))
  -    return SimpleNumber::value(this);
  -  return toNumber(exec);
  -}
  -
  -UString ValueImp::dispatchToString(ExecState *exec) const
  -{
  -  if (SimpleNumber::is(this))
  -    return UString::from(SimpleNumber::value(this));
  -  return toString(exec);
  -}
  -
   Object ValueImp::dispatchToObject(ExecState *exec) const
   {
     if (SimpleNumber::is(this))
  @@ -235,18 +181,6 @@
     return toObject(exec);
   }
   
  -bool ValueImp::dispatchToUInt32(uint32_t& result) const
  -{
  -  if (SimpleNumber::is(this)) {
  -    long i = SimpleNumber::value(this);
  -    if (i < 0)
  -      return false;
  -    result = i;
  -    return true;
  -  }
  -  return toUInt32(result);
  -}
  -
   // ------------------------------ Value ----------------------------------------
   
   #if !USE_CONSERVATIVE_GC
  @@ -305,6 +239,36 @@
   }
   #endif
   
  +Value::Value(bool b) : rep(b ? BooleanImp::staticTrue : BooleanImp::staticFalse) { }
  +
  +Value::Value(int i)
  +    : rep(SimpleNumber::fits(i) ? SimpleNumber::make(i) : new NumberImp(static_cast<double>(i))) { }
  +
  +Value::Value(unsigned u)
  +    : rep(SimpleNumber::fits(u) ? SimpleNumber::make(u) : new NumberImp(static_cast<double>(u))) { }
  +
  +Value::Value(double d)
  +    : rep(SimpleNumber::fits(d)
  +        ? SimpleNumber::make(static_cast<long>(d))
  +        : (KJS::isNaN(d) ? NumberImp::staticNaN : new NumberImp(d)))
  +{ }
  +
  +Value::Value(double d, bool knownToBeInteger)
  +    : rep((knownToBeInteger ? SimpleNumber::integerFits(d) : SimpleNumber::fits(d))
  +        ? SimpleNumber::make(static_cast<long>(d))
  +        : ((!knownToBeInteger && KJS::isNaN(d)) ? NumberImp::staticNaN : new NumberImp(d)))
  +{ }
  +
  +Value::Value(long l)
  +    : rep(SimpleNumber::fits(l) ? SimpleNumber::make(l) : new NumberImp(static_cast<double>(l))) { }
  +
  +Value::Value(unsigned long l)
  +    : rep(SimpleNumber::fits(l) ? SimpleNumber::make(l) : new NumberImp(static_cast<double>(l))) { }
  +
  +Value::Value(const char *s) : rep(new StringImp(s)) { }
  +
  +Value::Value(const UString &s) : rep(new StringImp(s)) { }
  +
   // ------------------------------ Undefined ------------------------------------
   
   Undefined::Undefined() : Value(UndefinedImp::staticUndefined)
  @@ -383,7 +347,16 @@
     : Value(SimpleNumber::fits(u) ? SimpleNumber::make(u) : new NumberImp(static_cast<double>(u))) { }
   
   Number::Number(double d)
  -  : Value(SimpleNumber::fits(d) ? SimpleNumber::make((long)d) : (KJS::isNaN(d) ? NumberImp::staticNaN : new NumberImp(d))) { }
  +  : Value(SimpleNumber::fits(d)
  +        ? SimpleNumber::make(static_cast<long>(d))
  +        : (KJS::isNaN(d) ? NumberImp::staticNaN : new NumberImp(d)))
  +{ }
  +
  +Number::Number(double d, bool knownToBeInteger)
  +  : Value((knownToBeInteger ? SimpleNumber::integerFits(d) : SimpleNumber::fits(d))
  +        ? SimpleNumber::make(static_cast<long>(d))
  +        : ((!knownToBeInteger && KJS::isNaN(d)) ? NumberImp::staticNaN : new NumberImp(d)))
  +{ }
   
   Number::Number(long int l)
     : Value(SimpleNumber::fits(l) ? SimpleNumber::make(l) : new NumberImp(static_cast<double>(l))) { }
  
  
  
  1.28.12.1 +93 -1     JavaScriptCore/kjs/value.h
  
  Index: value.h
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/kjs/value.h,v
  retrieving revision 1.28
  retrieving revision 1.28.12.1
  diff -u -r1.28 -r1.28.12.1
  --- value.h	23 Nov 2004 02:06:13 -0000	1.28
  +++ value.h	14 Jul 2005 17:33:24 -0000	1.28.12.1
  @@ -94,6 +94,7 @@
       friend class Collector;
       friend class Value;
       friend class ContextImp;
  +    friend class FunctionCallNode;
     public:
   #if USE_CONSERVATIVE_GC
       ValueImp() : _marked(0) {}
  @@ -136,6 +137,7 @@
       Value dispatchToPrimitive(ExecState *exec, Type preferredType = UnspecifiedType) const;
       bool dispatchToBoolean(ExecState *exec) const;
       double dispatchToNumber(ExecState *exec) const;
  +    double dispatchToNumber(ExecState *exec, bool &knownToBeInteger) const;
       UString dispatchToString(ExecState *exec) const;
       bool dispatchToUInt32(uint32_t&) const;
       Object dispatchToObject(ExecState *exec) const;
  @@ -210,6 +212,18 @@
       Value& operator=(const Value &v);
   #endif
   
  +    explicit Value(bool);
  +
  +    explicit Value(int);
  +    explicit Value(unsigned);
  +    explicit Value(double);
  +    explicit Value(long);
  +    explicit Value(unsigned long);
  +    Value(double, bool knownToBeInteger);
  +
  +    explicit Value(const char *);
  +    Value(const UString &);
  +
       bool isNull() const { return rep == 0; }
       ValueImp *imp() const { return rep; }
   
  @@ -246,6 +260,7 @@
        * Performs the ToNumber type conversion operation on this value (ECMA 9.3)
        */
       double toNumber(ExecState *exec) const { return rep->dispatchToNumber(exec); }
  +    double toNumber(ExecState *exec, bool &knownToBeInteger) const { return rep->dispatchToNumber(exec, knownToBeInteger); }
   
       /**
        * Performs the ToInteger type conversion operation on this value (ECMA 9.4)
  @@ -399,6 +414,7 @@
       Number(double d = 0.0);
       Number(long int l);
       Number(long unsigned int l);
  +    Number(double d, bool knownToBeInteger);
   
       double value() const;
       int intValue() const;
  @@ -421,6 +437,82 @@
       explicit Number(NumberImp *v);
     };
   
  -}; // namespace
  +inline bool ValueImp::marked() const
  +{
  +  // Simple numbers are always considered marked.
  +#if USE_CONSERVATIVE_GC
  +  return SimpleNumber::is(this) || _marked;
  +#elif TEST_CONSERVATIVE_GC
  +  if (conservativeMark) {
  +    return SimpleNumber::is(this) || (_flags & VI_CONSERVATIVE_MARKED);
  +  } else {
  +    return SimpleNumber::is(this) || (_flags & VI_MARKED);
  +  }
  +#else
  +  return SimpleNumber::is(this) || (_flags & VI_MARKED);
  +#endif
  +}
  +
  +// Dispatchers for virtual functions, to special-case simple numbers which
  +// won't be real pointers.
  +
  +inline Type ValueImp::dispatchType() const
  +{
  +  if (SimpleNumber::is(this))
  +    return NumberType;
  +  return type();
  +}
  +
  +inline Value ValueImp::dispatchToPrimitive(ExecState *exec, Type preferredType) const
  +{
  +    if (SimpleNumber::is(this))
  +        return Value(const_cast<ValueImp *>(this));
  +    return toPrimitive(exec, preferredType);
  +}
  +
  +inline bool ValueImp::dispatchToBoolean(ExecState *exec) const
  +{
  +    if (SimpleNumber::is(this))
  +        return SimpleNumber::value(this);
  +    return toBoolean(exec);
  +}
  +
  +inline double ValueImp::dispatchToNumber(ExecState *exec) const
  +{
  +    if (SimpleNumber::is(this))
  +        return SimpleNumber::value(this);
  +    return toNumber(exec);
  +}
  +
  +inline double ValueImp::dispatchToNumber(ExecState *exec, bool &knownToBeInteger) const
  +{
  +    if (SimpleNumber::is(this)) {
  +        knownToBeInteger = true;
  +        return SimpleNumber::value(this);
  +    }
  +    knownToBeInteger = false;
  +    return toNumber(exec);
  +}
  +
  +inline UString ValueImp::dispatchToString(ExecState *exec) const
  +{
  +    if (SimpleNumber::is(this))
  +        return UString::from(SimpleNumber::value(this));
  +    return toString(exec);
  +}
  +
  +inline bool ValueImp::dispatchToUInt32(uint32_t& result) const
  +{
  +    if (SimpleNumber::is(this)) {
  +        long i = SimpleNumber::value(this);
  +        if (i < 0)
  +            return false;
  +        result = i;
  +        return true;
  +    }
  +    return toUInt32(result);
  +}
  +
  +} // namespace
   
   #endif // _KJS_VALUE_H_
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.10.12.1 +184 -201  JavaScriptCore/tests/mozilla/expected.html
  
  Index: expected.html
  ===================================================================
  RCS file: /cvs/root/JavaScriptCore/tests/mozilla/expected.html,v
  retrieving revision 1.10
  retrieving revision 1.10.12.1
  diff -u -r1.10 -r1.10.12.1
  --- expected.html	27 Sep 2004 01:01:00 -0000	1.10
  +++ expected.html	14 Jul 2005 17:33:27 -0000	1.10.12.1
  @@ -7,11 +7,11 @@
   <p class='results_summary'>
   Test List: All tests<br>
   Skip List: ecma/Date<br>
  -967 test(s) selected, 962 test(s) completed, 132 failures reported (13.72% failed)<br>
  +967 test(s) selected, 962 test(s) completed, 131 failures reported (13.61% failed)<br>
   Engine command line: /Users/darin/symroots/testkjs <br>
  -OS type: Darwin hq-bentspoon-com.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug  5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC  Power Macintosh powerpc<br>
  -Testcase execution time: 8 minutes, 42 seconds.<br>
  -Tests completed on Sun Sep 26 17:58:04 2004.<br><br>
  +OS type: Darwin darin-adlers-power-mac-g4.local 8.0.0 Darwin Kernel Version 8.0.0: Sat Mar 26 14:15:22 PST 2005; root:xnu-792.obj~1/RELEASE_PPC Power Macintosh powerpc<br>
  +Testcase execution time: 1 minutes, 28 seconds.<br>
  +Tests completed on Wed Apr 20 02:42:18 2005.<br><br>
   [ <a href='#fail_detail'>Failure Details</a> | <a href='#retest_list'>Retest List</a> | <a href='menu.html'>Test Selection Page</a> ]<br>
   <hr>
   <a name='fail_detail'></a>
  @@ -77,10 +77,6 @@
   --> parseFloat("1e2000") = NaN FAILED! expected: Infinity<br>
   --> -s2 == -Infinity || -s2 == -1.7976931348623157e+308  = false FAILED! expected: true<br>
   --> -s3 == -Infinity || -s3 == -1.7976931348623157e+308 = false FAILED! expected: true<br>
  ---> parseInt(s1,10) == 1.7976931348623157e+308 || parseInt(s1,10) == Infinity = false FAILED! expected: true<br>
  ---> parseInt(s2,10) == Infinity || parseInt(s2,10) == 1.7976931348623157e+308 = false FAILED! expected: true<br>
  ---> parseInt(s1) == 1.7976931348623157e+308 || parseInt(s1) == Infinity = false FAILED! expected: true<br>
  ---> parseInt(s2) == Infinity || parseInt(s2) == 1.7976931348623157e+308 = false FAILED! expected: true<br>
   --> 0x1000000000000081 = 1152921504606847000 FAILED! expected: 1152921504606847200<br>
   --> 0x1000000000000281 = 1152921504606847500 FAILED! expected: 1152921504606847700<br>
   --> parseInt("0000001000000001001000110100010101100111100010011010101111011",2) = 18054430506169720 FAILED! expected: 18054430506169724<br>
  @@ -191,15 +187,15 @@
   Failure messages were:<br>
   --> (Wed Dec 31 1969 16:00:00 GMT-0800).toLocaleTimeString() = 4:00:00 PM PST FAILED! expected: 16:00:00<br>
   --> (Wed Dec 31 1969 08:00:00 GMT-0800).toLocaleTimeString() = 8:00:00 AM PST FAILED! expected: 08:00:00<br>
  ---> (Fri Dec 13 1901 12:45:52 GMT-0800).toLocaleTimeString() = 12:45:52 PM PST FAILED! expected: 12:45:52<br>
  ---> (Fri Dec 13 1901 12:45:52 GMT-0800).toLocaleTimeString() = 12:45:52 PM PST FAILED! expected: 12:45:52<br>
  +--> (Fri Dec 13 1901 12:45:52 GMT-0800).toLocaleTimeString() = 1:45:52 PM PDT FAILED! expected: 12:45:52<br>
  +--> (Fri Dec 13 1901 12:45:52 GMT-0800).toLocaleTimeString() = 1:45:52 PM PDT FAILED! expected: 12:45:52<br>
   --> (Fri Dec 31 1999 16:00:00 GMT-0800).toLocaleTimeString() = 4:00:00 PM PST FAILED! expected: 16:00:00<br>
   --> (Sat Jan 01 2000 00:00:00 GMT-0800).toLocaleTimeString() = 12:00:00 AM PST FAILED! expected: 00:00:00<br>
   --> (Mon Feb 28 2000 16:00:00 GMT-0800).toLocaleTimeString() = 4:00:00 PM PST FAILED! expected: 16:00:00<br>
   --> (Mon Feb 28 2000 15:59:59 GMT-0800).toLocaleTimeString() = 3:59:59 PM PST FAILED! expected: 15:59:59<br>
   --> (Tue Feb 29 2000 00:00:00 GMT-0800).toLocaleTimeString() = 12:00:00 AM PST FAILED! expected: 00:00:00<br>
  ---> (Sun Sep 26 2004 17:55:40 GMT-0700).toLocaleTimeString() = 5:55:40 PM PDT FAILED! expected: 17:55:40<br>
  ---> (Mon Sep 27 2004 01:55:40 GMT-0700).toLocaleTimeString() = 1:55:40 AM PDT FAILED! expected: 01:55:40<br>
  +--> (Wed Apr 20 2005 02:41:53 GMT-0700).toLocaleTimeString() = 2:41:53 AM PDT FAILED! expected: 02:41:53<br>
  +--> (Wed Apr 20 2005 10:41:53 GMT-0700).toLocaleTimeString() = 10:41:53 AM PDT FAILED! expected: 10:41:53<br>
   --> (Fri Dec 31 2004 16:00:00 GMT-0800).toLocaleTimeString() = 4:00:00 PM PST FAILED! expected: 16:00:00<br>
   --> (Fri Dec 31 2004 15:59:59 GMT-0800).toLocaleTimeString() = 3:59:59 PM PST FAILED! expected: 15:59:59<br>
   --> (Sat Jan 01 2005 00:00:00 GMT-0800).toLocaleTimeString() = 12:00:00 AM PST FAILED! expected: 00:00:00<br>
  @@ -554,20 +550,8 @@
   --> FAILED!: [reported from test()] Actual: ["Abc"]<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure45'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/octal-002.js'>ecma_3/RegExp/octal-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=141078' target='other_window'>Bug Number 141078</a><br>
  +<a name='failure45'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/perlstress-001.js'>ecma_3/RegExp/perlstress-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
    [ <a href='#failure44'>Previous Failure</a> | <a href='#failure46'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  -<tt>--> STATUS: Testing regexps containing octal escape sequences<br>
  -Failure messages were:<br>
  ---> FAILED!: [reported from test()] Section 8 of test -<br>
  ---> FAILED!: [reported from test()] regexp = /a<br>
  ---> FAILED!: [reported from test()] string = 'a<br>
  ---> FAILED!: [reported from test()] ERROR !!! regexp failed to give expected match array:<br>
  ---> FAILED!: [reported from test()] Expect: ["a<br>
  ---> FAILED!: [reported from test()] Actual: ["a"]<br>
  ---> FAILED!: [reported from test()] <br>
  -</tt><br>
  -<a name='failure46'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/perlstress-001.js'>ecma_3/RegExp/perlstress-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
  - [ <a href='#failure45'>Previous Failure</a> | <a href='#failure47'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing regular expression edge cases<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 14 of test -<br>
  @@ -655,8 +639,8 @@
   --> FAILED!: [reported from test()] Actual: ["aabbaa", "aa", "bb"]<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure47'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/perlstress-002.js'>ecma_3/RegExp/perlstress-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
  - [ <a href='#failure46'>Previous Failure</a> | <a href='#failure48'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure46'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/perlstress-002.js'>ecma_3/RegExp/perlstress-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
  + [ <a href='#failure45'>Previous Failure</a> | <a href='#failure47'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing regular expression edge cases<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 40 of test -<br>
  @@ -674,8 +658,8 @@
   --> FAILED!: [reported from test()] Actual: null<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure48'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-100199.js'>ecma_3/RegExp/regress-100199.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=100199' target='other_window'>Bug Number 100199</a><br>
  - [ <a href='#failure47'>Previous Failure</a> | <a href='#failure49'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure47'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-100199.js'>ecma_3/RegExp/regress-100199.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=100199' target='other_window'>Bug Number 100199</a><br>
  + [ <a href='#failure46'>Previous Failure</a> | <a href='#failure48'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: [], [^] are valid RegExp conditions. Should not cause errors -<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 19 of test -<br>
  @@ -777,8 +761,8 @@
   --> FAILED!: [reported from test()] Actual: null<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure49'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-188206.js'>ecma_3/RegExp/regress-188206.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=188206' target='other_window'>Bug Number 188206</a><br>
  - [ <a href='#failure48'>Previous Failure</a> | <a href='#failure50'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure48'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-188206.js'>ecma_3/RegExp/regress-188206.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=188206' target='other_window'>Bug Number 188206</a><br>
  + [ <a href='#failure47'>Previous Failure</a> | <a href='#failure49'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Invalid use of regexp quantifiers should generate SyntaxErrors<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 1 of test -<br>
  @@ -839,8 +823,8 @@
   --> FAILED!: [reported from test()] Expected value 'SyntaxError', Actual value 'Did not generate ANY error!!!'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure50'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-209067.js'>ecma_3/RegExp/regress-209067.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=209067' target='other_window'>Bug Number 209067</a><br>
  - [ <a href='#failure49'>Previous Failure</a> | <a href='#failure51'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure49'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-209067.js'>ecma_3/RegExp/regress-209067.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=209067' target='other_window'>Bug Number 209067</a><br>
  + [ <a href='#failure48'>Previous Failure</a> | <a href='#failure50'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing complicated str.replace()<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 1 of test -<br>
  @@ -851,8 +835,8 @@
   --> FAILED!: [reported from test()] }</span>'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure51'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-209919.js'>ecma_3/RegExp/regress-209919.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=209919' target='other_window'>Bug Number 209919</a><br>
  - [ <a href='#failure50'>Previous Failure</a> | <a href='#failure52'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure50'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-209919.js'>ecma_3/RegExp/regress-209919.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=209919' target='other_window'>Bug Number 209919</a><br>
  + [ <a href='#failure49'>Previous Failure</a> | <a href='#failure51'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing regexp submatches with quantifiers<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 1 of test -<br>
  @@ -891,8 +875,8 @@
   --> FAILED!: [reported from test()] Actual: ["1.000,00", "", ",00"]<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure52'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-72964.js'>ecma_3/RegExp/regress-72964.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=72964' target='other_window'>Bug Number 72964</a><br>
  - [ <a href='#failure51'>Previous Failure</a> | <a href='#failure53'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure51'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-72964.js'>ecma_3/RegExp/regress-72964.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=72964' target='other_window'>Bug Number 72964</a><br>
  + [ <a href='#failure50'>Previous Failure</a> | <a href='#failure52'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing regular expressions containing non-Latin1 characters<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 3 of test -<br>
  @@ -910,8 +894,8 @@
   --> FAILED!: [reported from test()] Actual: null<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure53'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-78156.js'>ecma_3/RegExp/regress-78156.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=78156' target='other_window'>Bug Number 78156</a><br>
  - [ <a href='#failure52'>Previous Failure</a> | <a href='#failure54'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure52'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-78156.js'>ecma_3/RegExp/regress-78156.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=78156' target='other_window'>Bug Number 78156</a><br>
  + [ <a href='#failure51'>Previous Failure</a> | <a href='#failure53'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing regular expressions with  ^, $, and the m flag -<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 2 of test -<br>
  @@ -929,8 +913,8 @@
   --> FAILED!: [reported from test()] Actual: null<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure54'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-85721.js'>ecma_3/RegExp/regress-85721.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
  - [ <a href='#failure53'>Previous Failure</a> | <a href='#failure55'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure53'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/RegExp/regress-85721.js'>ecma_3/RegExp/regress-85721.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=85721' target='other_window'>Bug Number 85721</a><br>
  + [ <a href='#failure52'>Previous Failure</a> | <a href='#failure54'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Performance: execution of regular expression<br>
   Failure messages were:<br>
   --> FAILED!: Section 4 of test -<br>
  @@ -1051,47 +1035,47 @@
   --> FAILED!: Actual: null<br>
   --> FAILED!: <br>
   </tt><br>
  -<a name='failure55'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Statements/regress-194364.js'>ecma_3/Statements/regress-194364.js</a> failed</b> <br>
  - [ <a href='#failure54'>Previous Failure</a> | <a href='#failure56'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure54'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Statements/regress-194364.js'>ecma_3/Statements/regress-194364.js</a> failed</b> <br>
  + [ <a href='#failure53'>Previous Failure</a> | <a href='#failure55'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 1: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure56'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-001.js'>ecma_3/Unicode/uc-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=23610' target='other_window'>Bug Number 23610</a><br>
  - [ <a href='#failure55'>Previous Failure</a> | <a href='#failure57'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure55'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-001.js'>ecma_3/Unicode/uc-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=23610' target='other_window'>Bug Number 23610</a><br>
  + [ <a href='#failure54'>Previous Failure</a> | <a href='#failure56'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Unicode format-control character (Category Cf) test.<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Unicode format-control character test (Category Cf.)<br>
   --> FAILED!: [reported from test()] Expected value 'no error', Actual value 'no error'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure57'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-002.js'>ecma_3/Unicode/uc-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=23613' target='other_window'>Bug Number 23613</a><br>
  - [ <a href='#failure56'>Previous Failure</a> | <a href='#failure58'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure56'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-002.js'>ecma_3/Unicode/uc-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=23613' target='other_window'>Bug Number 23613</a><br>
  + [ <a href='#failure55'>Previous Failure</a> | <a href='#failure57'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Unicode non-breaking space character test.<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Unicode non-breaking space character regexp test.<br>
   --> FAILED!: [reported from test()] Expected value '0', Actual value '-1'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure58'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-003.js'>ecma_3/Unicode/uc-003.js</a> failed</b> <br>
  - [ <a href='#failure57'>Previous Failure</a> | <a href='#failure59'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure57'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-003.js'>ecma_3/Unicode/uc-003.js</a> failed</b> <br>
  + [ <a href='#failure56'>Previous Failure</a> | <a href='#failure58'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   yylex: ERROR.<br>
   Exception, line 32: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure59'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-005.js'>ecma_3/Unicode/uc-005.js</a> failed</b> <br>
  - [ <a href='#failure58'>Previous Failure</a> | <a href='#failure60'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure58'></a><dd><b>Testcase <a target='other_window' href='./ecma_3/Unicode/uc-005.js'>ecma_3/Unicode/uc-005.js</a> failed</b> <br>
  + [ <a href='#failure57'>Previous Failure</a> | <a href='#failure59'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   yylex: ERROR.<br>
   Exception, line 118: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure60'></a><dd><b>Testcase <a target='other_window' href='./js1_2/Array/tostring_1.js'>js1_2/Array/tostring_1.js</a> failed</b> <br>
  - [ <a href='#failure59'>Previous Failure</a> | <a href='#failure61'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure59'></a><dd><b>Testcase <a target='other_window' href='./js1_2/Array/tostring_1.js'>js1_2/Array/tostring_1.js</a> failed</b> <br>
  + [ <a href='#failure58'>Previous Failure</a> | <a href='#failure60'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> var a = new Array(); a.toString() =  FAILED! expected: []<br>
  @@ -1102,16 +1086,16 @@
   --> var b = new Array(1000); b.toString() = ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
 ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, FAILED! expected: [1000]<br>
   --> b.length = 1000 FAILED! expected: 1<br>
   </tt><br>
  -<a name='failure61'></a><dd><b>Testcase <a target='other_window' href='./js1_2/Array/tostring_2.js'>js1_2/Array/tostring_2.js</a> failed</b> <br>
  - [ <a href='#failure60'>Previous Failure</a> | <a href='#failure62'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure60'></a><dd><b>Testcase <a target='other_window' href='./js1_2/Array/tostring_2.js'>js1_2/Array/tostring_2.js</a> failed</b> <br>
  + [ <a href='#failure59'>Previous Failure</a> | <a href='#failure61'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> a.toString() =  FAILED! expected: []<br>
   --> String( a ) =  FAILED! expected: []<br>
   --> a +'' =  FAILED! expected: []<br>
   </tt><br>
  -<a name='failure62'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/function-001-n.js'>js1_2/function/function-001-n.js</a> failed</b> <br>
  - [ <a href='#failure61'>Previous Failure</a> | <a href='#failure63'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure61'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/function-001-n.js'>js1_2/function/function-001-n.js</a> failed</b> <br>
  + [ <a href='#failure60'>Previous Failure</a> | <a href='#failure62'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 3, got 0<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1119,8 +1103,8 @@
   --> eval("function f(){}function g(){}") = undefined FAILED! expected: error<br>
   OK.<br>
   </tt><br>
  -<a name='failure63'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/Function_object.js'>js1_2/function/Function_object.js</a> failed</b> <br>
  - [ <a href='#failure62'>Previous Failure</a> | <a href='#failure64'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure62'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/Function_object.js'>js1_2/function/Function_object.js</a> failed</b> <br>
  + [ <a href='#failure61'>Previous Failure</a> | <a href='#failure63'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> f.name = undefined FAILED! expected: a_test_function<br>
  @@ -1128,29 +1112,29 @@
   --> (new Function()).name = undefined FAILED! expected: anonymous<br>
   } FAILED! expected: <br>
   </tt><br>
  -<a name='failure64'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/Number.js'>js1_2/function/Number.js</a> failed</b> <br>
  - [ <a href='#failure63'>Previous Failure</a> | <a href='#failure65'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure63'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/Number.js'>js1_2/function/Number.js</a> failed</b> <br>
  + [ <a href='#failure62'>Previous Failure</a> | <a href='#failure64'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> Number([1,2,3])          = NaN FAILED! expected: 3<br>
   </tt><br>
  -<a name='failure65'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/regexparg-1.js'>js1_2/function/regexparg-1.js</a> failed</b> <br>
  - [ <a href='#failure64'>Previous Failure</a> | <a href='#failure66'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure64'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/regexparg-1.js'>js1_2/function/regexparg-1.js</a> failed</b> <br>
  + [ <a href='#failure63'>Previous Failure</a> | <a href='#failure65'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   --> JS_1.2 The variable statment<br>
   Exception, line 81: TypeError - Object /abc/ (result of expression x) does not allow calls.<br>
   </tt><br>
  -<a name='failure66'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/String.js'>js1_2/function/String.js</a> failed</b> <br>
  - [ <a href='#failure65'>Previous Failure</a> | <a href='#failure67'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure65'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/String.js'>js1_2/function/String.js</a> failed</b> <br>
  + [ <a href='#failure64'>Previous Failure</a> | <a href='#failure66'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> String({p:1})            = [object Object] FAILED! expected: {p:1}<br>
   --> String([1,2,3])             = 1,2,3 FAILED! expected: [1, 2, 3]<br>
   </tt><br>
  -<a name='failure67'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/tostring-1.js'>js1_2/function/tostring-1.js</a> failed</b> <br>
  - [ <a href='#failure66'>Previous Failure</a> | <a href='#failure68'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure66'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/tostring-1.js'>js1_2/function/tostring-1.js</a> failed</b> <br>
  + [ <a href='#failure65'>Previous Failure</a> | <a href='#failure67'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   } FAILED! expected: <br>
  @@ -1159,8 +1143,8 @@
   } FAILED! expected: <br>
   } FAILED! expected: <br>
   </tt><br>
  -<a name='failure68'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/tostring-2.js'>js1_2/function/tostring-2.js</a> failed</b> <br>
  - [ <a href='#failure67'>Previous Failure</a> | <a href='#failure69'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure67'></a><dd><b>Testcase <a target='other_window' href='./js1_2/function/tostring-2.js'>js1_2/function/tostring-2.js</a> failed</b> <br>
  + [ <a href='#failure66'>Previous Failure</a> | <a href='#failure68'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   } FAILED! expected: <br>
  @@ -1173,29 +1157,29 @@
   } FAILED! expected: <br>
   } FAILED! expected: <br>
   </tt><br>
  -<a name='failure69'></a><dd><b>Testcase <a target='other_window' href='./js1_2/Objects/toString-001.js'>js1_2/Objects/toString-001.js</a> failed</b> <br>
  - [ <a href='#failure68'>Previous Failure</a> | <a href='#failure70'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure68'></a><dd><b>Testcase <a target='other_window' href='./js1_2/Objects/toString-001.js'>js1_2/Objects/toString-001.js</a> failed</b> <br>
  + [ <a href='#failure67'>Previous Failure</a> | <a href='#failure69'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   --> JS1_2 Object.toString()<br>
   Exception, line 104: TypeError - Object /^\{(.*)\}$/ (result of expression ^\{(.*)\}$) does not allow calls.<br>
   </tt><br>
  -<a name='failure70'></a><dd><b>Testcase <a target='other_window' href='./js1_2/operator/equality.js'>js1_2/operator/equality.js</a> failed</b> <br>
  - [ <a href='#failure69'>Previous Failure</a> | <a href='#failure71'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure69'></a><dd><b>Testcase <a target='other_window' href='./js1_2/operator/equality.js'>js1_2/operator/equality.js</a> failed</b> <br>
  + [ <a href='#failure68'>Previous Failure</a> | <a href='#failure70'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> (new String('x') == 'x')                  = true FAILED! expected: false<br>
   --> ('x' == new String('x'))                  = true FAILED! expected: false<br>
   </tt><br>
  -<a name='failure71'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/beginLine.js'>js1_2/regexp/beginLine.js</a> failed</b> <br>
  - [ <a href='#failure70'>Previous Failure</a> | <a href='#failure72'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure70'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/beginLine.js'>js1_2/regexp/beginLine.js</a> failed</b> <br>
  + [ <a href='#failure69'>Previous Failure</a> | <a href='#failure71'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   123xyz'.match(new RegExp('^\d+')) = null FAILED! expected: 123<br>
   </tt><br>
  -<a name='failure72'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/compile.js'>js1_2/regexp/compile.js</a> failed</b> <br>
  - [ <a href='#failure71'>Previous Failure</a> | <a href='#failure73'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure71'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/compile.js'>js1_2/regexp/compile.js</a> failed</b> <br>
  + [ <a href='#failure70'>Previous Failure</a> | <a href='#failure72'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1203,14 +1187,14 @@
   --> As described in Netscape doc "Whats new in JavaScript 1.2" RegExp: compile<br>
   Exception, line 44: TypeError - Value undefined (result of expression regularExpression.compile) is not object.<br>
   </tt><br>
  -<a name='failure73'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/endLine.js'>js1_2/regexp/endLine.js</a> failed</b> <br>
  - [ <a href='#failure72'>Previous Failure</a> | <a href='#failure74'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure72'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/endLine.js'>js1_2/regexp/endLine.js</a> failed</b> <br>
  + [ <a href='#failure71'>Previous Failure</a> | <a href='#failure73'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   xyz'.match(new RegExp('\d+$')) = null FAILED! expected: 890<br>
   </tt><br>
  -<a name='failure74'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_input.js'>js1_2/regexp/RegExp_input.js</a> failed</b> <br>
  - [ <a href='#failure73'>Previous Failure</a> | <a href='#failure75'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure73'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_input.js'>js1_2/regexp/RegExp_input.js</a> failed</b> <br>
  + [ <a href='#failure72'>Previous Failure</a> | <a href='#failure74'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> RegExp.input = 'abcd12357efg'; /\d+/.exec() = null FAILED! expected: 12357<br>
  @@ -1219,8 +1203,8 @@
   --> RegExp.input = 'abcd12357efg'; /[h-z]+/.test() = true FAILED! expected: false<br>
   --> RegExp.input = 'abcd12357efg'; (new RegExp('[h-z]+')).test() = true FAILED! expected: false<br>
   </tt><br>
  -<a name='failure75'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_input_as_array.js'>js1_2/regexp/RegExp_input_as_array.js</a> failed</b> <br>
  - [ <a href='#failure74'>Previous Failure</a> | <a href='#failure76'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure74'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_input_as_array.js'>js1_2/regexp/RegExp_input_as_array.js</a> failed</b> <br>
  + [ <a href='#failure73'>Previous Failure</a> | <a href='#failure75'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> RegExp['$_'] = 'abcd12357efg'; /\d+/.exec() = null FAILED! expected: 12357<br>
  @@ -1229,15 +1213,15 @@
   --> RegExp['$_'] = 'abcd12357efg'; /[h-z]+/.test() = true FAILED! expected: false<br>
   --> RegExp['$_'] = 'abcd12357efg'; (new RegExp('[h-z]+')).test() = true FAILED! expected: false<br>
   </tt><br>
  -<a name='failure76'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastIndex.js'>js1_2/regexp/RegExp_lastIndex.js</a> failed</b> <br>
  - [ <a href='#failure75'>Previous Failure</a> | <a href='#failure77'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure75'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastIndex.js'>js1_2/regexp/RegExp_lastIndex.js</a> failed</b> <br>
  + [ <a href='#failure74'>Previous Failure</a> | <a href='#failure76'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> re=/x./g; re.lastIndex=4; re.exec('xyabcdxa') = xa FAILED! expected: ["xa"]<br>
   --> re.exec('xyabcdef') = xy FAILED! expected: ["xy"]<br>
   </tt><br>
  -<a name='failure77'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastMatch.js'>js1_2/regexp/RegExp_lastMatch.js</a> failed</b> <br>
  - [ <a href='#failure76'>Previous Failure</a> | <a href='#failure78'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure76'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastMatch.js'>js1_2/regexp/RegExp_lastMatch.js</a> failed</b> <br>
  + [ <a href='#failure75'>Previous Failure</a> | <a href='#failure77'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'foo'.match(/foo/); RegExp.lastMatch = undefined FAILED! expected: foo<br>
  @@ -1247,8 +1231,8 @@
   --> 'abcdefg'.match(/^..(cd)[a-z]+/); RegExp.lastMatch = undefined FAILED! expected: abcdefg<br>
   --> 'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/); RegExp.lastMatch = undefined FAILED! expected: abcdefgabcdefg<br>
   </tt><br>
  -<a name='failure78'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastMatch_as_array.js'>js1_2/regexp/RegExp_lastMatch_as_array.js</a> failed</b> <br>
  - [ <a href='#failure77'>Previous Failure</a> | <a href='#failure79'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure77'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastMatch_as_array.js'>js1_2/regexp/RegExp_lastMatch_as_array.js</a> failed</b> <br>
  + [ <a href='#failure76'>Previous Failure</a> | <a href='#failure78'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'foo'.match(/foo/); RegExp['$&'] = undefined FAILED! expected: foo<br>
  @@ -1258,8 +1242,8 @@
   --> 'abcdefg'.match(/^..(cd)[a-z]+/); RegExp['$&'] = undefined FAILED! expected: abcdefg<br>
   --> 'abcdefgabcdefg'.match(/(a(b(c(d)e)f)g)\1/); RegExp['$&'] = undefined FAILED! expected: abcdefgabcdefg<br>
   </tt><br>
  -<a name='failure79'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastParen.js'>js1_2/regexp/RegExp_lastParen.js</a> failed</b> <br>
  - [ <a href='#failure78'>Previous Failure</a> | <a href='#failure80'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure78'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastParen.js'>js1_2/regexp/RegExp_lastParen.js</a> failed</b> <br>
  + [ <a href='#failure77'>Previous Failure</a> | <a href='#failure79'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'abcd'.match(/(abc)d/); RegExp.lastParen = undefined FAILED! expected: abc<br>
  @@ -1272,8 +1256,8 @@
   --> 'abcdefg'.match(new RegExp('(^a)bc')); RegExp.lastParen = undefined FAILED! expected: a<br>
   --> 'abcdefg'.match(/bc/); RegExp.lastParen = undefined FAILED! expected: <br>
   </tt><br>
  -<a name='failure80'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastParen_as_array.js'>js1_2/regexp/RegExp_lastParen_as_array.js</a> failed</b> <br>
  - [ <a href='#failure79'>Previous Failure</a> | <a href='#failure81'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure79'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_lastParen_as_array.js'>js1_2/regexp/RegExp_lastParen_as_array.js</a> failed</b> <br>
  + [ <a href='#failure78'>Previous Failure</a> | <a href='#failure80'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'abcd'.match(/(abc)d/); RegExp['$+'] = undefined FAILED! expected: abc<br>
  @@ -1286,8 +1270,8 @@
   --> 'abcdefg'.match(new RegExp('(^a)bc')); RegExp['$+'] = undefined FAILED! expected: a<br>
   --> 'abcdefg'.match(/bc/); RegExp['$+'] = undefined FAILED! expected: <br>
   </tt><br>
  -<a name='failure81'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_leftContext.js'>js1_2/regexp/RegExp_leftContext.js</a> failed</b> <br>
  - [ <a href='#failure80'>Previous Failure</a> | <a href='#failure82'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure80'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_leftContext.js'>js1_2/regexp/RegExp_leftContext.js</a> failed</b> <br>
  + [ <a href='#failure79'>Previous Failure</a> | <a href='#failure81'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'abc123xyz'.match(/123/); RegExp.leftContext = undefined FAILED! expected: abc<br>
  @@ -1298,8 +1282,8 @@
   --> 'xxxx'.match(new RegExp('$')); RegExp.leftContext = undefined FAILED! expected: xxxx<br>
   --> 'test'.match(new RegExp('^')); RegExp.leftContext = undefined FAILED! expected: <br>
   </tt><br>
  -<a name='failure82'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_leftContext_as_array.js'>js1_2/regexp/RegExp_leftContext_as_array.js</a> failed</b> <br>
  - [ <a href='#failure81'>Previous Failure</a> | <a href='#failure83'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure81'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_leftContext_as_array.js'>js1_2/regexp/RegExp_leftContext_as_array.js</a> failed</b> <br>
  + [ <a href='#failure80'>Previous Failure</a> | <a href='#failure82'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'abc123xyz'.match(/123/); RegExp['$`'] = undefined FAILED! expected: abc<br>
  @@ -1310,8 +1294,8 @@
   --> 'xxxx'.match(new RegExp('$')); RegExp['$`'] = undefined FAILED! expected: xxxx<br>
   --> 'test'.match(new RegExp('^')); RegExp['$`'] = undefined FAILED! expected: <br>
   </tt><br>
  -<a name='failure83'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_multiline.js'>js1_2/regexp/RegExp_multiline.js</a> failed</b> <br>
  - [ <a href='#failure82'>Previous Failure</a> | <a href='#failure84'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure82'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_multiline.js'>js1_2/regexp/RegExp_multiline.js</a> failed</b> <br>
  + [ <a href='#failure81'>Previous Failure</a> | <a href='#failure83'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> RegExp.multiline = undefined FAILED! expected: false<br>
  @@ -1321,8 +1305,8 @@
   --> (multiline == true) 'a11\na22\na23\na24'.match(/a..$/g) = a24 FAILED! expected: a11,a22,a23,a24<br>
   --> (multiline == true) 'a11\na22\na23\na24'.match(new RegExp('a..$','g')) = a24 FAILED! expected: a11,a22,a23,a24<br>
   </tt><br>
  -<a name='failure84'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_multiline_as_array.js'>js1_2/regexp/RegExp_multiline_as_array.js</a> failed</b> <br>
  - [ <a href='#failure83'>Previous Failure</a> | <a href='#failure85'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure83'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_multiline_as_array.js'>js1_2/regexp/RegExp_multiline_as_array.js</a> failed</b> <br>
  + [ <a href='#failure82'>Previous Failure</a> | <a href='#failure84'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> RegExp['$*'] = undefined FAILED! expected: false<br>
  @@ -1332,8 +1316,8 @@
   --> (['$*'] == true) 'a11\na22\na23\na24'.match(/a..$/g) = a24 FAILED! expected: a11,a22,a23,a24<br>
   --> (['$*'] == true) 'a11\na22\na23\na24'.match(new RegExp('a..$','g')) = a24 FAILED! expected: a11,a22,a23,a24<br>
   </tt><br>
  -<a name='failure85'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_rightContext.js'>js1_2/regexp/RegExp_rightContext.js</a> failed</b> <br>
  - [ <a href='#failure84'>Previous Failure</a> | <a href='#failure86'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure84'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_rightContext.js'>js1_2/regexp/RegExp_rightContext.js</a> failed</b> <br>
  + [ <a href='#failure83'>Previous Failure</a> | <a href='#failure85'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'abc123xyz'.match(/123/); RegExp.rightContext = undefined FAILED! expected: xyz<br>
  @@ -1344,8 +1328,8 @@
   --> 'xxxx'.match(new RegExp('$')); RegExp.rightContext = undefined FAILED! expected: <br>
   --> 'test'.match(new RegExp('^')); RegExp.rightContext = undefined FAILED! expected: test<br>
   </tt><br>
  -<a name='failure86'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_rightContext_as_array.js'>js1_2/regexp/RegExp_rightContext_as_array.js</a> failed</b> <br>
  - [ <a href='#failure85'>Previous Failure</a> | <a href='#failure87'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure85'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/RegExp_rightContext_as_array.js'>js1_2/regexp/RegExp_rightContext_as_array.js</a> failed</b> <br>
  + [ <a href='#failure84'>Previous Failure</a> | <a href='#failure86'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'abc123xyz'.match(/123/); RegExp['$''] = undefined FAILED! expected: xyz<br>
  @@ -1356,24 +1340,24 @@
   --> 'xxxx'.match(new RegExp('$')); RegExp['$''] = undefined FAILED! expected: <br>
   --> 'test'.match(new RegExp('^')); RegExp['$''] = undefined FAILED! expected: test<br>
   </tt><br>
  -<a name='failure87'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/regress-6359.js'>js1_2/regexp/regress-6359.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=http://bugzilla.mozilla.org/show_bug.cgi?id=6359' target='other_window'>Bug Number http://bugzilla.mozilla.org/show_bug.cgi?id=6359</a><br>
  - [ <a href='#failure86'>Previous Failure</a> | <a href='#failure88'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure86'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/regress-6359.js'>js1_2/regexp/regress-6359.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=http://bugzilla.mozilla.org/show_bug.cgi?id=6359' target='other_window'>Bug Number http://bugzilla.mozilla.org/show_bug.cgi?id=6359</a><br>
  + [ <a href='#failure85'>Previous Failure</a> | <a href='#failure87'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   --> BUGNUMBER: http://bugzilla.mozilla.org/show_bug.cgi?id=6359<br>
   Exception, line 57: TypeError - Object /(a*)b\1+/ (result of expression (a*)b\1+) does not allow calls.<br>
   </tt><br>
  -<a name='failure88'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/regress-9141.js'>js1_2/regexp/regress-9141.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=http://bugzilla.mozilla.org/show_bug.cgi?id=9141' target='other_window'>Bug Number http://bugzilla.mozilla.org/show_bug.cgi?id=9141</a><br>
  - [ <a href='#failure87'>Previous Failure</a> | <a href='#failure89'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure87'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/regress-9141.js'>js1_2/regexp/regress-9141.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=http://bugzilla.mozilla.org/show_bug.cgi?id=9141' target='other_window'>Bug Number http://bugzilla.mozilla.org/show_bug.cgi?id=9141</a><br>
  + [ <a href='#failure86'>Previous Failure</a> | <a href='#failure88'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   --> BUGNUMBER: http://bugzilla.mozilla.org/show_bug.cgi?id=9141<br>
   Exception, line 74: TypeError - Object /(?:xx|x)*/ (result of expression (?:xx|x)*) does not allow calls.<br>
   </tt><br>
  -<a name='failure89'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/simple_form.js'>js1_2/regexp/simple_form.js</a> failed</b> <br>
  - [ <a href='#failure88'>Previous Failure</a> | <a href='#failure90'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure88'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/simple_form.js'>js1_2/regexp/simple_form.js</a> failed</b> <br>
  + [ <a href='#failure87'>Previous Failure</a> | <a href='#failure89'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1381,14 +1365,14 @@
   --> As described in Netscape doc "Whats new in JavaScript 1.2" RegExp: simple form<br>
   Exception, line 44: TypeError - Object /[0-9]{3}/ (result of expression [0-9]{3}) does not allow calls.<br>
   </tt><br>
  -<a name='failure90'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/special_characters.js'>js1_2/regexp/special_characters.js</a> failed</b> <br>
  - [ <a href='#failure89'>Previous Failure</a> | <a href='#failure91'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure89'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/special_characters.js'>js1_2/regexp/special_characters.js</a> failed</b> <br>
  + [ <a href='#failure88'>Previous Failure</a> | <a href='#failure90'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'ab a  b'.match(/a{2}/) = null FAILED! expected: a<br>
   </tt><br>
  -<a name='failure91'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/string_split.js'>js1_2/regexp/string_split.js</a> failed</b> <br>
  - [ <a href='#failure90'>Previous Failure</a> | <a href='#failure92'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure90'></a><dd><b>Testcase <a target='other_window' href='./js1_2/regexp/string_split.js'>js1_2/regexp/string_split.js</a> failed</b> <br>
  + [ <a href='#failure89'>Previous Failure</a> | <a href='#failure91'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> 'abc'.split(/[a-z]/) = ,,, FAILED! expected: ,,<br>
  @@ -1396,8 +1380,8 @@
   --> 'abc'.split(new RegExp('[a-z]')) = ,,, FAILED! expected: ,,<br>
   --> 'abc'.split(new RegExp('[a-z]')) = ,,, FAILED! expected: ,,<br>
   </tt><br>
  -<a name='failure92'></a><dd><b>Testcase <a target='other_window' href='./js1_2/String/concat.js'>js1_2/String/concat.js</a> failed</b> <br>
  - [ <a href='#failure91'>Previous Failure</a> | <a href='#failure93'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure91'></a><dd><b>Testcase <a target='other_window' href='./js1_2/String/concat.js'>js1_2/String/concat.js</a> failed</b> <br>
  + [ <a href='#failure90'>Previous Failure</a> | <a href='#failure92'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> aString.concat([])      = test string FAILED! expected: test string[]<br>
  @@ -1405,29 +1389,29 @@
   --> 'abcde'.concat([])      = abcde FAILED! expected: abcde[]<br>
   --> 'abcde'.concat([1,2,3]) = abcde1,2,3 FAILED! expected: abcde[1, 2, 3]<br>
   </tt><br>
  -<a name='failure93'></a><dd><b>Testcase <a target='other_window' href='./js1_2/String/slice.js'>js1_2/String/slice.js</a> failed</b> <br>
  - [ <a href='#failure92'>Previous Failure</a> | <a href='#failure94'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure92'></a><dd><b>Testcase <a target='other_window' href='./js1_2/String/slice.js'>js1_2/String/slice.js</a> failed</b> <br>
  + [ <a href='#failure91'>Previous Failure</a> | <a href='#failure93'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> exhaustive String.slice test 1 = false FAILED! expected: true<br>
   --> exhaustive String.slice test 2 = false FAILED! expected: true<br>
   </tt><br>
  -<a name='failure94'></a><dd><b>Testcase <a target='other_window' href='./js1_2/version120/boolean-001.js'>js1_2/version120/boolean-001.js</a> failed</b> <br>
  - [ <a href='#failure93'>Previous Failure</a> | <a href='#failure95'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure93'></a><dd><b>Testcase <a target='other_window' href='./js1_2/version120/boolean-001.js'>js1_2/version120/boolean-001.js</a> failed</b> <br>
  + [ <a href='#failure92'>Previous Failure</a> | <a href='#failure94'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> new Boolean(false) = true FAILED! expected: false<br>
   </tt><br>
  -<a name='failure95'></a><dd><b>Testcase <a target='other_window' href='./js1_2/version120/regress-99663.js'>js1_2/version120/regress-99663.js</a> failed</b> <br>
  - [ <a href='#failure94'>Previous Failure</a> | <a href='#failure96'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure94'></a><dd><b>Testcase <a target='other_window' href='./js1_2/version120/regress-99663.js'>js1_2/version120/regress-99663.js</a> failed</b> <br>
  + [ <a href='#failure93'>Previous Failure</a> | <a href='#failure95'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Regression test for Bugzilla bug 99663<br>
   Failure messages were:<br>
   --> Section 1 of test - got Error: Can't find variable: it FAILED! expected: a "read-only" error<br>
   --> Section 2 of test - got Error: Can't find variable: it FAILED! expected: a "read-only" error<br>
   --> Section 3 of test - got Error: Can't find variable: it FAILED! expected: a "read-only" error<br>
   </tt><br>
  -<a name='failure96'></a><dd><b>Testcase <a target='other_window' href='./js1_3/regress/function-001-n.js'>js1_3/regress/function-001-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
  - [ <a href='#failure95'>Previous Failure</a> | <a href='#failure97'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure95'></a><dd><b>Testcase <a target='other_window' href='./js1_3/regress/function-001-n.js'>js1_3/regress/function-001-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
  + [ <a href='#failure94'>Previous Failure</a> | <a href='#failure96'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 3, got 0<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1436,8 +1420,8 @@
   --> eval("function f(){}function g(){}") = undefined FAILED! expected: error<br>
   OK.<br>
   </tt><br>
  -<a name='failure97'></a><dd><b>Testcase <a target='other_window' href='./js1_3/Script/function-001-n.js'>js1_3/Script/function-001-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
  - [ <a href='#failure96'>Previous Failure</a> | <a href='#failure98'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure96'></a><dd><b>Testcase <a target='other_window' href='./js1_3/Script/function-001-n.js'>js1_3/Script/function-001-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=10278' target='other_window'>Bug Number 10278</a><br>
  + [ <a href='#failure95'>Previous Failure</a> | <a href='#failure97'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 3, got 0<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1446,35 +1430,35 @@
   --> eval("function f(){}function g(){}") = undefined FAILED! expected: error<br>
   OK.<br>
   </tt><br>
  -<a name='failure98'></a><dd><b>Testcase <a target='other_window' href='./js1_3/Script/script-001.js'>js1_3/Script/script-001.js</a> failed</b> <br>
  - [ <a href='#failure97'>Previous Failure</a> | <a href='#failure99'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure97'></a><dd><b>Testcase <a target='other_window' href='./js1_3/Script/script-001.js'>js1_3/Script/script-001.js</a> failed</b> <br>
  + [ <a href='#failure96'>Previous Failure</a> | <a href='#failure98'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   --> script-001 NativeScript<br>
   Exception: ReferenceError - Can't find variable: Script<br>
   </tt><br>
  -<a name='failure99'></a><dd><b>Testcase <a target='other_window' href='./js1_4/Functions/function-001.js'>js1_4/Functions/function-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=324455' target='other_window'>Bug Number 324455</a><br>
  - [ <a href='#failure98'>Previous Failure</a> | <a href='#failure100'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure98'></a><dd><b>Testcase <a target='other_window' href='./js1_4/Functions/function-001.js'>js1_4/Functions/function-001.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=324455' target='other_window'>Bug Number 324455</a><br>
  + [ <a href='#failure97'>Previous Failure</a> | <a href='#failure99'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> return arguments when function contains an arguments property = [object Arguments] FAILED! expected: PASS<br>
   --> return function.arguments when function contains an arguments property = [object Arguments] FAILED! expected: PASS<br>
   </tt><br>
  -<a name='failure100'></a><dd><b>Testcase <a target='other_window' href='./js1_4/Regress/function-002.js'>js1_4/Regress/function-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=330462' target='other_window'>Bug Number 330462</a><br>
  - [ <a href='#failure99'>Previous Failure</a> | <a href='#failure101'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure99'></a><dd><b>Testcase <a target='other_window' href='./js1_4/Regress/function-002.js'>js1_4/Regress/function-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=330462' target='other_window'>Bug Number 330462</a><br>
  + [ <a href='#failure98'>Previous Failure</a> | <a href='#failure100'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
   --> f1.toString() == dec1 = false FAILED! expected: true<br>
   </tt><br>
  -<a name='failure101'></a><dd><b>Testcase <a target='other_window' href='./js1_4/Regress/function-003.js'>js1_4/Regress/function-003.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=310514' target='other_window'>Bug Number 310514</a><br>
  - [ <a href='#failure100'>Previous Failure</a> | <a href='#failure102'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure100'></a><dd><b>Testcase <a target='other_window' href='./js1_4/Regress/function-003.js'>js1_4/Regress/function-003.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=310514' target='other_window'>Bug Number 310514</a><br>
  + [ <a href='#failure99'>Previous Failure</a> | <a href='#failure101'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt><br>
   Failure messages were:<br>
  ---> StripSpaces(Array.prototype.concat.toString()).substring(0,17) = (Internalfunction FAILED! expected: functionconcat(){<br>
  +--> StripSpaces(Array.prototype.concat.toString()).substring(0,17) = (InternalFunction FAILED! expected: functionconcat(){<br>
   </tt><br>
  -<a name='failure102'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Array/regress-157652.js'>js1_5/Array/regress-157652.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=157652' target='other_window'>Bug Number 157652</a><br>
  - [ <a href='#failure101'>Previous Failure</a> | <a href='#failure103'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure101'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Array/regress-157652.js'>js1_5/Array/regress-157652.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=157652' target='other_window'>Bug Number 157652</a><br>
  + [ <a href='#failure100'>Previous Failure</a> | <a href='#failure102'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 3, got 0<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1483,36 +1467,36 @@
   --> --- NOTE: IN THIS TESTCASE, WE EXPECT EXIT CODE 3 ---<br>
   OK.<br>
   </tt><br>
  -<a name='failure103'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-001.js'>js1_5/Exceptions/catchguard-001.js</a> failed</b> <br>
  - [ <a href='#failure102'>Previous Failure</a> | <a href='#failure104'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure102'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-001.js'>js1_5/Exceptions/catchguard-001.js</a> failed</b> <br>
  + [ <a href='#failure101'>Previous Failure</a> | <a href='#failure103'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 42: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure104'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-002.js'>js1_5/Exceptions/catchguard-002.js</a> failed</b> <br>
  - [ <a href='#failure103'>Previous Failure</a> | <a href='#failure105'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure103'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-002.js'>js1_5/Exceptions/catchguard-002.js</a> failed</b> <br>
  + [ <a href='#failure102'>Previous Failure</a> | <a href='#failure104'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 42: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure105'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-003.js'>js1_5/Exceptions/catchguard-003.js</a> failed</b> <br>
  - [ <a href='#failure104'>Previous Failure</a> | <a href='#failure106'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure104'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/catchguard-003.js'>js1_5/Exceptions/catchguard-003.js</a> failed</b> <br>
  + [ <a href='#failure103'>Previous Failure</a> | <a href='#failure105'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 42: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure106'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/errstack-001.js'>js1_5/Exceptions/errstack-001.js</a> failed</b> <br>
  - [ <a href='#failure105'>Previous Failure</a> | <a href='#failure107'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure105'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/errstack-001.js'>js1_5/Exceptions/errstack-001.js</a> failed</b> <br>
  + [ <a href='#failure104'>Previous Failure</a> | <a href='#failure106'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception: TypeError - Undefined value<br>
   </tt><br>
  -<a name='failure107'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/regress-123002.js'>js1_5/Exceptions/regress-123002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=123002' target='other_window'>Bug Number 123002</a><br>
  - [ <a href='#failure106'>Previous Failure</a> | <a href='#failure108'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure106'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/regress-123002.js'>js1_5/Exceptions/regress-123002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=123002' target='other_window'>Bug Number 123002</a><br>
  + [ <a href='#failure105'>Previous Failure</a> | <a href='#failure107'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing Error.length<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section "Error" of test -<br>
  @@ -1537,8 +1521,8 @@
   --> FAILED!: [reported from test()] Expected value '3', Actual value '0'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure108'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/regress-50447.js'>js1_5/Exceptions/regress-50447.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=50447' target='other_window'>Bug Number 50447</a><br>
  - [ <a href='#failure107'>Previous Failure</a> | <a href='#failure109'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure107'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Exceptions/regress-50447.js'>js1_5/Exceptions/regress-50447.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=50447' target='other_window'>Bug Number 50447</a><br>
  + [ <a href='#failure106'>Previous Failure</a> | <a href='#failure108'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1546,99 +1530,99 @@
   --> STATUS: Test (non-ECMA) Error object properties fileName, lineNumber<br>
   Exception: TypeError - Undefined value<br>
   </tt><br>
  -<a name='failure109'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-001.js'>js1_5/GetSet/getset-001.js</a> failed</b> <br>
  - [ <a href='#failure108'>Previous Failure</a> | <a href='#failure110'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure108'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-001.js'>js1_5/GetSet/getset-001.js</a> failed</b> <br>
  + [ <a href='#failure107'>Previous Failure</a> | <a href='#failure109'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 33: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure110'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-002.js'>js1_5/GetSet/getset-002.js</a> failed</b> <br>
  - [ <a href='#failure109'>Previous Failure</a> | <a href='#failure111'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure109'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-002.js'>js1_5/GetSet/getset-002.js</a> failed</b> <br>
  + [ <a href='#failure108'>Previous Failure</a> | <a href='#failure110'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 29: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure111'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-003.js'>js1_5/GetSet/getset-003.js</a> failed</b> <br>
  - [ <a href='#failure110'>Previous Failure</a> | <a href='#failure112'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure110'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-003.js'>js1_5/GetSet/getset-003.js</a> failed</b> <br>
  + [ <a href='#failure109'>Previous Failure</a> | <a href='#failure111'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 48: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure112'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-004.js'>js1_5/GetSet/getset-004.js</a> failed</b> <br>
  - [ <a href='#failure111'>Previous Failure</a> | <a href='#failure113'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure111'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-004.js'>js1_5/GetSet/getset-004.js</a> failed</b> <br>
  + [ <a href='#failure110'>Previous Failure</a> | <a href='#failure112'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 48: TypeError - Value undefined (result of expression obj.__defineSetter__) is not object.<br>
   </tt><br>
  -<a name='failure113'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-005.js'>js1_5/GetSet/getset-005.js</a> failed</b> <br>
  - [ <a href='#failure112'>Previous Failure</a> | <a href='#failure114'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure112'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-005.js'>js1_5/GetSet/getset-005.js</a> failed</b> <br>
  + [ <a href='#failure111'>Previous Failure</a> | <a href='#failure113'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 57: TypeError - Value undefined (result of expression obj.__defineSetter__) is not object.<br>
   </tt><br>
  -<a name='failure114'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-006.js'>js1_5/GetSet/getset-006.js</a> failed</b> <br>
  - [ <a href='#failure113'>Previous Failure</a> | <a href='#failure115'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure113'></a><dd><b>Testcase <a target='other_window' href='./js1_5/GetSet/getset-006.js'>js1_5/GetSet/getset-006.js</a> failed</b> <br>
  + [ <a href='#failure112'>Previous Failure</a> | <a href='#failure114'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 62: TypeError - Value undefined (result of expression obj.__defineSetter__) is not object.<br>
   </tt><br>
  -<a name='failure115'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-90596-001.js'>js1_5/Object/regress-90596-001.js</a> failed</b> <br>
  - [ <a href='#failure114'>Previous Failure</a> | <a href='#failure116'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure114'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-90596-001.js'>js1_5/Object/regress-90596-001.js</a> failed</b> <br>
  + [ <a href='#failure113'>Previous Failure</a> | <a href='#failure115'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 49: TypeError - Value undefined (result of expression obj.toSource) is not object.<br>
   </tt><br>
  -<a name='failure116'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-90596-002.js'>js1_5/Object/regress-90596-002.js</a> failed</b> <br>
  - [ <a href='#failure115'>Previous Failure</a> | <a href='#failure117'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure115'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-90596-002.js'>js1_5/Object/regress-90596-002.js</a> failed</b> <br>
  + [ <a href='#failure114'>Previous Failure</a> | <a href='#failure116'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 49: TypeError - Object  (result of expression uneval) does not allow calls.<br>
   </tt><br>
  -<a name='failure117'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-96284-001.js'>js1_5/Object/regress-96284-001.js</a> failed</b> <br>
  - [ <a href='#failure116'>Previous Failure</a> | <a href='#failure118'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure116'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-96284-001.js'>js1_5/Object/regress-96284-001.js</a> failed</b> <br>
  + [ <a href='#failure115'>Previous Failure</a> | <a href='#failure117'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 50: TypeError - Value undefined (result of expression obj1.toSource) is not object.<br>
   </tt><br>
  -<a name='failure118'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-96284-002.js'>js1_5/Object/regress-96284-002.js</a> failed</b> <br>
  - [ <a href='#failure117'>Previous Failure</a> | <a href='#failure119'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure117'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Object/regress-96284-002.js'>js1_5/Object/regress-96284-002.js</a> failed</b> <br>
  + [ <a href='#failure116'>Previous Failure</a> | <a href='#failure118'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 50: TypeError - Object  (result of expression uneval) does not allow calls.<br>
   </tt><br>
  -<a name='failure119'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-104077.js'>js1_5/Regress/regress-104077.js</a> failed</b> <br>
  - [ <a href='#failure118'>Previous Failure</a> | <a href='#failure120'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure118'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-104077.js'>js1_5/Regress/regress-104077.js</a> failed</b> <br>
  + [ <a href='#failure117'>Previous Failure</a> | <a href='#failure119'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 351: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure120'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-127557.js'>js1_5/Regress/regress-127557.js</a> failed</b> <br>
  - [ <a href='#failure119'>Previous Failure</a> | <a href='#failure121'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure119'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-127557.js'>js1_5/Regress/regress-127557.js</a> failed</b> <br>
  + [ <a href='#failure118'>Previous Failure</a> | <a href='#failure120'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 76: TypeError - Object  (result of expression clone) does not allow calls.<br>
   </tt><br>
  -<a name='failure121'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-156354.js'>js1_5/Regress/regress-156354.js</a> failed</b> <br>
  - [ <a href='#failure120'>Previous Failure</a> | <a href='#failure122'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure120'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-156354.js'>js1_5/Regress/regress-156354.js</a> failed</b> <br>
  + [ <a href='#failure119'>Previous Failure</a> | <a href='#failure121'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 56: TypeError - Value undefined (result of expression this.propertyIsEnumerable) is not object.<br>
   </tt><br>
  -<a name='failure122'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-168347.js'>js1_5/Regress/regress-168347.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=168347' target='other_window'>Bug Number 168347</a><br>
  - [ <a href='#failure121'>Previous Failure</a> | <a href='#failure123'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure121'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-168347.js'>js1_5/Regress/regress-168347.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=168347' target='other_window'>Bug Number 168347</a><br>
  + [ <a href='#failure120'>Previous Failure</a> | <a href='#failure122'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing F.toString()<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 2 of test -<br>
  @@ -1648,15 +1632,15 @@
   --> FAILED!: [reported from test()] Expected value '{--f.i;print("--isucceededi="+f.i);}catch(e){print("--ifailedwith"+e+"i="+f.i);}try{f.i--;print("i--', Actual value '{f.i--;print("--isucceededi="+f.i);}catch(e){print("--ifailedwith"+e+"i="+f.i);}try{f.i--;print("i--'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure123'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-172699.js'>js1_5/Regress/regress-172699.js</a> failed</b> <br>
  - [ <a href='#failure122'>Previous Failure</a> | <a href='#failure124'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure122'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-172699.js'>js1_5/Regress/regress-172699.js</a> failed</b> <br>
  + [ <a href='#failure121'>Previous Failure</a> | <a href='#failure123'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception: URIError - URI error<br>
   </tt><br>
  -<a name='failure124'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-179524.js'>js1_5/Regress/regress-179524.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=179524' target='other_window'>Bug Number 179524</a><br>
  - [ <a href='#failure123'>Previous Failure</a> | <a href='#failure125'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure123'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-179524.js'>js1_5/Regress/regress-179524.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=179524' target='other_window'>Bug Number 179524</a><br>
  + [ <a href='#failure122'>Previous Failure</a> | <a href='#failure124'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Don't crash on extraneous arguments to str.match(), etc.<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 14 of test -<br>
  @@ -1706,16 +1690,16 @@
   --> FAILED!: [reported from test()] Expected value 'SHOULD HAVE FALLEN INTO CATCH-BLOCK!', Actual value 'ABC Zbc'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure125'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-185165.js'>js1_5/Regress/regress-185165.js</a> failed</b> <br>
  - [ <a href='#failure124'>Previous Failure</a> | <a href='#failure126'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure124'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-185165.js'>js1_5/Regress/regress-185165.js</a> failed</b> <br>
  + [ <a href='#failure123'>Previous Failure</a> | <a href='#failure125'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   yylex: ERROR.<br>
   Exception, line 3: SyntaxError - Parse error<br>
   </tt><br>
  -<a name='failure126'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-44009.js'>js1_5/Regress/regress-44009.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=44009' target='other_window'>Bug Number 44009</a><br>
  - [ <a href='#failure125'>Previous Failure</a> | <a href='#failure127'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure125'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-44009.js'>js1_5/Regress/regress-44009.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=44009' target='other_window'>Bug Number 44009</a><br>
  + [ <a href='#failure124'>Previous Failure</a> | <a href='#failure126'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1723,16 +1707,16 @@
   --> STATUS: Testing that we don't crash on obj.toSource()<br>
   Exception, line 61: TypeError - Value undefined (result of expression obj.toSource) is not object.<br>
   </tt><br>
  -<a name='failure127'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-68498-002.js'>js1_5/Regress/regress-68498-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=68498' target='other_window'>Bug Number 68498</a><br>
  - [ <a href='#failure126'>Previous Failure</a> | <a href='#failure128'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure126'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-68498-002.js'>js1_5/Regress/regress-68498-002.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=68498' target='other_window'>Bug Number 68498</a><br>
  + [ <a href='#failure125'>Previous Failure</a> | <a href='#failure127'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Creating a Deletable local variable using eval<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Creating a Deletable local variable using eval; currently at expect[1] within test -<br>
   --> FAILED!: [reported from test()] Expected value 'true', Actual value 'false'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure128'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-68498-003.js'>js1_5/Regress/regress-68498-003.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=68498' target='other_window'>Bug Number 68498</a><br>
  - [ <a href='#failure127'>Previous Failure</a> | <a href='#failure129'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure127'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-68498-003.js'>js1_5/Regress/regress-68498-003.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=68498' target='other_window'>Bug Number 68498</a><br>
  + [ <a href='#failure126'>Previous Failure</a> | <a href='#failure128'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing calling obj.eval(str)<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Testing calling obj.eval(str); currently at expect[1] within test -<br>
  @@ -1740,16 +1724,16 @@
   --> FAILED!: [reported from test()] Expected value '43', Actual value 'false'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure129'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-96128-n.js'>js1_5/Regress/regress-96128-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=96128' target='other_window'>Bug Number 96128</a><br>
  - [ <a href='#failure128'>Previous Failure</a> | <a href='#failure130'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure128'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Regress/regress-96128-n.js'>js1_5/Regress/regress-96128-n.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=96128' target='other_window'>Bug Number 96128</a><br>
  + [ <a href='#failure127'>Previous Failure</a> | <a href='#failure129'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 3, got 0<br>
   Testcase terminated with signal 11<br>
   Complete testcase output was:<br>
   --> BUGNUMBER: 96128<br>
   --> STATUS: Testing that JS infinite recursion protection works<br>
   </tt><br>
  -<a name='failure130'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/regress-185485.js'>js1_5/Scope/regress-185485.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=185485' target='other_window'>Bug Number 185485</a><br>
  - [ <a href='#failure129'>Previous Failure</a> | <a href='#failure131'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure129'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/regress-185485.js'>js1_5/Scope/regress-185485.js</a> failed</b> <a href='http://bugzilla.mozilla.org/show_bug.cgi?id=185485' target='other_window'>Bug Number 185485</a><br>
  + [ <a href='#failure128'>Previous Failure</a> | <a href='#failure130'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>--> STATUS: Testing |with (x) {function f() {}}| when |x.f| already exists<br>
   Failure messages were:<br>
   --> FAILED!: [reported from test()] Section 2 of test -<br>
  @@ -1764,15 +1748,15 @@
   --> FAILED!: [reported from test()] }', Actual value '0'<br>
   --> FAILED!: [reported from test()] <br>
   </tt><br>
  -<a name='failure131'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/regress-220584.js'>js1_5/Scope/regress-220584.js</a> failed</b> <br>
  - [ <a href='#failure130'>Previous Failure</a> | <a href='#failure132'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure130'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/regress-220584.js'>js1_5/Scope/regress-220584.js</a> failed</b> <br>
  + [ <a href='#failure129'>Previous Failure</a> | <a href='#failure131'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
   Exception, line 57: TypeError - Object  (result of expression Script) does not allow calls.<br>
   </tt><br>
  -<a name='failure132'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/scope-001.js'>js1_5/Scope/scope-001.js</a> failed</b> <br>
  - [ <a href='#failure131'>Previous Failure</a> | <a href='#failure133'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
  +<a name='failure131'></a><dd><b>Testcase <a target='other_window' href='./js1_5/Scope/scope-001.js'>js1_5/Scope/scope-001.js</a> failed</b> <br>
  + [ <a href='#failure130'>Previous Failure</a> | <a href='#failure132'>Next Failure</a> | <a href='#tippy_top'>Top of Page</a> ]<br>
   <tt>Expected exit code 0, got 3<br>
   Testcase terminated with signal 0<br>
   Complete testcase output was:<br>
  @@ -1784,9 +1768,9 @@
   <pre>
   <a name='retest_list'></a>
   <h2>Retest List</h2><br>
  -# Retest List, kjs, generated Sun Sep 26 17:58:04 2004.
  +# Retest List, kjs, generated Wed Apr 20 02:42:18 2005.
   # Original test base was: All tests.
  -# 962 of 967 test(s) were completed, 132 failures reported.
  +# 962 of 967 test(s) were completed, 131 failures reported.
   ecma/ExecutionContexts/10.1.6.js
   ecma/GlobalObject/15.1.2.2-2.js
   ecma/LexicalConventions/7.7.3-1.js
  @@ -1831,7 +1815,6 @@
   ecma_3/Object/regress-72773.js
   ecma_3/RegExp/15.10.2-1.js
   ecma_3/RegExp/15.10.6.2-2.js
  -ecma_3/RegExp/octal-002.js
   ecma_3/RegExp/perlstress-001.js
   ecma_3/RegExp/perlstress-002.js
   ecma_3/RegExp/regress-100199.js
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.4106.2.12 +18 -0     WebCore/ChangeLog
  
  Index: ChangeLog
  ===================================================================
  RCS file: /cvs/root/WebCore/ChangeLog,v
  retrieving revision 1.4106.2.11
  retrieving revision 1.4106.2.12
  diff -u -r1.4106.2.11 -r1.4106.2.12
  --- ChangeLog	12 Jul 2005 22:45:56 -0000	1.4106.2.11
  +++ ChangeLog	14 Jul 2005 17:33:29 -0000	1.4106.2.12
  @@ -1,3 +1,21 @@
  +2005-07-14  Adele Peterson  <adele at apple.com>
  +
  +        Merged change from TOT.
  +
  +    2005-04-12  Maciej Stachowiak  <mjs at apple.com>
  +
  +        Reviewed by Richard.
  +
  +	- use custom single-threaded malloc for all non-GC JavaScriptCore
  +	allocations, for a 9.1% speedup on JavaScript iBench
  +
  +        * khtml/ecma/kjs_binding.cpp:
  +        (KJS::UString::UString):
  +        * khtml/ecma/kjs_events.cpp:
  +        (JSAbstractEventListener::handleEvent):
  +        * khtml/ecma/kjs_proxy.cpp:
  +        (KJSProxyImpl::evaluate):
  +
   === WebCore-413.0.6 ===
   
   === WebCore-413.0.5 ===
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.26.10.2 +6 -9      WebCore/khtml/ecma/kjs_binding.cpp
  
  Index: kjs_binding.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_binding.cpp,v
  retrieving revision 1.26.10.1
  retrieving revision 1.26.10.2
  diff -u -r1.26.10.1 -r1.26.10.2
  --- kjs_binding.cpp	25 May 2005 00:06:27 -0000	1.26.10.1
  +++ kjs_binding.cpp	14 Jul 2005 17:33:35 -0000	1.26.10.2
  @@ -317,10 +317,9 @@
   
   UString::UString(const QString &d)
   {
  -  unsigned int len = d.length();
  -  UChar *dat = new UChar[len];
  -  memcpy(dat, d.unicode(), len * sizeof(UChar));
  -  rep = UString::Rep::create(dat, len);
  +  // reinterpret_cast is ugly but in this case safe, since QChar and UChar have the same
  +  // memory layout
  +  rep = UString::Rep::createCopying(reinterpret_cast<const UChar *>(d.unicode()), d.length());
   }
   
   UString::UString(const DOMString &d)
  @@ -329,11 +328,9 @@
       attach(&Rep::null);
       return;
     }
  -
  -  unsigned int len = d.length();
  -  UChar *dat = new UChar[len];
  -  memcpy(dat, d.unicode(), len * sizeof(UChar));
  -  rep = UString::Rep::create(dat, len);
  +  // reinterpret_cast is ugly but in this case safe, since QChar and UChar have the same
  +  // memory layout
  +  rep = UString::Rep::createCopying(reinterpret_cast<const UChar *>(d.unicode()), d.length());
   }
   
   DOMString UString::string() const
  
  
  
  1.42.10.2 +7 -2      WebCore/khtml/ecma/kjs_events.cpp
  
  Index: kjs_events.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_events.cpp,v
  retrieving revision 1.42.10.1
  retrieving revision 1.42.10.2
  diff -u -r1.42.10.1 -r1.42.10.2
  --- kjs_events.cpp	25 May 2005 00:06:27 -0000	1.42.10.1
  +++ kjs_events.cpp	14 Jul 2005 17:33:35 -0000	1.42.10.2
  @@ -98,12 +98,17 @@
           KJS::Interpreter::lock();
           char *message = exec->exception().toObject(exec).get(exec, messagePropertyName).toString(exec).ascii();
           int lineNumber =  exec->exception().toObject(exec).get(exec, "line").toInt32(exec);
  -        UString sourceURL = exec->exception().toObject(exec).get(exec, "sourceURL").toString(exec);
  +        QString sourceURL;
  +        {
  +          // put this in a block to make sure UString is deallocated inside the lock
  +          UString uSourceURL = exec->exception().toObject(exec).get(exec, "sourceURL").toString(exec);
  +          sourceURL = uSourceURL.qstring();
  +        }
           KJS::Interpreter::unlock();
           if (Interpreter::shouldPrintExceptions()) {
   	    printf("(event handler):%s\n", message);
   	}
  -        KWQ(part)->addMessageToConsole(message, lineNumber, sourceURL.qstring());
  +        KWQ(part)->addMessageToConsole(message, lineNumber, sourceURL);
           exec->clearException();
       }
   #else
  
  
  
  1.18.10.2 +3 -0      WebCore/khtml/ecma/kjs_proxy.cpp
  
  Index: kjs_proxy.cpp
  ===================================================================
  RCS file: /cvs/root/WebCore/khtml/ecma/kjs_proxy.cpp,v
  retrieving revision 1.18.10.1
  retrieving revision 1.18.10.2
  diff -u -r1.18.10.1 -r1.18.10.2
  --- kjs_proxy.cpp	25 May 2005 00:06:27 -0000	1.18.10.1
  +++ kjs_proxy.cpp	14 Jul 2005 17:33:36 -0000	1.18.10.2
  @@ -114,7 +114,10 @@
     m_script->setInlineCode(inlineCode);
     KJS::Value thisNode = n.isNull() ? Window::retrieve( m_part ) : getDOMNode(m_script->globalExec(),n);
   
  +  KJS::Interpreter::lock();
     UString code( str );
  +  KJS::Interpreter::unlock();
  +
     Completion comp = m_script->evaluate(filename, baseLine, code, thisNode);
     bool success = ( comp.complType() == Normal ) || ( comp.complType() == ReturnValue );  
   #ifdef KJS_DEBUGGER
  
  
  



More information about the webkit-changes mailing list