[webkit-changes] cvs commit: WebKit/WebCoreSupport.subproj
WebImageData.m WebTextRenderer.m
Adele
adele at opensource.apple.com
Thu Jul 21 20:10:05 PDT 2005
adele 05/07/21 20:10:04
Modified: . Tag: Safari-2-0-branch ChangeLog
JavaScriptCore.pbproj Tag: Safari-2-0-branch project.pbxproj
kjs Tag: Safari-2-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: Safari-2-0-branch expected.html
. Tag: Safari-2-0-branch ChangeLog
WebCore.pbproj Tag: Safari-2-0-branch project.pbxproj
khtml/css Tag: Safari-2-0-branch css_base.h css_ruleimpl.h
css_valueimpl.h cssstyleselector.h
khtml/ecma Tag: Safari-2-0-branch kjs_binding.cpp
kjs_events.cpp kjs_proxy.cpp
khtml/misc Tag: Safari-2-0-branch arena.cpp
khtml/rendering Tag: Safari-2-0-branch render_style.h
khtml/xml Tag: Safari-2-0-branch dom2_eventsimpl.h
dom2_rangeimpl.h dom2_traversalimpl.h
dom2_viewsimpl.h dom_docimpl.h dom_elementimpl.cpp
dom_elementimpl.h dom_nodeimpl.h dom_stringimpl.h
kwq Tag: Safari-2-0-branch KWQFontFamily.h
KWQKHTMLPart.mm KWQListImpl.mm KWQString.h
KWQString.mm
. Tag: Safari-2-0-branch ChangeLog
Plugins.subproj Tag: Safari-2-0-branch
WebBasePluginPackage.h WebBasePluginPackage.m
WebNetscapePluginPackage.m WebPluginPackage.m
WebCoreSupport.subproj Tag: Safari-2-0-branch WebImageData.m
WebTextRenderer.m
Log:
JavaScriptCore:
Merge from TOT to Safari-2-0-branch
<rdar://problem/4164147>
2005-04-26 Maciej Stachowiak <mjs at apple.com>
Reviewed by Chris.
<rdar://problem/4092136> reproducible crash in KJS::kjs_fast_realloc loading maps.google.com
* kjs/string_object.cpp:
(StringObjectFuncImp::call): Allocate adopted ustring buffer properly.
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:
Merge from TOT to Safari-2-0-branch
<rdar://problem/4164147>
2005-04-17 Maciej Stachowiak <mjs at apple.com>
Reviewed by Darin.
- use single-threaded malloc in places where malloc is hot for an
8% speed improvement on cvs-base
* ForwardingHeaders/misc/fast_malloc.h: Added.
* WebCore.pbproj/project.pbxproj:
* khtml/css/css_base.h:
* khtml/css/css_ruleimpl.h:
* khtml/css/css_valueimpl.h:
* khtml/css/cssstyleselector.h:
* khtml/misc/arena.cpp:
(ArenaAllocate):
(FreeArenaList):
(ArenaFinish):
* khtml/misc/main_thread_malloc.cpp: Added.
* khtml/misc/main_thread_malloc.h: Added.
* khtml/rendering/render_style.h:
* khtml/xml/dom2_eventsimpl.h:
* khtml/xml/dom2_rangeimpl.h:
* khtml/xml/dom2_traversalimpl.h:
* khtml/xml/dom2_viewsimpl.h:
* khtml/xml/dom_docimpl.h:
* khtml/xml/dom_elementimpl.cpp:
(NamedAttrMapImpl::NamedAttrMapImpl):
(NamedAttrMapImpl::clearAttributes):
(NamedAttrMapImpl::operator=):
(NamedAttrMapImpl::addAttribute):
(NamedAttrMapImpl::removeAttribute):
* khtml/xml/dom_elementimpl.h:
* khtml/xml/dom_nodeimpl.h:
* khtml/xml/dom_stringimpl.h:
* kwq/KWQFontFamily.h:
* kwq/KWQListImpl.mm:
* kwq/KWQString.h:
* kwq/KWQString.mm:
(ALLOC_CHAR):
(ALLOC_QCHAR):
(QString::setBufferFromCFString):
(allocatePageNode):
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):
2005-03-11 David Harrison <harrison at apple.com>
Reviewed by Darin.
<rdar://problem/4046602> WebCore invokes undefined behavior when the spell checker isn't running
* kwq/KWQKHTMLPart.mm:
(KWQKHTMLPart::advanceToNextMisspelling):
(KWQKHTMLPart::markMisspellings):
Nil check checker.
WebKit:
Merge from TOT to Safari-2-0-branch
<rdar://problem/4164147>
<rdar://problem/4164149>
2005-07-21 Adele Peterson <adele at apple.com>
Reviewed by Chris Blumenberg.
- fixed <rdar://problem/4132797> don't register thin PPC WebKit plug-ins
Merged fix for:
<rdar://problem/4127100> [WebKit] 8B1016: After installing Acrobat Reader, can no longer see pdf's in Safari
* Plugins.subproj/WebBasePluginPackage.h: Added isNativeLibraryData method.
* Plugins.subproj/WebBasePluginPackage.m: (-[WebBasePluginPackage isNativeLibraryData:]): Added isNativeLibraryData method.
* Plugins.subproj/WebNetscapePluginPackage.m: (-[WebNetscapePluginPackage initWithPath:]):
calls isNativeLibraryData to determine whether or not to register the plug-in.
* Plugins.subproj/WebPluginPackage.m: (-[WebPluginPackage initWithPath:]): ditto.
* WebCoreSupport.subproj/WebImageData.m: (-[WebImageData _checkSolidColor:]): added comment for #ifdef.
2005-07-20 Adele Peterson <adele at apple.com>
Merged fix for:
<rdar://problem/4125127> [WebKit] horizontal rulers don't render on Safari on web.apple.com
* WebCoreSupport.subproj/WebImageData.m:
(-[WebImageData _checkSolidColor:]):
2005-07-20 Adele Peterson <adele at apple.com>
Merged fix for :
<rdar://problem/4118278> mail divide by zero navigating messages
* WebCoreSupport.subproj/WebTextRenderer.m:
(-[WebTextRenderer _extendGlyphToWidthMapToInclude:font:]):
Revision Changes Path
No revision
No revision
1.677.6.10 +241 -0 JavaScriptCore/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/root/JavaScriptCore/ChangeLog,v
retrieving revision 1.677.6.9
retrieving revision 1.677.6.10
diff -u -r1.677.6.9 -r1.677.6.10
--- ChangeLog 22 Jul 2005 01:18:13 -0000 1.677.6.9
+++ ChangeLog 22 Jul 2005 03:09:30 -0000 1.677.6.10
@@ -1,5 +1,246 @@
2005-07-21 Adele Peterson <adele at apple.com>
+ Merge from TOT to Safari-2-0-branch
+ <rdar://problem/4164147>
+
+ 2005-04-26 Maciej Stachowiak <mjs at apple.com>
+
+ Reviewed by Chris.
+
+ <rdar://problem/4092136> reproducible crash in KJS::kjs_fast_realloc loading maps.google.com
+
+ * kjs/string_object.cpp:
+ (StringObjectFuncImp::call): Allocate adopted ustring buffer properly.
+
+ 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:
+
+2005-07-21 Adele Peterson <adele at apple.com>
+
Merge from TOT to Safari-2-0-branch to build with gcc 4.0
<rdar://problem/4164127>
No revision
No revision
1.415.2.6 +35 -0 JavaScriptCore/JavaScriptCore.pbproj/Attic/project.pbxproj
Index: project.pbxproj
===================================================================
RCS file: /cvs/root/JavaScriptCore/JavaScriptCore.pbproj/Attic/project.pbxproj,v
retrieving revision 1.415.2.5
retrieving revision 1.415.2.6
diff -u -r1.415.2.5 -r1.415.2.6
--- project.pbxproj 22 Jul 2005 01:18:14 -0000 1.415.2.5
+++ project.pbxproj 22 Jul 2005 03:09:31 -0000 1.415.2.6
@@ -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.8.2 +52 -52 JavaScriptCore/kjs/collector.cpp
Index: collector.cpp
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/collector.cpp,v
retrieving revision 1.30.8.1
retrieving revision 1.30.8.2
diff -u -r1.30.8.1 -r1.30.8.2
--- collector.cpp 22 Jul 2005 01:18:16 -0000 1.30.8.1
+++ collector.cpp 22 Jul 2005 03:09:32 -0000 1.30.8.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.14.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.14.1
diff -u -r1.8 -r1.8.14.1
--- context.h 22 Apr 2004 16:53:35 -0000 1.8
+++ context.h 22 Jul 2005 03:09:32 -0000 1.8.14.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.16.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.16.1
diff -u -r1.13 -r1.13.16.1
--- identifier.cpp 14 Apr 2004 02:33:59 -0000 1.13
+++ identifier.cpp 22 Jul 2005 03:09:32 -0000 1.13.16.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.10.2 +1 -1 JavaScriptCore/kjs/internal.cpp
Index: internal.cpp
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/internal.cpp,v
retrieving revision 1.53.10.1
retrieving revision 1.53.10.2
diff -u -r1.53.10.1 -r1.53.10.2
--- internal.cpp 26 May 2005 20:26:28 -0000 1.53.10.1
+++ internal.cpp 22 Jul 2005 03:09:32 -0000 1.53.10.2
@@ -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.10.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.10.1
diff -u -r1.25 -r1.25.10.1
--- internal.h 5 Oct 2004 23:19:20 -0000 1.25
+++ internal.h 22 Jul 2005 03:09:32 -0000 1.25.10.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.12.2 +76 -54 JavaScriptCore/kjs/list.cpp
Index: list.cpp
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/list.cpp,v
retrieving revision 1.8.12.1
retrieving revision 1.8.12.2
diff -u -r1.8.12.1 -r1.8.12.2
--- list.cpp 24 May 2005 17:06:38 -0000 1.8.12.1
+++ list.cpp 22 Jul 2005 03:09:32 -0000 1.8.12.2
@@ -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.60.2 +2 -0 JavaScriptCore/kjs/list.h
Index: list.h
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/list.h,v
retrieving revision 1.5.60.1
retrieving revision 1.5.60.2
diff -u -r1.5.60.1 -r1.5.60.2
--- list.h 24 May 2005 17:06:38 -0000 1.5.60.1
+++ list.h 22 Jul 2005 03:09:32 -0000 1.5.60.2
@@ -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.62.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.62.1
diff -u -r1.9 -r1.9.62.1
--- lookup.cpp 22 Jan 2003 00:11:43 -0000 1.9
+++ lookup.cpp 22 Jul 2005 03:09:33 -0000 1.9.62.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.12.2 +71 -80 JavaScriptCore/kjs/nodes.cpp
Index: nodes.cpp
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/nodes.cpp,v
retrieving revision 1.52.12.1
retrieving revision 1.52.12.2
diff -u -r1.52.12.1 -r1.52.12.2
--- nodes.cpp 22 Jul 2005 01:18:16 -0000 1.52.12.1
+++ nodes.cpp 22 Jul 2005 03:09:33 -0000 1.52.12.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.12.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.12.1
diff -u -r1.19 -r1.19.12.1
--- nodes.h 12 Aug 2004 17:21:29 -0000 1.19
+++ nodes.h 22 Jul 2005 03:09:33 -0000 1.19.12.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.12.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.12.1
diff -u -r1.5 -r1.5.12.1
--- operations.cpp 10 Aug 2004 18:43:51 -0000 1.5
+++ operations.cpp 22 Jul 2005 03:09:33 -0000 1.5.12.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.72.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.72.1
diff -u -r1.3 -r1.3.72.1
--- operations.h 15 Apr 2002 23:41:18 -0000 1.3
+++ operations.h 22 Jul 2005 03:09:33 -0000 1.3.72.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.12.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.12.1
diff -u -r1.39 -r1.39.12.1
--- property_map.cpp 19 Aug 2004 16:21:29 -0000 1.39
+++ property_map.cpp 22 Jul 2005 03:09:33 -0000 1.39.12.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.16.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.16.1
diff -u -r1.1 -r1.1.16.1
--- protected_values.h 23 Apr 2004 22:40:31 -0000 1.1
+++ protected_values.h 22 Jul 2005 03:09:33 -0000 1.1.16.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.10.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.10.1
diff -u -r1.9 -r1.9.10.1
--- reference.cpp 9 Oct 2004 21:22:43 -0000 1.9
+++ reference.cpp 22 Jul 2005 03:09:33 -0000 1.9.10.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.16.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.16.1
diff -u -r1.8 -r1.8.16.1
--- reference.h 22 Apr 2004 16:53:35 -0000 1.8
+++ reference.h 22 Jul 2005 03:09:33 -0000 1.8.16.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.10.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.10.1
diff -u -r1.7 -r1.7.10.1
--- scope_chain.h 13 Sep 2004 22:44:28 -0000 1.7
+++ scope_chain.h 22 Jul 2005 03:09:33 -0000 1.7.10.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.22.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.22.1
diff -u -r1.9 -r1.9.22.1
--- simple_number.h 22 Oct 2003 23:18:37 -0000 1.9
+++ simple_number.h 22 Jul 2005 03:09:33 -0000 1.9.22.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.8.2 +5 -8 JavaScriptCore/kjs/string_object.cpp
Index: string_object.cpp
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/string_object.cpp,v
retrieving revision 1.31.8.1
retrieving revision 1.31.8.2
diff -u -r1.31.8.1 -r1.31.8.2
--- string_object.cpp 22 Jul 2005 01:18:16 -0000 1.31.8.1
+++ string_object.cpp 22 Jul 2005 03:09:33 -0000 1.31.8.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: {
@@ -742,7 +739,7 @@
{
UString s;
if (args.size()) {
- UChar *buf = new UChar[args.size()];
+ UChar *buf = static_cast<UChar *>(kjs_fast_malloc(args.size() * sizeof(UChar)));
UChar *p = buf;
ListIterator it = args.begin();
while (it != args.end()) {
1.51.10.2 +32 -43 JavaScriptCore/kjs/ustring.cpp
Index: ustring.cpp
===================================================================
RCS file: /cvs/root/JavaScriptCore/kjs/ustring.cpp,v
retrieving revision 1.51.10.1
retrieving revision 1.51.10.2
diff -u -r1.51.10.1 -r1.51.10.2
--- ustring.cpp 22 Jul 2005 01:18:16 -0000 1.51.10.1
+++ ustring.cpp 22 Jul 2005 03:09:33 -0000 1.51.10.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.10.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.10.1
diff -u -r1.34 -r1.34.10.1
--- ustring.h 15 Sep 2004 00:16:34 -0000 1.34
+++ ustring.h 22 Jul 2005 03:09:33 -0000 1.34.10.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.10.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.10.1
diff -u -r1.23 -r1.23.10.1
--- value.cpp 8 Dec 2004 22:54:45 -0000 1.23
+++ value.cpp 22 Jul 2005 03:09:33 -0000 1.23.10.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.10.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.10.1
diff -u -r1.28 -r1.28.10.1
--- value.h 23 Nov 2004 02:06:13 -0000 1.28
+++ value.h 22 Jul 2005 03:09:33 -0000 1.28.10.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.10.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.10.1
diff -u -r1.10 -r1.10.10.1
--- expected.html 27 Sep 2004 01:01:00 -0000 1.10
+++ expected.html 22 Jul 2005 03:09:36 -0000 1.10.10.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.4104.2.70 +73 -0 WebCore/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/root/WebCore/ChangeLog,v
retrieving revision 1.4104.2.69
retrieving revision 1.4104.2.70
diff -u -r1.4104.2.69 -r1.4104.2.70
--- ChangeLog 22 Jul 2005 01:18:17 -0000 1.4104.2.69
+++ ChangeLog 22 Jul 2005 03:09:38 -0000 1.4104.2.70
@@ -1,5 +1,78 @@
2005-07-21 Adele Peterson <adele at apple.com>
+ Merge from TOT to Safari-2-0-branch
+ <rdar://problem/4164147>
+
+ 2005-04-17 Maciej Stachowiak <mjs at apple.com>
+
+ Reviewed by Darin.
+
+ - use single-threaded malloc in places where malloc is hot for an
+ 8% speed improvement on cvs-base
+
+ * ForwardingHeaders/misc/fast_malloc.h: Added.
+ * WebCore.pbproj/project.pbxproj:
+ * khtml/css/css_base.h:
+ * khtml/css/css_ruleimpl.h:
+ * khtml/css/css_valueimpl.h:
+ * khtml/css/cssstyleselector.h:
+ * khtml/misc/arena.cpp:
+ (ArenaAllocate):
+ (FreeArenaList):
+ (ArenaFinish):
+ * khtml/misc/main_thread_malloc.cpp: Added.
+ * khtml/misc/main_thread_malloc.h: Added.
+ * khtml/rendering/render_style.h:
+ * khtml/xml/dom2_eventsimpl.h:
+ * khtml/xml/dom2_rangeimpl.h:
+ * khtml/xml/dom2_traversalimpl.h:
+ * khtml/xml/dom2_viewsimpl.h:
+ * khtml/xml/dom_docimpl.h:
+ * khtml/xml/dom_elementimpl.cpp:
+ (NamedAttrMapImpl::NamedAttrMapImpl):
+ (NamedAttrMapImpl::clearAttributes):
+ (NamedAttrMapImpl::operator=):
+ (NamedAttrMapImpl::addAttribute):
+ (NamedAttrMapImpl::removeAttribute):
+ * khtml/xml/dom_elementimpl.h:
+ * khtml/xml/dom_nodeimpl.h:
+ * khtml/xml/dom_stringimpl.h:
+ * kwq/KWQFontFamily.h:
+ * kwq/KWQListImpl.mm:
+ * kwq/KWQString.h:
+ * kwq/KWQString.mm:
+ (ALLOC_CHAR):
+ (ALLOC_QCHAR):
+ (QString::setBufferFromCFString):
+ (allocatePageNode):
+
+ 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):
+
+ 2005-03-11 David Harrison <harrison at apple.com>
+
+ Reviewed by Darin.
+
+ <rdar://problem/4046602> WebCore invokes undefined behavior when the spell checker isn't running
+
+ * kwq/KWQKHTMLPart.mm:
+ (KWQKHTMLPart::advanceToNextMisspelling):
+ (KWQKHTMLPart::markMisspellings):
+ Nil check checker.
+
+2005-07-21 Adele Peterson <adele at apple.com>
+
Merge from TOT to Safari-2-0-branch to build with gcc 4.0
<rdar://problem/4164127>
No revision
No revision
1.524.2.16 +33 -1 WebCore/WebCore.pbproj/Attic/project.pbxproj
Index: project.pbxproj
===================================================================
RCS file: /cvs/root/WebCore/WebCore.pbproj/Attic/project.pbxproj,v
retrieving revision 1.524.2.15
retrieving revision 1.524.2.16
diff -u -r1.524.2.15 -r1.524.2.16
--- project.pbxproj 22 Jul 2005 01:18:24 -0000 1.524.2.15
+++ project.pbxproj 22 Jul 2005 03:09:44 -0000 1.524.2.16
@@ -539,7 +539,8 @@
BECE67BE07087B250007C14B,
BEA5E01E075CEDAC0098A432,
9378D9FC07640A46004B97BF,
- EDA4AC98076FB89100DD23EC,
+ EDA5AC98076FB89100DD23EC,
+ 65FD9D2E081D727F00636F54,
B55772C70883262B00DCA277,
B55772DF08833B6300DCA277,
);
@@ -830,6 +831,7 @@
BEA5DBDB075CEDA00098A432,
9378D9FB07640A46004B97BF,
51111AC107BD812C00B7162C,
+ 65FD9D2D081D727F00636F54,
B55772C60883262B00DCA277,
);
isa = PBXSourcesBuildPhase;
@@ -1290,6 +1292,34 @@
settings = {
};
};
+ 65FD9D2B081D727F00636F54 = {
+ fileEncoding = 30;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.cpp.cpp;
+ path = main_thread_malloc.cpp;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 65FD9D2C081D727F00636F54 = {
+ fileEncoding = 30;
+ isa = PBXFileReference;
+ lastKnownFileType = sourcecode.c.h;
+ path = main_thread_malloc.h;
+ refType = 4;
+ sourceTree = "<group>";
+ };
+ 65FD9D2D081D727F00636F54 = {
+ fileRef = 65FD9D2B081D727F00636F54;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
+ 65FD9D2E081D727F00636F54 = {
+ fileRef = 65FD9D2C081D727F00636F54;
+ isa = PBXBuildFile;
+ settings = {
+ };
+ };
//650
//651
//652
@@ -6107,6 +6137,8 @@
F523D28402DE43D7018635CA,
F523D28502DE43D7018635CA,
F523D28602DE43D7018635CA,
+ 65FD9D2B081D727F00636F54,
+ 65FD9D2C081D727F00636F54,
F523D28802DE43D7018635CA,
BC433ACF05D3046F003A5A14,
F523D28902DE43D7018635CA,
No revision
No revision
1.9.10.1 +6 -0 WebCore/khtml/css/css_base.h
Index: css_base.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/css/css_base.h,v
retrieving revision 1.9
retrieving revision 1.9.10.1
diff -u -r1.9 -r1.9.10.1
--- css_base.h 19 Nov 2004 00:12:20 -0000 1.9
+++ css_base.h 22 Jul 2005 03:09:47 -0000 1.9.10.1
@@ -50,6 +50,8 @@
DOMString m_uri;
CSSNamespace* m_parent;
+ MAIN_THREAD_ALLOCATED;
+
CSSNamespace(const DOMString& p, const DOMString& u, CSSNamespace* parent)
:m_prefix(p), m_uri(u), m_parent(parent) {}
~CSSNamespace() { delete m_parent; }
@@ -82,6 +84,8 @@
delete nextSelector;
}
+ MAIN_THREAD_ALLOCATED;
+
void append(CSSSelector* n) {
if (!nextSelector) nextSelector = n; else nextSelector->append(n);
}
@@ -190,6 +194,8 @@
virtual ~StyleBaseImpl() {}
+ MAIN_THREAD_ALLOCATED;
+
// returns the url of the style sheet this object belongs to
DOMString baseURL();
1.12.10.1 +3 -1 WebCore/khtml/css/css_ruleimpl.h
Index: css_ruleimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/css/css_ruleimpl.h,v
retrieving revision 1.12
retrieving revision 1.12.10.1
diff -u -r1.12 -r1.12.10.1
--- css_ruleimpl.h 19 Nov 2004 00:12:20 -0000 1.12
+++ css_ruleimpl.h 22 Jul 2005 03:09:47 -0000 1.12.10.1
@@ -20,7 +20,7 @@
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
- * $Id: css_ruleimpl.h,v 1.12 2004/11/19 00:12:20 darin Exp $
+ * $Id: css_ruleimpl.h,v 1.12.10.1 2005/07/22 03:09:47 adele Exp $
*/
#ifndef _CSS_css_ruleimpl_h_
#define _CSS_css_ruleimpl_h_
@@ -136,6 +136,8 @@
~CSSRuleListImpl();
+ MAIN_THREAD_ALLOCATED;
+
unsigned long length() const { return m_lstCSSRules.count(); }
CSSRuleImpl *item ( unsigned long index ) { return m_lstCSSRules.at( index ); }
1.43.8.1 +6 -0 WebCore/khtml/css/css_valueimpl.h
Index: css_valueimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/css/css_valueimpl.h,v
retrieving revision 1.43
retrieving revision 1.43.8.1
diff -u -r1.43 -r1.43.8.1
--- css_valueimpl.h 28 Feb 2005 23:43:26 -0000 1.43
+++ css_valueimpl.h 22 Jul 2005 03:09:48 -0000 1.43.8.1
@@ -230,6 +230,8 @@
class CounterImpl : public khtml::Shared<CounterImpl> {
public:
+ MAIN_THREAD_ALLOCATED;
+
DOMString identifier() const { return m_identifier; }
DOMString listStyle() const { return m_listStyle; }
DOMString separator() const { return m_separator; }
@@ -244,6 +246,8 @@
RectImpl();
virtual ~RectImpl();
+ MAIN_THREAD_ALLOCATED;
+
CSSPrimitiveValueImpl *top() { return m_top; }
CSSPrimitiveValueImpl *right() { return m_right; }
CSSPrimitiveValueImpl *bottom() { return m_bottom; }
@@ -409,6 +413,8 @@
if(m_value) m_value->deref();
}
+ MAIN_THREAD_ALLOCATED;
+
void setValue(CSSValueImpl *val) {
if (val) val->ref();
if (m_value) m_value->deref();
1.31.10.1 +9 -0 WebCore/khtml/css/cssstyleselector.h
Index: cssstyleselector.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/css/cssstyleselector.h,v
retrieving revision 1.31
retrieving revision 1.31.10.1
diff -u -r1.31 -r1.31.10.1
--- cssstyleselector.h 16 Nov 2004 00:47:54 -0000 1.31
+++ cssstyleselector.h 22 Jul 2005 03:09:48 -0000 1.31.10.1
@@ -29,6 +29,7 @@
#include "rendering/render_style.h"
#include "dom/dom_string.h"
#include "css/css_ruleimpl.h"
+#include "misc/main_thread_malloc.h"
class KHTMLSettings;
class KHTMLView;
@@ -72,6 +73,8 @@
// virtual ~StyleSelector() {};
// virtual RenderStyle *styleForElement(DOM::ElementImpl *e) = 0;
+ MAIN_THREAD_ALLOCATED;
+
enum State {
None = 0x00,
Hover = 0x01,
@@ -227,6 +230,8 @@
:m_position(pos), m_rule(r), m_selector(sel), m_next(0) { if (prev) prev->m_next = this; }
~CSSRuleData() { delete m_next; }
+ MAIN_THREAD_ALLOCATED;
+
uint position() { return m_position; }
DOM::CSSStyleRuleImpl* rule() { return m_rule; }
DOM::CSSSelector* selector() { return m_selector; }
@@ -245,6 +250,8 @@
{ m_first = m_last = new CSSRuleData(pos, rule, sel); }
~CSSRuleDataList() { delete m_first; }
+ MAIN_THREAD_ALLOCATED;
+
CSSRuleData* first() { return m_first; }
CSSRuleData* last() { return m_last; }
@@ -263,6 +270,8 @@
CSSRuleSet();
~CSSRuleSet() { delete m_universalRules; }
+ MAIN_THREAD_ALLOCATED;
+
void addRulesFromSheet(DOM::CSSStyleSheetImpl* sheet, const DOM::DOMString &medium = "screen");
void addRule(DOM::CSSStyleRuleImpl* rule, DOM::CSSSelector* sel);
No revision
No revision
1.26.8.4 +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.8.3
retrieving revision 1.26.8.4
diff -u -r1.26.8.3 -r1.26.8.4
--- kjs_binding.cpp 22 Jul 2005 01:18:29 -0000 1.26.8.3
+++ kjs_binding.cpp 22 Jul 2005 03:09:48 -0000 1.26.8.4
@@ -322,10 +322,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)
@@ -334,11 +333,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.8.5 +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.8.4
retrieving revision 1.42.8.5
diff -u -r1.42.8.4 -r1.42.8.5
--- kjs_events.cpp 22 Jul 2005 01:18:29 -0000 1.42.8.4
+++ kjs_events.cpp 22 Jul 2005 03:09:48 -0000 1.42.8.5
@@ -102,12 +102,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.8.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.8.1
retrieving revision 1.18.8.2
diff -u -r1.18.8.1 -r1.18.8.2
--- kjs_proxy.cpp 22 Jul 2005 01:18:30 -0000 1.18.8.1
+++ kjs_proxy.cpp 22 Jul 2005 03:09:49 -0000 1.18.8.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
No revision
No revision
1.3.8.1 +7 -3 WebCore/khtml/misc/arena.cpp
Index: arena.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/misc/arena.cpp,v
retrieving revision 1.3
retrieving revision 1.3.8.1
diff -u -r1.3 -r1.3.8.1
--- arena.cpp 18 Feb 2005 19:37:48 -0000 1.3
+++ arena.cpp 22 Jul 2005 03:09:49 -0000 1.3.8.1
@@ -45,6 +45,10 @@
#include <stdlib.h>
#include <string.h>
#include "arena.h"
+#include "main_thread_malloc.h"
+
+using khtml::main_thread_malloc;
+using khtml::main_thread_free;
//#define DEBUG_ARENA_MALLOC
#ifdef DEBUG_ARENA_MALLOC
@@ -169,7 +173,7 @@
i++;
printf("Malloc: %d\n", i);
#endif
- a = (Arena*)malloc(sz);
+ a = (Arena*)main_thread_malloc(sz);
if (a) {
a->limit = (uword)a + sz;
a->base = a->avail = (uword)ARENA_ALIGN(pool, a + 1);
@@ -235,7 +239,7 @@
printf("Free: %d\n", i);
}
#endif
- free(a); a = 0;
+ main_thread_free(a); a = 0;
} while ((a = *ap) != 0);
} else {
/* Insert the whole arena chain at the front of the freelist. */
@@ -279,7 +283,7 @@
for (a = arena_freelist; a; a = next) {
next = a->next;
- free(a); a = 0;
+ main_thread_free(a); a = 0;
}
arena_freelist = NULL;
}
No revision
No revision
1.80.8.1 +5 -0 WebCore/khtml/rendering/render_style.h
Index: render_style.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/rendering/render_style.h,v
retrieving revision 1.80
retrieving revision 1.80.8.1
diff -u -r1.80 -r1.80.8.1
--- render_style.h 18 Mar 2005 20:41:58 -0000 1.80
+++ render_style.h 22 Jul 2005 03:09:50 -0000 1.80.8.1
@@ -42,6 +42,7 @@
#include <qapplication.h>
#include "dom/dom_misc.h"
+#include "misc/main_thread_malloc.h"
#include "misc/khtmllayout.h"
#include "misc/shared.h"
#include "rendering/font.h"
@@ -443,6 +444,8 @@
BackgroundLayer();
~BackgroundLayer();
+ MAIN_THREAD_ALLOCATED;
+
CachedImage* backgroundImage() const { return m_image; }
Length backgroundXPosition() const { return m_xPosition; }
Length backgroundYPosition() const { return m_yPosition; }
@@ -592,6 +595,8 @@
~ShadowData() { delete next; }
+ MAIN_THREAD_ALLOCATED;
+
bool operator==(const ShadowData& o) const;
bool operator!=(const ShadowData &o) const {
return !(*this == o);
No revision
No revision
1.24.10.3 +7 -0 WebCore/khtml/xml/dom2_eventsimpl.h
Index: dom2_eventsimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom2_eventsimpl.h,v
retrieving revision 1.24.10.2
retrieving revision 1.24.10.3
diff -u -r1.24.10.2 -r1.24.10.3
--- dom2_eventsimpl.h 27 Apr 2005 21:41:53 -0000 1.24.10.2
+++ dom2_eventsimpl.h 22 Jul 2005 03:09:50 -0000 1.24.10.3
@@ -128,6 +128,8 @@
EventImpl(EventId _id, bool canBubbleArg, bool cancelableArg);
virtual ~EventImpl();
+ MAIN_THREAD_ALLOCATED;
+
EventId id() const { return m_id; }
DOMString type() const;
@@ -432,6 +434,8 @@
RegisteredEventListener(EventImpl::EventId _id, EventListener *_listener, bool _useCapture);
~RegisteredEventListener();
+ MAIN_THREAD_ALLOCATED;
+
bool operator==(const RegisteredEventListener &other);
EventImpl::EventId id;
@@ -447,6 +451,9 @@
public:
ClipboardImpl() { }
virtual ~ClipboardImpl();
+
+ MAIN_THREAD_ALLOCATED;
+
// Is this operation a drag-drop or a copy-paste?
virtual bool isForDragging() const = 0;
1.21.8.1 +3 -1 WebCore/khtml/xml/dom2_rangeimpl.h
Index: dom2_rangeimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom2_rangeimpl.h,v
retrieving revision 1.21
retrieving revision 1.21.8.1
diff -u -r1.21 -r1.21.8.1
--- dom2_rangeimpl.h 11 Mar 2005 16:30:13 -0000 1.21
+++ dom2_rangeimpl.h 22 Jul 2005 03:09:50 -0000 1.21.8.1
@@ -30,7 +30,7 @@
#include <qptrlist.h>
#include "dom/dom2_range.h"
#include "misc/shared.h"
-
+#include "misc/main_thread_malloc.h"
namespace DOM {
class DocumentPtr;
@@ -48,6 +48,8 @@
~RangeImpl();
+ MAIN_THREAD_ALLOCATED;
+
// ### remove the get from these methods (i.e. getStartContainer() -> startContainer())
NodeImpl *startContainer(int &exceptioncode) const;
long startOffset(int &exceptioncode) const;
1.8.12.1 +5 -0 WebCore/khtml/xml/dom2_traversalimpl.h
Index: dom2_traversalimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom2_traversalimpl.h,v
retrieving revision 1.8
retrieving revision 1.8.12.1
diff -u -r1.8 -r1.8.12.1
--- dom2_traversalimpl.h 6 Jul 2004 17:04:45 -0000 1.8
+++ dom2_traversalimpl.h 22 Jul 2005 03:09:50 -0000 1.8.12.1
@@ -30,6 +30,7 @@
#include "dom/dom_node.h"
#include "dom/dom_misc.h"
#include "misc/shared.h"
+#include "misc/main_thread_malloc.h"
namespace DOM {
@@ -42,6 +43,8 @@
NodeFilterImpl(NodeFilterCondition *);
~NodeFilterImpl();
+ MAIN_THREAD_ALLOCATED;
+
short acceptNode(const Node &) const;
private:
@@ -57,6 +60,8 @@
TraversalImpl(NodeImpl *, long whatToShow, NodeFilterImpl *, bool expandEntityReferences);
~TraversalImpl();
+ MAIN_THREAD_ALLOCATED;
+
NodeImpl *root() const { return m_root; }
unsigned long whatToShow() const { return m_whatToShow; }
NodeFilterImpl *filter() const { return m_filter; }
1.4.80.1 +4 -0 WebCore/khtml/xml/dom2_viewsimpl.h
Index: dom2_viewsimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom2_viewsimpl.h,v
retrieving revision 1.4
retrieving revision 1.4.80.1
diff -u -r1.4 -r1.4.80.1
--- dom2_viewsimpl.h 10 Jun 2002 20:07:51 -0000 1.4
+++ dom2_viewsimpl.h 22 Jul 2005 03:09:50 -0000 1.4.80.1
@@ -26,6 +26,7 @@
#include "dom/dom_misc.h"
#include "css/css_valueimpl.h"
#include "misc/shared.h"
+#include "misc/main_thread_malloc.h"
namespace DOM {
@@ -40,6 +41,9 @@
public:
AbstractViewImpl(DocumentImpl *_document);
~AbstractViewImpl();
+
+ MAIN_THREAD_ALLOCATED;
+
DocumentImpl *document() const { return m_document; }
CSSStyleDeclarationImpl *getComputedStyle(ElementImpl *elt, DOMStringImpl *pseudoElt);
protected:
1.104.6.5 +2 -0 WebCore/khtml/xml/dom_docimpl.h
Index: dom_docimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom_docimpl.h,v
retrieving revision 1.104.6.4
retrieving revision 1.104.6.5
diff -u -r1.104.6.4 -r1.104.6.5
--- dom_docimpl.h 12 Jul 2005 20:50:36 -0000 1.104.6.4
+++ dom_docimpl.h 22 Jul 2005 03:09:51 -0000 1.104.6.5
@@ -138,6 +138,8 @@
DOMImplementationImpl();
~DOMImplementationImpl();
+ MAIN_THREAD_ALLOCATED;
+
// DOM methods & attributes for DOMImplementation
bool hasFeature ( const DOMString &feature, const DOMString &version );
DocumentTypeImpl *createDocumentType( const DOMString &qualifiedName, const DOMString &publicId,
1.61.6.2 +9 -9 WebCore/khtml/xml/dom_elementimpl.cpp
Index: dom_elementimpl.cpp
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom_elementimpl.cpp,v
retrieving revision 1.61.6.1
retrieving revision 1.61.6.2
diff -u -r1.61.6.1 -r1.61.6.2
--- dom_elementimpl.cpp 12 Jul 2005 21:16:36 -0000 1.61.6.1
+++ dom_elementimpl.cpp 22 Jul 2005 03:09:51 -0000 1.61.6.2
@@ -734,9 +734,9 @@
NamedAttrMapImpl::NamedAttrMapImpl(ElementImpl *e)
: element(e)
+ , attrs(0)
+ , len(0)
{
- attrs = 0;
- len = 0;
}
NamedAttrMapImpl::~NamedAttrMapImpl()
@@ -886,7 +886,7 @@
attrs[i]->_impl->m_element = 0;
attrs[i]->deref();
}
- delete [] attrs;
+ main_thread_free(attrs);
attrs = 0;
}
len = 0;
@@ -917,7 +917,7 @@
clearAttributes();
len = other.len;
- attrs = new AttributeImpl* [len];
+ attrs = static_cast<AttributeImpl **>(main_thread_malloc(len * sizeof(AttributeImpl *)));
// first initialize attrs vector, then call attributeChanged on it
// this allows attributeChanged to use getAttribute
@@ -939,11 +939,11 @@
void NamedAttrMapImpl::addAttribute(AttributeImpl *attr)
{
// Add the attribute to the list
- AttributeImpl **newAttrs = new AttributeImpl* [len+1];
+ AttributeImpl **newAttrs = static_cast<AttributeImpl **>(main_thread_malloc((len + 1) * sizeof(AttributeImpl *)));
if (attrs) {
for (uint i = 0; i < len; i++)
newAttrs[i] = attrs[i];
- delete [] attrs;
+ main_thread_free(attrs);
}
attrs = newAttrs;
attrs[len++] = attr;
@@ -978,19 +978,19 @@
if (attrs[index]->_impl)
attrs[index]->_impl->m_element = 0;
if (len == 1) {
- delete [] attrs;
+ main_thread_free(attrs);
attrs = 0;
len = 0;
}
else {
- AttributeImpl **newAttrs = new AttributeImpl* [len-1];
+ AttributeImpl **newAttrs = static_cast<AttributeImpl **>(main_thread_malloc((len - 1) * sizeof(AttributeImpl *)));
uint i;
for (i = 0; i < uint(index); i++)
newAttrs[i] = attrs[i];
len--;
for (; i < len; i++)
newAttrs[i] = attrs[i+1];
- delete [] attrs;
+ main_thread_free(attrs);
attrs = newAttrs;
}
1.35.8.2 +2 -0 WebCore/khtml/xml/dom_elementimpl.h
Index: dom_elementimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom_elementimpl.h,v
retrieving revision 1.35.8.1
retrieving revision 1.35.8.2
diff -u -r1.35.8.1 -r1.35.8.2
--- dom_elementimpl.h 12 Jul 2005 21:16:36 -0000 1.35.8.1
+++ dom_elementimpl.h 22 Jul 2005 03:09:51 -0000 1.35.8.2
@@ -66,6 +66,8 @@
{ };
virtual ~AttributeImpl() {};
+ MAIN_THREAD_ALLOCATED;
+
const AtomicString& value() const { return _value; }
const AtomicString& prefix() const { return _prefix; }
NodeImpl::Id id() const { return m_id; }
1.75.8.4 +7 -0 WebCore/khtml/xml/dom_nodeimpl.h
Index: dom_nodeimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom_nodeimpl.h,v
retrieving revision 1.75.8.3
retrieving revision 1.75.8.4
diff -u -r1.75.8.3 -r1.75.8.4
--- dom_nodeimpl.h 12 Jul 2005 21:16:37 -0000 1.75.8.3
+++ dom_nodeimpl.h 22 Jul 2005 03:09:51 -0000 1.75.8.4
@@ -28,6 +28,7 @@
#include "dom/dom_misc.h"
#include "dom/dom_string.h"
#include "dom/dom_node.h"
+#include "misc/main_thread_malloc.h"
#include "misc/helper.h"
#include "misc/shared.h"
#include "dom_atomicstring.h"
@@ -95,6 +96,8 @@
NodeImpl(DocumentPtr *doc);
virtual ~NodeImpl();
+ MAIN_THREAD_ALLOCATED;
+
// DOM methods & attributes for Node
virtual DOMString nodeName() const;
virtual DOMString nodeValue() const;
@@ -566,6 +569,8 @@
NodeListImpl( NodeImpl *_rootNode );
virtual ~NodeListImpl();
+ MAIN_THREAD_ALLOCATED;
+
// DOM methods & attributes for NodeList
virtual unsigned long length() const = 0;
virtual NodeImpl *item ( unsigned long index ) const = 0;
@@ -661,6 +666,8 @@
NamedNodeMapImpl();
virtual ~NamedNodeMapImpl();
+ MAIN_THREAD_ALLOCATED;
+
// DOM methods & attributes for NamedNodeMap
virtual NodeImpl *getNamedItem ( NodeImpl::Id id ) const = 0;
virtual Node removeNamedItem ( NodeImpl::Id id, int &exceptioncode ) = 0;
1.11.10.1 +5 -2 WebCore/khtml/xml/dom_stringimpl.h
Index: dom_stringimpl.h
===================================================================
RCS file: /cvs/root/WebCore/khtml/xml/dom_stringimpl.h,v
retrieving revision 1.11
retrieving revision 1.11.10.1
diff -u -r1.11 -r1.11.10.1
--- dom_stringimpl.h 23 Aug 2004 16:12:00 -0000 1.11
+++ dom_stringimpl.h 22 Jul 2005 03:09:51 -0000 1.11.10.1
@@ -27,9 +27,10 @@
#include "dom/dom_misc.h"
#include "misc/khtmllayout.h"
#include "misc/shared.h"
+#include "misc/main_thread_malloc.h"
-#define QT_ALLOC_QCHAR_VEC( N ) (QChar*) new char[ sizeof(QChar)*( N ) ]
-#define QT_DELETE_QCHAR_VEC( P ) delete[] ((char*)( P ))
+#define QT_ALLOC_QCHAR_VEC( N ) static_cast<QChar*>(main_thread_malloc( sizeof(QChar)*( N ) ))
+#define QT_DELETE_QCHAR_VEC( P ) main_thread_free ((void*)( P ))
namespace DOM {
@@ -48,6 +49,8 @@
DOMStringImpl(const QChar &ch);
~DOMStringImpl();
+ MAIN_THREAD_ALLOCATED;
+
unsigned hash() const { if (_hash == 0) _hash = computeHash(s, l); return _hash; }
static unsigned computeHash(const QChar *, int length);
static unsigned computeHash(const char *);
No revision
No revision
1.3.18.1 +3 -0 WebCore/kwq/KWQFontFamily.h
Index: KWQFontFamily.h
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQFontFamily.h,v
retrieving revision 1.3
retrieving revision 1.3.18.1
diff -u -r1.3 -r1.3.18.1
--- KWQFontFamily.h 30 Jan 2004 07:44:45 -0000 1.3
+++ KWQFontFamily.h 22 Jul 2005 03:09:53 -0000 1.3.18.1
@@ -25,6 +25,7 @@
#include "KWQString.h"
#include "dom_atomicstring.h"
+#include "misc/main_thread_malloc.h"
#ifdef __OBJC__
@class NSString;
@@ -40,6 +41,8 @@
KWQFontFamily(const KWQFontFamily &);
KWQFontFamily &operator=(const KWQFontFamily &);
+ MAIN_THREAD_ALLOCATED;
+
void setFamily(const DOM::AtomicString &);
const DOM::AtomicString& family() const { return _family; }
bool familyIsEmpty() const { return _family.isEmpty(); }
1.628.6.3 +9 -1 WebCore/kwq/KWQKHTMLPart.mm
Index: KWQKHTMLPart.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQKHTMLPart.mm,v
retrieving revision 1.628.6.2
retrieving revision 1.628.6.3
diff -u -r1.628.6.2 -r1.628.6.3
--- KWQKHTMLPart.mm 22 Jul 2005 01:18:35 -0000 1.628.6.2
+++ KWQKHTMLPart.mm 22 Jul 2005 03:09:53 -0000 1.628.6.3
@@ -988,7 +988,11 @@
return QString(); // nothing to search in
}
+ // Get the spell checker if it is available
NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker];
+ if (checker == nil)
+ return QString();
+
WordAwareIterator it(searchRange);
bool wrapped = false;
@@ -4027,8 +4031,12 @@
NodeImpl *editableNodeImpl = searchRange.startContainer().handle();
if (!editableNodeImpl->isContentEditable())
return;
-
+
+ // Get the spell checker if it is available
NSSpellChecker *checker = [NSSpellChecker sharedSpellChecker];
+ if (checker == nil)
+ return;
+
WordAwareIterator it(searchRange);
while (!it.atEnd()) { // we may be starting at the end of the doc, and already by atEnd
1.19.38.1 +3 -0 WebCore/kwq/KWQListImpl.mm
Index: KWQListImpl.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQListImpl.mm,v
retrieving revision 1.19
retrieving revision 1.19.38.1
diff -u -r1.19 -r1.19.38.1
--- KWQListImpl.mm 25 Jul 2003 10:27:37 -0000 1.19
+++ KWQListImpl.mm 22 Jul 2005 03:09:54 -0000 1.19.38.1
@@ -29,12 +29,15 @@
#import <algorithm>
#import <CoreFoundation/CFArray.h>
#import "KWQAssertions.h"
+#import "misc/main_thread_malloc.h"
class KWQListNode
{
public:
KWQListNode(void *d) : data(d), next(NULL), prev(NULL) { }
+ MAIN_THREAD_ALLOCATED;
+
void *data;
KWQListNode *next;
KWQListNode *prev;
1.109.8.1 +3 -0 WebCore/kwq/KWQString.h
Index: KWQString.h
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQString.h,v
retrieving revision 1.109
retrieving revision 1.109.8.1
diff -u -r1.109 -r1.109.8.1
--- KWQString.h 14 Dec 2004 00:10:18 -0000 1.109
+++ KWQString.h 22 Jul 2005 03:09:54 -0000 1.109.8.1
@@ -30,6 +30,7 @@
#include "KWQCString.h"
#include "WebCoreUnicode.h"
+#include "misc/main_thread_malloc.h"
// Make htmltokenizer.cpp happy
#define QT_VERSION 300
@@ -347,6 +348,8 @@
#ifdef QSTRING_DEBUG_ALLOCATIONS
void* operator new(size_t s);
void operator delete(void*p);
+#else
+ MAIN_THREAD_ALLOCATED;
#endif
inline void ref() { refCount++; }
1.137.8.1 +19 -18 WebCore/kwq/KWQString.mm
Index: KWQString.mm
===================================================================
RCS file: /cvs/root/WebCore/kwq/KWQString.mm,v
retrieving revision 1.137
retrieving revision 1.137.8.1
diff -u -r1.137 -r1.137.8.1
--- KWQString.mm 17 Dec 2004 21:56:03 -0000 1.137
+++ KWQString.mm 22 Jul 2005 03:09:54 -0000 1.137.8.1
@@ -33,15 +33,16 @@
#import "KWQString.h"
#import "KWQRegExp.h"
#import "KWQTextCodec.h"
+#import "misc/main_thread_malloc.h"
-#define CHECK_FOR_HANDLE_LEAKS 0
+using khtml::main_thread_malloc;
+using khtml::main_thread_realloc;
+using khtml::main_thread_free;
-// Why can't I find this in a header anywhere? It's too bad we have
-// to wire knowledge of allocation sizes, but it makes a huge diffence.
-extern "C" int malloc_good_size(int size);
+#define CHECK_FOR_HANDLE_LEAKS 0
-#define ALLOC_QCHAR_GOOD_SIZE(X) (malloc_good_size(X*sizeof(QChar))/sizeof(QChar))
-#define ALLOC_CHAR_GOOD_SIZE(X) (malloc_good_size(X))
+#define ALLOC_QCHAR_GOOD_SIZE(X) (X)
+#define ALLOC_CHAR_GOOD_SIZE(X) (X)
#ifdef QSTRING_DEBUG_ALLOCATIONS
@@ -93,7 +94,7 @@
static char *ALLOC_CHAR(int n)
{
- char *ptr = (char *)malloc(n);
+ char *ptr = (char *)main_thread_malloc(n);
CFDictionarySetValue (allocatedBuffers(), ptr, (void *)n);
@@ -126,7 +127,7 @@
static QChar *ALLOC_QCHAR(int n)
{
size_t size = (sizeof(QChar)*( n ));
- QChar *ptr = (QChar *)malloc(size);
+ QChar *ptr = (QChar *)main_thread_malloc(size);
CFDictionarySetValue (allocatedBuffers(), ptr, (const void *)size);
if (size >= ALLOCATION_HISTOGRAM_SIZE)
@@ -206,13 +207,13 @@
#else
-#define ALLOC_CHAR( N ) (char*) malloc(N)
-#define REALLOC_CHAR( P, N ) (char *) realloc(P,N)
-#define DELETE_CHAR( P ) free(P)
-
-#define ALLOC_QCHAR( N ) (QChar*) malloc(sizeof(QChar)*( N ))
-#define REALLOC_QCHAR( P, N ) (QChar *) realloc(P,sizeof(QChar)*( N ))
-#define DELETE_QCHAR( P ) free( P )
+#define ALLOC_CHAR( N ) (char*) main_thread_malloc(N)
+#define REALLOC_CHAR( P, N ) (char *) main_thread_realloc(P,N)
+#define DELETE_CHAR( P ) main_thread_free(P)
+
+#define ALLOC_QCHAR( N ) (QChar*) main_thread_malloc(sizeof(QChar)*( N ))
+#define REALLOC_QCHAR( P, N ) (QChar *) main_thread_realloc(P,sizeof(QChar)*( N ))
+#define DELETE_QCHAR( P ) main_thread_free( P )
#endif // QSTRING_DEBUG_ALLOCATIONS
@@ -757,14 +758,14 @@
UniChar fixedSizeBuffer[1024];
UniChar *buffer;
if (size > (CFIndex)(sizeof(fixedSizeBuffer) / sizeof(UniChar))) {
- buffer = (UniChar *)malloc(size * sizeof(UniChar));
+ buffer = (UniChar *)main_thread_malloc(size * sizeof(UniChar));
} else {
buffer = fixedSizeBuffer;
}
CFStringGetCharacters(cfs, CFRangeMake (0, size), buffer);
setUnicode((const QChar *)buffer, (uint)size);
if (buffer != fixedSizeBuffer) {
- free(buffer);
+ main_thread_free(buffer);
}
}
@@ -2989,7 +2990,7 @@
static HandlePageNode *allocatePageNode()
{
- HandlePageNode *node = (HandlePageNode *)malloc(sizeof(HandlePageNode));
+ HandlePageNode *node = (HandlePageNode *)main_thread_malloc(sizeof(HandlePageNode));
node->next = node->previous = 0;
node->nodes = initializeHandleNodeBlock(node);
return node;
No revision
No revision
1.3118.4.24 +37 -0 WebKit/ChangeLog
Index: ChangeLog
===================================================================
RCS file: /cvs/root/WebKit/ChangeLog,v
retrieving revision 1.3118.4.23
retrieving revision 1.3118.4.24
diff -u -r1.3118.4.23 -r1.3118.4.24
--- ChangeLog 22 Jul 2005 01:18:41 -0000 1.3118.4.23
+++ ChangeLog 22 Jul 2005 03:09:56 -0000 1.3118.4.24
@@ -1,5 +1,42 @@
2005-07-21 Adele Peterson <adele at apple.com>
+ Merge from TOT to Safari-2-0-branch
+ <rdar://problem/4164147>
+ <rdar://problem/4164149>
+
+ 2005-07-21 Adele Peterson <adele at apple.com>
+
+ Reviewed by Chris Blumenberg.
+
+ - fixed <rdar://problem/4132797> don't register thin PPC WebKit plug-ins
+ Merged fix for:
+ <rdar://problem/4127100> [WebKit] 8B1016: After installing Acrobat Reader, can no longer see pdf's in Safari
+
+ * Plugins.subproj/WebBasePluginPackage.h: Added isNativeLibraryData method.
+ * Plugins.subproj/WebBasePluginPackage.m: (-[WebBasePluginPackage isNativeLibraryData:]): Added isNativeLibraryData method.
+ * Plugins.subproj/WebNetscapePluginPackage.m: (-[WebNetscapePluginPackage initWithPath:]):
+ calls isNativeLibraryData to determine whether or not to register the plug-in.
+ * Plugins.subproj/WebPluginPackage.m: (-[WebPluginPackage initWithPath:]): ditto.
+ * WebCoreSupport.subproj/WebImageData.m: (-[WebImageData _checkSolidColor:]): added comment for #ifdef.
+
+ 2005-07-20 Adele Peterson <adele at apple.com>
+
+ Merged fix for:
+ <rdar://problem/4125127> [WebKit] horizontal rulers don't render on Safari on web.apple.com
+
+ * WebCoreSupport.subproj/WebImageData.m:
+ (-[WebImageData _checkSolidColor:]):
+
+ 2005-07-20 Adele Peterson <adele at apple.com>
+
+ Merged fix for :
+ <rdar://problem/4118278> mail divide by zero navigating messages
+
+ * WebCoreSupport.subproj/WebTextRenderer.m:
+ (-[WebTextRenderer _extendGlyphToWidthMapToInclude:font:]):
+
+2005-07-21 Adele Peterson <adele at apple.com>
+
Merge from TOT to Safari-2-0-branch to build with gcc 4.0
<rdar://problem/4164127>
No revision
No revision
1.14.8.1 +2 -0 WebKit/Plugins.subproj/WebBasePluginPackage.h
Index: WebBasePluginPackage.h
===================================================================
RCS file: /cvs/root/WebKit/Plugins.subproj/WebBasePluginPackage.h,v
retrieving revision 1.14
retrieving revision 1.14.8.1
diff -u -r1.14 -r1.14.8.1
--- WebBasePluginPackage.h 14 Jan 2005 01:01:03 -0000 1.14
+++ WebBasePluginPackage.h 22 Jul 2005 03:10:02 -0000 1.14.8.1
@@ -68,4 +68,6 @@
- (BOOL)isQuickTimePlugIn;
- (BOOL)isJavaPlugIn;
+- (BOOL)isNativeLibraryData:(NSData *)data;
+
@end
1.19.8.1 +23 -0 WebKit/Plugins.subproj/WebBasePluginPackage.m
Index: WebBasePluginPackage.m
===================================================================
RCS file: /cvs/root/WebKit/Plugins.subproj/WebBasePluginPackage.m,v
retrieving revision 1.19
retrieving revision 1.19.8.1
diff -u -r1.19 -r1.19.8.1
--- WebBasePluginPackage.m 27 Jan 2005 18:46:07 -0000 1.19
+++ WebBasePluginPackage.m 22 Jul 2005 03:10:02 -0000 1.19.8.1
@@ -17,6 +17,9 @@
#import <CoreFoundation/CFBundlePriv.h>
+#import <mach-o/arch.h>
+#import <mach-o/loader.h>
+
#define JavaCocoaPluginIdentifier @"com.apple.JavaPluginCocoa"
#define JavaCarbonPluginIdentifier @"com.apple.JavaAppletPlugin"
#define JavaCFMPluginFilename @"Java Applet Plugin Enabler"
@@ -384,6 +387,26 @@
[[path lastPathComponent] _web_isCaseInsensitiveEqualToString:JavaCFMPluginFilename];
}
+- (BOOL)isNativeLibraryData:(NSData *)data
+{
+ // If we have a 32-bit thin Mach-O file, see if we have an i386 binary. If not, don't load it.
+ // This is designed to be the safest possible test for now. We'll only reject files that we
+ // can easily tell are wrong.
+ if ([data length] >= sizeof(struct mach_header)) {
+ const NXArchInfo *localArch = NXGetLocalArchInfo();
+ if (localArch != NULL) {
+ struct mach_header *header = (struct mach_header *)[data bytes];
+ if (header->magic == MH_MAGIC) {
+ return (header->cputype == localArch->cputype);
+ }
+ if (header->magic == MH_CIGAM) {
+ return ((cpu_type_t) OSSwapInt32(header->cputype) == localArch->cputype);
+ }
+ }
+ }
+ return YES;
+}
+
@end
@implementation NSArray (WebPluginExtensions)
1.40.8.1 +10 -3 WebKit/Plugins.subproj/WebNetscapePluginPackage.m
Index: WebNetscapePluginPackage.m
===================================================================
RCS file: /cvs/root/WebKit/Plugins.subproj/WebNetscapePluginPackage.m,v
retrieving revision 1.40
retrieving revision 1.40.8.1
diff -u -r1.40 -r1.40.8.1
--- WebNetscapePluginPackage.m 14 Jan 2005 01:01:03 -0000 1.40
+++ WebNetscapePluginPackage.m 22 Jul 2005 03:10:02 -0000 1.40.8.1
@@ -183,14 +183,17 @@
isBundle = YES;
CFBundleGetPackageInfo([bundle _cfBundle], &type, NULL);
}
-#ifdef __ppc__
// Single-file plug-in with resource fork
else {
+#ifdef __ppc__
type = [[[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES] fileHFSTypeCode];
isBundle = NO;
isCFM = YES;
- }
+#else
+ [self release];
+ return nil;
#endif
+ }
if (type != FOUR_CHAR_CODE('BRPL')) {
[self release];
@@ -200,7 +203,7 @@
// Check if the executable is Mach-O or CFM.
if (bundle) {
NSFileHandle *executableFile = [NSFileHandle fileHandleForReadingAtPath:[bundle executablePath]];
- NSData *data = [executableFile readDataOfLength:8];
+ NSData *data = [executableFile readDataOfLength:512];
[executableFile closeFile];
// Check the length of the data before calling memcmp. We think this fixes 3782543.
if (data == nil || [data length] < 8) {
@@ -215,6 +218,10 @@
return nil;
}
#endif
+ if (![self isNativeLibraryData:data]) {
+ [self release];
+ return nil;
+ }
}
if (![self getPluginInfoFromPLists] && ![self getPluginInfoFromResources]) {
1.16.8.1 +8 -0 WebKit/Plugins.subproj/WebPluginPackage.m
Index: WebPluginPackage.m
===================================================================
RCS file: /cvs/root/WebKit/Plugins.subproj/WebPluginPackage.m,v
retrieving revision 1.16
retrieving revision 1.16.8.1
diff -u -r1.16 -r1.16.8.1
--- WebPluginPackage.m 14 Jan 2005 01:01:03 -0000 1.16
+++ WebPluginPackage.m 22 Jul 2005 03:10:02 -0000 1.16.8.1
@@ -43,6 +43,14 @@
return nil;
}
}
+
+ NSFileHandle *executableFile = [NSFileHandle fileHandleForReadingAtPath:[bundle executablePath]];
+ NSData *data = [executableFile readDataOfLength:512];
+ [executableFile closeFile];
+ if (![self isNativeLibraryData:data]) {
+ [self release];
+ return nil;
+ }
if (![self getPluginInfoFromPLists]) {
[self release];
No revision
No revision
1.32.8.2 +6 -0 WebKit/WebCoreSupport.subproj/WebImageData.m
Index: WebImageData.m
===================================================================
RCS file: /cvs/root/WebKit/WebCoreSupport.subproj/WebImageData.m,v
retrieving revision 1.32.8.1
retrieving revision 1.32.8.2
diff -u -r1.32.8.1 -r1.32.8.2
--- WebImageData.m 12 Jul 2005 20:06:34 -0000 1.32.8.1
+++ WebImageData.m 22 Jul 2005 03:10:03 -0000 1.32.8.2
@@ -273,8 +273,14 @@
if( image && CGImageGetWidth(image)==1 && CGImageGetHeight(image)==1 ) {
float pixel[4]; // RGBA
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
+#if __ppc__
CGContextRef bmap = CGBitmapContextCreate(&pixel,1,1,8*sizeof(float),sizeof(pixel),space,
kCGImageAlphaPremultipliedLast | kCGBitmapFloatComponents);
+#else
+ CGContextRef bmap = CGBitmapContextCreate(&pixel,1,1,8*sizeof(float),sizeof(pixel),space,
+ kCGImageAlphaPremultipliedLast | kCGBitmapFloatComponents | kCGBitmapByteOrder32Host);
+#endif
+
if( bmap ) {
CGContextSetCompositeOperation(bmap, kCGCompositeCopy);
CGRect dst = {{0,0},{1,1}};
1.165.8.2 +5 -1 WebKit/WebCoreSupport.subproj/WebTextRenderer.m
Index: WebTextRenderer.m
===================================================================
RCS file: /cvs/root/WebKit/WebCoreSupport.subproj/WebTextRenderer.m,v
retrieving revision 1.165.8.1
retrieving revision 1.165.8.2
diff -u -r1.165.8.1 -r1.165.8.2
--- WebTextRenderer.m 22 Jul 2005 01:18:46 -0000 1.165.8.1
+++ WebTextRenderer.m 22 Jul 2005 03:10:03 -0000 1.165.8.2
@@ -1429,7 +1429,11 @@
}
else
blockSize = INCREMENTAL_BLOCK_SIZE;
- start = (glyphID / blockSize) * blockSize;
+ if (blockSize == 0) {
+ start = 0;
+ } else {
+ start = (glyphID / blockSize) * blockSize;
+ }
end = ((unsigned)start) + blockSize;
if (end > 0xffff)
end = 0xffff;
More information about the webkit-changes
mailing list