2008-09-22 Maciej Stachowiak <mjs@apple.com>
Reviewed by Dave Hyatt.
Based on initial work by Darin Adler.
- replace masqueradesAsUndefined virtual method with a flag in TypeInfo
- use this to JIT inline code for eq_null and neq_null
https://bugs.webkit.org/show_bug.cgi?id=20823
0.5% speedup on SunSpider
~4% speedup on Richards benchmark
* VM/CTI.cpp:
(JSC::CTI::privateCompileMainPass):
* VM/Machine.cpp:
(JSC::jsTypeStringForValue):
(JSC::jsIsObjectType):
(JSC::Machine::privateExecute):
(JSC::Machine::cti_op_is_undefined):
* VM/Machine.h:
* kjs/JSCell.h:
* kjs/JSValue.h:
* kjs/StringObjectThatMasqueradesAsUndefined.h:
(JSC::StringObjectThatMasqueradesAsUndefined::create):
(JSC::StringObjectThatMasqueradesAsUndefined::createStructureID):
* kjs/StructureID.h:
(JSC::StructureID::mutableTypeInfo):
* kjs/TypeInfo.h:
(JSC::TypeInfo::TypeInfo):
(JSC::TypeInfo::masqueradesAsUndefined):
* kjs/operations.cpp:
(JSC::equal):
* masm/X86Assembler.h:
(JSC::X86Assembler::):
(JSC::X86Assembler::setne_r):
(JSC::X86Assembler::setnz_r):
(JSC::X86Assembler::testl_i32m):
WebCore:
2008-09-22 Maciej Stachowiak <mjs@apple.com>
Reviewed by Dave Hyatt.
Based on initial work by Darin Adler.
- replace masqueradesAsUndefined virtual method with a flag in TypeInfo
- use this to JIT inline code for eq_null and neq_null
https://bugs.webkit.org/show_bug.cgi?id=20823
* WebCore.xcodeproj/project.pbxproj:
* WebCore.vcproj/WebCore.vcproj:
* bindings/js/JSCSSStyleDeclarationCustom.cpp:
(WebCore::JSCSSStyleDeclaration::nameGetter):
* bindings/js/JSHTMLAllCollection.cpp: Added.
(WebCore::):
* bindings/js/JSHTMLAllCollection.h:
(WebCore::JSHTMLAllCollection::createStructureID):
(WebCore::JSHTMLAllCollection::toBoolean):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@36764
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2008-09-22 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Dave Hyatt.
+
+ Based on initial work by Darin Adler.
+
+ - replace masqueradesAsUndefined virtual method with a flag in TypeInfo
+ - use this to JIT inline code for eq_null and neq_null
+ https://bugs.webkit.org/show_bug.cgi?id=20823
+
+ 0.5% speedup on SunSpider
+ ~4% speedup on Richards benchmark
+
+ * VM/CTI.cpp:
+ (JSC::CTI::privateCompileMainPass):
+ * VM/Machine.cpp:
+ (JSC::jsTypeStringForValue):
+ (JSC::jsIsObjectType):
+ (JSC::Machine::privateExecute):
+ (JSC::Machine::cti_op_is_undefined):
+ * VM/Machine.h:
+ * kjs/JSCell.h:
+ * kjs/JSValue.h:
+ * kjs/StringObjectThatMasqueradesAsUndefined.h:
+ (JSC::StringObjectThatMasqueradesAsUndefined::create):
+ (JSC::StringObjectThatMasqueradesAsUndefined::createStructureID):
+ * kjs/StructureID.h:
+ (JSC::StructureID::mutableTypeInfo):
+ * kjs/TypeInfo.h:
+ (JSC::TypeInfo::TypeInfo):
+ (JSC::TypeInfo::masqueradesAsUndefined):
+ * kjs/operations.cpp:
+ (JSC::equal):
+ * masm/X86Assembler.h:
+ (JSC::X86Assembler::):
+ (JSC::X86Assembler::setne_r):
+ (JSC::X86Assembler::setnz_r):
+ (JSC::X86Assembler::testl_i32m):
+
2008-09-22 Tor Arne Vestbø <tavestbo@trolltech.com>
Reviewed by Simon.
break;
}
case op_eq_null: {
- emitGetPutArg(instruction[i + 2].u.operand, 0, X86::ecx);
- emitCall(i, Machine::cti_op_eq_null);
- emitPutResult(instruction[i + 1].u.operand);
+ unsigned dst = instruction[i + 1].u.operand;
+ unsigned src1 = instruction[i + 2].u.operand;
+
+ emitGetArg(src1, X86::eax);
+ m_jit.testl_i32r(JSImmediate::TagMask, X86::eax);
+ X86Assembler::JmpSrc isImmediate = m_jit.emitUnlinkedJnz();
+
+ m_jit.movl_mr(OBJECT_OFFSET(JSCell, m_structureID), X86::eax, X86::ecx);
+ m_jit.testl_i32m(MasqueradesAsUndefined, OBJECT_OFFSET(StructureID, m_typeInfo.m_flags), X86::ecx);
+ m_jit.setnz_r(X86::eax);
+
+ X86Assembler::JmpSrc wasNotImmediate = m_jit.emitUnlinkedJmp();
+
+ m_jit.link(isImmediate, m_jit.label());
+
+ m_jit.movl_i32r(~JSImmediate::ExtendedTagBitUndefined, X86::ecx);
+ m_jit.andl_rr(X86::eax, X86::ecx);
+ m_jit.cmpl_i32r(JSImmediate::FullTagTypeNull, X86::ecx);
+ m_jit.sete_r(X86::eax);
+
+ m_jit.link(wasNotImmediate, m_jit.label());
+
+ m_jit.movzbl_rr(X86::eax, X86::eax);
+ emitTagAsBoolImmediate(X86::eax);
+ emitPutResult(dst);
+
i += 3;
break;
}
case op_neq_null: {
- emitGetPutArg(instruction[i + 2].u.operand, 0, X86::ecx);
- emitCall(i, Machine::cti_op_neq_null);
- emitPutResult(instruction[i + 1].u.operand);
+ unsigned dst = instruction[i + 1].u.operand;
+ unsigned src1 = instruction[i + 2].u.operand;
+
+ emitGetArg(src1, X86::eax);
+ m_jit.testl_i32r(JSImmediate::TagMask, X86::eax);
+ X86Assembler::JmpSrc isImmediate = m_jit.emitUnlinkedJnz();
+
+ m_jit.movl_mr(OBJECT_OFFSET(JSCell, m_structureID), X86::eax, X86::ecx);
+ m_jit.testl_i32m(MasqueradesAsUndefined, OBJECT_OFFSET(StructureID, m_typeInfo.m_flags), X86::ecx);
+ m_jit.setz_r(X86::eax);
+
+ X86Assembler::JmpSrc wasNotImmediate = m_jit.emitUnlinkedJmp();
+
+ m_jit.link(isImmediate, m_jit.label());
+
+ m_jit.movl_i32r(~JSImmediate::ExtendedTagBitUndefined, X86::ecx);
+ m_jit.andl_rr(X86::eax, X86::ecx);
+ m_jit.cmpl_i32r(JSImmediate::FullTagTypeNull, X86::ecx);
+ m_jit.setne_r(X86::eax);
+
+ m_jit.link(wasNotImmediate, m_jit.label());
+
+ m_jit.movzbl_rr(X86::eax, X86::eax);
+ emitTagAsBoolImmediate(X86::eax);
+ emitPutResult(dst);
+
i += 3;
break;
}
if (v->isObject()) {
// Return "undefined" for objects that should be treated
// as null when doing comparisons.
- if (static_cast<JSObject*>(v)->masqueradeAsUndefined())
+ if (static_cast<JSObject*>(v)->structureID()->typeInfo().masqueradesAsUndefined())
return jsNontrivialString(exec, "undefined");
CallData callData;
if (static_cast<JSObject*>(v)->getCallData(callData) != CallTypeNone)
if (type == NumberType || type == StringType)
return false;
if (type == ObjectType) {
- if (static_cast<JSObject*>(v)->masqueradeAsUndefined())
+ if (static_cast<JSObject*>(v)->structureID()->typeInfo().masqueradesAsUndefined())
return false;
CallData callData;
if (static_cast<JSObject*>(v)->getCallData(callData) != CallTypeNone)
NEXT_OPCODE;
}
- r[dst] = jsBoolean(!JSImmediate::isImmediate(src) && static_cast<JSCell*>(src)->masqueradeAsUndefined());
+ r[dst] = jsBoolean(!JSImmediate::isImmediate(src) && src->asCell()->structureID()->typeInfo().masqueradesAsUndefined());
++vPC;
NEXT_OPCODE;
}
NEXT_OPCODE;
}
- r[dst] = jsBoolean(JSImmediate::isImmediate(src) || !static_cast<JSCell*>(src)->masqueradeAsUndefined());
+ r[dst] = jsBoolean(JSImmediate::isImmediate(src) || !static_cast<JSCell*>(src)->asCell()->structureID()->typeInfo().masqueradesAsUndefined());
++vPC;
NEXT_OPCODE;
}
int dst = (++vPC)->u.operand;
int src = (++vPC)->u.operand;
JSValue* v = r[src].jsValue(exec);
- r[dst] = jsBoolean(v->isUndefined() || (v->isObject() && static_cast<JSObject*>(v)->masqueradeAsUndefined()));
+ r[dst] = jsBoolean(JSImmediate::isImmediate(v) ? v->isUndefined() : v->asCell()->structureID()->typeInfo().masqueradesAsUndefined());
++vPC;
NEXT_OPCODE;
JSValue* Machine::cti_op_is_undefined(CTI_ARGS)
{
JSValue* v = ARG_src1;
- return jsBoolean(v->isUndefined() || (v->isObject() && static_cast<JSObject*>(v)->masqueradeAsUndefined()));
+ return jsBoolean(JSImmediate::isImmediate(v) ? v->isUndefined() : v->asCell()->structureID()->typeInfo().masqueradesAsUndefined());
}
JSValue* Machine::cti_op_is_boolean(CTI_ARGS)
exec->machine()->debug(exec, codeBlock, scopeChain, r, static_cast<DebugHookID>(debugHookID), firstLine, lastLine);
}
-JSValue* Machine::cti_op_eq_null(CTI_ARGS)
-{
- JSValue* src = ARG_src1;
- if (src->isUndefinedOrNull())
- return jsBoolean(true);
-
- return jsBoolean(!JSImmediate::isImmediate(src) && static_cast<JSCell*>(src)->masqueradeAsUndefined());
-}
-
-JSValue* Machine::cti_op_neq_null(CTI_ARGS)
-{
- JSValue* src = ARG_src1;
- if (src->isUndefinedOrNull())
- return jsBoolean(false);
-
- return jsBoolean(JSImmediate::isImmediate(src) || !static_cast<JSCell*>(src)->masqueradeAsUndefined());
-}
-
void* Machine::cti_vm_throw(CTI_ARGS)
{
ExecState* exec = ARG_exec;
static void SFX_CALL cti_op_put_setter(CTI_ARGS);
static JSValue* SFX_CALL cti_op_new_error(CTI_ARGS);
static void SFX_CALL cti_op_debug(CTI_ARGS);
- static JSValue* SFX_CALL cti_op_eq_null(CTI_ARGS);
- static JSValue* SFX_CALL cti_op_neq_null(CTI_ARGS);
static void* SFX_CALL cti_vm_throw(CTI_ARGS);
static void* SFX_CALL cti_vm_compile(CTI_ARGS);
virtual UString toString(ExecState*) const = 0;
virtual JSObject* toObject(ExecState*) const = 0;
- // WebCore uses this to make document.all and style.filter undetectable
- virtual bool masqueradeAsUndefined() const { return false; }
-
// Garbage collection.
void* operator new(size_t, ExecState*);
void* operator new(size_t, void* placementNewDestination) { return placementNewDestination; }
*/
class JSValue : Noncopyable {
friend class JSCell; // so it can derive from this class
- friend class Heap; // so it can call asCell()
- friend class Machine; // so it can call asCell()
private:
JSValue();
virtual ~JSValue();
JSValue* getJSNumber(); // 0 if this is not a JSNumber or number object
+ JSCell* asCell();
+ const JSCell* asCell() const;
+
private:
bool getPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
bool getPropertySlot(ExecState*, unsigned propertyName, PropertySlot&);
int32_t toInt32SlowCase(ExecState*, bool& ok) const;
uint32_t toUInt32SlowCase(ExecState*, bool& ok) const;
-
- // Implementation details.
- JSCell* asCell();
- const JSCell* asCell() const;
};
inline JSValue::JSValue()
#ifndef StringObjectThatMasqueradesAsUndefined_h
#define StringObjectThatMasqueradesAsUndefined_h
+#include "JSGlobalObject.h"
#include "StringObject.h"
#include "ustring.h"
// WebCore uses this to make style.filter undetectable
class StringObjectThatMasqueradesAsUndefined : public StringObject {
public:
+ static StringObjectThatMasqueradesAsUndefined* create(ExecState* exec, const UString& string)
+ {
+ return new (exec) StringObjectThatMasqueradesAsUndefined(exec,
+ createStructureID(exec->lexicalGlobalObject()->stringPrototype()), string);
+ }
+
+ private:
StringObjectThatMasqueradesAsUndefined(ExecState* exec, PassRefPtr<StructureID> structure, const UString& string)
: StringObject(exec, structure, string)
{
}
- virtual bool masqueradeAsUndefined() const { return true; }
+ static PassRefPtr<StructureID> createStructureID(JSValue* proto)
+ {
+ return StructureID::create(proto, TypeInfo(ObjectType, MasqueradesAsUndefined));
+ }
+
virtual bool toBoolean(ExecState*) const { return false; }
};
const TypeInfo& typeInfo() const { return m_typeInfo; }
+ // For use when first creating a new structure.
+ TypeInfo& mutableTypeInfo() { return m_typeInfo; }
+
JSValue* storedPrototype() const { return m_prototype; }
JSValue* prototypeForLookup(ExecState*);
namespace JSC {
+ // WebCore uses this to make document.all and style.filter undetectable.
+ static const unsigned MasqueradesAsUndefined = 0x1;
+
class TypeInfo {
friend class CTI;
public:
- TypeInfo(JSType type) : m_type(type) { }
-
+ TypeInfo(JSType type, unsigned flags = 0) : m_type(type), m_flags(flags) { }
+
JSType type() const { return m_type; }
+ bool masqueradesAsUndefined() const { return m_flags & MasqueradesAsUndefined; }
+
private:
JSType m_type;
+ unsigned m_flags;
};
}
if (v1->isUndefinedOrNull()) {
if (v2->isUndefinedOrNull())
return true;
- if (!v2->isObject())
+ if (JSImmediate::isImmediate(v2))
return false;
- return static_cast<JSObject*>(v2)->masqueradeAsUndefined();
+ return v2->asCell()->structureID()->typeInfo().masqueradesAsUndefined();
}
if (v2->isUndefinedOrNull()) {
- if (!v1->isObject())
+ if (JSImmediate::isImmediate(v1))
return false;
- return static_cast<JSObject*>(v1)->masqueradeAsUndefined();
+ return v1->asCell()->structureID()->typeInfo().masqueradesAsUndefined();
}
if (v1->isObject()) {
OP_GROUP1A_Ev = 0x8F,
OP_CDQ = 0x99,
OP_SETE = 0x94,
+ OP_SETNE = 0x95,
OP_GROUP2_EvIb = 0xC1,
OP_RET = 0xC3,
OP_GROUP11_EvIz = 0xC7,
sete_r(dst);
}
+ void setne_r(RegisterID dst)
+ {
+ m_buffer->putByte(OP_2BYTE_ESCAPE);
+ m_buffer->putByte(OP_SETNE);
+ m_buffer->putByte(MODRM(3, 0, dst));
+ }
+
+ void setnz_r(RegisterID dst)
+ {
+ setne_r(dst);
+ }
+
void orl_rr(RegisterID src, RegisterID dst)
{
m_buffer->putByte(OP_OR_EvGv);
m_buffer->putIntUnchecked(imm);
}
+ void testl_i32m(int imm, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP3_EvIz);
+ emitModRm_opm(GROUP3_OP_TEST, dst);
+ m_buffer->putInt(imm);
+ }
+
+ void testl_i32m(int imm, int offset, RegisterID dst)
+ {
+ m_buffer->putByte(OP_GROUP3_EvIz);
+ emitModRm_opm(GROUP3_OP_TEST, dst, offset);
+ m_buffer->putInt(imm);
+ }
+
void testl_rr(RegisterID src, RegisterID dst)
{
m_buffer->putByte(OP_TEST_EvGv);
+2008-09-22 Maciej Stachowiak <mjs@apple.com>
+
+ Reviewed by Dave Hyatt.
+
+ Based on initial work by Darin Adler.
+
+ - replace masqueradesAsUndefined virtual method with a flag in TypeInfo
+ - use this to JIT inline code for eq_null and neq_null
+ https://bugs.webkit.org/show_bug.cgi?id=20823
+
+ * WebCore.xcodeproj/project.pbxproj:
+ * WebCore.vcproj/WebCore.vcproj:
+ * bindings/js/JSCSSStyleDeclarationCustom.cpp:
+ (WebCore::JSCSSStyleDeclaration::nameGetter):
+ * bindings/js/JSHTMLAllCollection.cpp: Added.
+ (WebCore::):
+ * bindings/js/JSHTMLAllCollection.h:
+ (WebCore::JSHTMLAllCollection::createStructureID):
+ (WebCore::JSHTMLAllCollection::toBoolean):
+
2008-09-22 Tor Arne Vestbø <tavestbo@trolltech.com>
Reviewed by Simon.
WebCore/bindings/js/JSEventTargetBase.cpp \
WebCore/bindings/js/JSEventTargetBase.h \
WebCore/bindings/js/JSEventTargetNode.cpp \
+ WebCore/bindings/js/JSHTMLAllCollection.cpp \
WebCore/bindings/js/JSEventTargetNode.h \
WebCore/bindings/js/JSHTMLAllCollection.h \
WebCore/bindings/js/JSHTMLAppletElementCustom.cpp \
bindings/js/JSEventCustom.cpp \
bindings/js/JSEventTargetBase.cpp \
bindings/js/JSEventTargetNode.cpp \
+ bindings/js/JSHTMLAllCollection.cpp \
bindings/js/JSHistoryCustom.cpp \
bindings/js/JSJavaScriptCallFrameCustom.cpp \
bindings/js/JSHTMLAppletElementCustom.cpp \
RelativePath="..\bindings\js\JSHTMLAllCollection.h"\r
>\r
</File>\r
+ <File\r
+ RelativePath="..\bindings\js\JSHTMLAllCollection.cpp"\r
+ >\r
<File\r
RelativePath="..\bindings\js\JSHTMLAppletElementCustom.cpp"\r
>\r
934F71420D5A6F4400018D69 /* ResourceError.h in Headers */ = {isa = PBXBuildFile; fileRef = 934F71410D5A6F4400018D69 /* ResourceError.h */; settings = {ATTRIBUTES = (Private, ); }; };
934F71440D5A6F5300018D69 /* AuthenticationChallenge.h in Headers */ = {isa = PBXBuildFile; fileRef = 934F71430D5A6F5300018D69 /* AuthenticationChallenge.h */; settings = {ATTRIBUTES = (Private, ); }; };
934FE9E50B5CA539003E4A73 /* FileChooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 934FE9E40B5CA539003E4A73 /* FileChooser.cpp */; };
+ 9350E70D0E87500B00189FFF /* JSHTMLAllCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9350E70C0E87500B00189FFF /* JSHTMLAllCollection.cpp */; };
9352071909BD3BA500F2038D /* StaticConstructors.h in Headers */ = {isa = PBXBuildFile; fileRef = 9352071709BD3BA500F2038D /* StaticConstructors.h */; };
935207BE09BD410A00F2038D /* LocalizedStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = 935207BD09BD410A00F2038D /* LocalizedStrings.h */; };
935207C009BD412100F2038D /* LocalizedStringsMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 935207BF09BD412000F2038D /* LocalizedStringsMac.mm */; };
934F71410D5A6F4400018D69 /* ResourceError.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ResourceError.h; sourceTree = "<group>"; };
934F71430D5A6F5300018D69 /* AuthenticationChallenge.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AuthenticationChallenge.h; sourceTree = "<group>"; };
934FE9E40B5CA539003E4A73 /* FileChooser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileChooser.cpp; sourceTree = "<group>"; };
+ 9350E70C0E87500B00189FFF /* JSHTMLAllCollection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLAllCollection.cpp; sourceTree = "<group>"; };
9352071709BD3BA500F2038D /* StaticConstructors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StaticConstructors.h; sourceTree = "<group>"; };
935207BD09BD410A00F2038D /* LocalizedStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalizedStrings.h; sourceTree = "<group>"; };
935207BF09BD412000F2038D /* LocalizedStringsMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = LocalizedStringsMac.mm; sourceTree = "<group>"; };
BCD9C26A0C17AA81005C90A2 /* JSEventTargetNode.cpp */,
BCD9C26B0C17AA81005C90A2 /* JSEventTargetNode.h */,
BC6DC7A00C1A4BFA004E2017 /* JSHTMLAllCollection.h */,
+ 9350E70C0E87500B00189FFF /* JSHTMLAllCollection.cpp */,
A80E7E640A1A82EC007FB8C5 /* JSHTMLInputElementBase.cpp */,
A80E7E630A1A82EC007FB8C5 /* JSHTMLInputElementBase.h */,
A826E8AD0A1A8F2300CD1BB6 /* JSHTMLOptionElementConstructor.cpp */,
B2F34FE90E82F82700F627CD /* DNSCFNet.cpp in Sources */,
BCEF869F0E844E9D00A85CD5 /* ScrollbarThemeMac.mm in Sources */,
089582550E857A7E00F82C83 /* ImageLoader.cpp in Sources */,
+ 9350E70D0E87500B00189FFF /* JSHTMLAllCollection.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
bindings/js/JSEventCustom.cpp
bindings/js/JSEventTargetBase.cpp
bindings/js/JSEventTargetNode.cpp
+ bindings/js/JSHTMLAllCollection.cpp
bindings/js/JSHistoryCustom.cpp
bindings/js/JSHTMLAppletElementCustom.cpp
bindings/js/JSHTMLCollectionCustom.cpp
// Make the SVG 'filter' attribute undetectable, to avoid confusion with the IE 'filter' attribute.
if (propertyName == "filter")
- return new (exec) StringObjectThatMasqueradesAsUndefined(exec,
- StringObjectThatMasqueradesAsUndefined::createStructureID(exec->lexicalGlobalObject()->stringPrototype()),
- thisObj->impl()->getPropertyValue(prop));
+ return StringObjectThatMasqueradesAsUndefined::create(exec, thisObj->impl()->getPropertyValue(prop));
return jsString(exec, thisObj->impl()->getPropertyValue(prop));
}
--- /dev/null
+/*
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "JSHTMLAllCollection.h"
+
+using namespace JSC;
+
+namespace WebCore {
+
+const ClassInfo JSHTMLAllCollection::s_info = { "HTMLAllCollection", 0, 0, 0 };
+
+} // namespace WebCore
#ifndef JSHTMLAllCollection_h
#define JSHTMLAllCollection_h
+#include "HTMLCollection.h"
#include "JSHTMLCollection.h"
namespace WebCore {
{
}
+ static PassRefPtr<JSC::StructureID> createStructureID(JSC::JSValue* proto)
+ {
+ return JSC::StructureID::create(proto, JSC::TypeInfo(JSC::ObjectType, JSC::MasqueradesAsUndefined));
+ }
+
+ static const JSC::ClassInfo s_info;
+
+ private:
virtual bool toBoolean(JSC::ExecState*) const { return false; }
- virtual bool masqueradeAsUndefined() const { return true; }
};
} // namespace WebCore