Commit a173abd0 authored by mjs@apple.com's avatar mjs@apple.com

JavaScriptCore:

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
parent 176d64b5
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.
......
......@@ -1590,16 +1590,62 @@ void CTI::privateCompileMainPass()
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;
}
......
......@@ -246,7 +246,7 @@ static JSValue* jsTypeStringForValue(ExecState* exec, JSValue* v)
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)
......@@ -264,7 +264,7 @@ static bool jsIsObjectType(JSValue* v)
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)
......@@ -1565,7 +1565,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
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;
}
......@@ -1605,7 +1605,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
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;
}
......@@ -2151,7 +2151,7 @@ JSValue* Machine::privateExecute(ExecutionFlag flag, ExecState* exec, RegisterFi
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;
......@@ -5264,7 +5264,7 @@ JSValue* Machine::cti_op_typeof(CTI_ARGS)
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)
......@@ -5505,24 +5505,6 @@ void Machine::cti_op_debug(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;
......
......@@ -220,8 +220,6 @@ namespace JSC {
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);
......
......@@ -77,9 +77,6 @@ namespace JSC {
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; }
......
......@@ -56,8 +56,6 @@ namespace JSC {
*/
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();
......@@ -145,15 +143,14 @@ namespace JSC {
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()
......
......@@ -21,6 +21,7 @@
#ifndef StringObjectThatMasqueradesAsUndefined_h
#define StringObjectThatMasqueradesAsUndefined_h
#include "JSGlobalObject.h"
#include "StringObject.h"
#include "ustring.h"
......@@ -29,12 +30,23 @@ namespace JSC {
// 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; }
};
......
......@@ -100,6 +100,9 @@ namespace JSC {
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*);
......
......@@ -31,15 +31,21 @@
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;
};
}
......
......@@ -53,15 +53,15 @@ startOver:
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()) {
......
......@@ -192,6 +192,7 @@ public:
OP_GROUP1A_Ev = 0x8F,
OP_CDQ = 0x99,
OP_SETE = 0x94,
OP_SETNE = 0x95,
OP_GROUP2_EvIb = 0xC1,
OP_RET = 0xC3,
OP_GROUP11_EvIz = 0xC7,
......@@ -400,6 +401,18 @@ public:
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);
......@@ -454,6 +467,20 @@ public:
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.
......
......@@ -638,6 +638,7 @@ webcore_sources += \
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 \
......
......@@ -379,6 +379,7 @@ SOURCES += \
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 \
......
......@@ -13392,6 +13392,9 @@
RelativePath="..\bindings\js\JSHTMLAllCollection.h"
>
</File>
<File
RelativePath="..\bindings\js\JSHTMLAllCollection.cpp"
>
<File
RelativePath="..\bindings\js\JSHTMLAppletElementCustom.cpp"
>
......
......@@ -1753,6 +1753,7 @@
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 */; };
......@@ -6396,6 +6397,7 @@
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>"; };
......@@ -12652,6 +12654,7 @@
BCD9C26A0C17AA81005C90A2 /* JSEventTargetNode.cpp */,
BCD9C26B0C17AA81005C90A2 /* JSEventTargetNode.h */,
BC6DC7A00C1A4BFA004E2017 /* JSHTMLAllCollection.h */,
9350E70C0E87500B00189FFF /* JSHTMLAllCollection.cpp */,
A80E7E640A1A82EC007FB8C5 /* JSHTMLInputElementBase.cpp */,
A80E7E630A1A82EC007FB8C5 /* JSHTMLInputElementBase.h */,
A826E8AD0A1A8F2300CD1BB6 /* JSHTMLOptionElementConstructor.cpp */,
......@@ -17690,6 +17693,7 @@
B2F34FE90E82F82700F627CD /* DNSCFNet.cpp in Sources */,
BCEF869F0E844E9D00A85CD5 /* ScrollbarThemeMac.mm in Sources */,
089582550E857A7E00F82C83 /* ImageLoader.cpp in Sources */,
9350E70D0E87500B00189FFF /* JSHTMLAllCollection.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......@@ -60,6 +60,7 @@ This file contains the list of files needed to build WebCore.
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
......
......@@ -150,9 +150,7 @@ JSValue* JSCSSStyleDeclaration::nameGetter(ExecState* exec, const Identifier& pr
// 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));
}
......
/*
* 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
......@@ -26,6 +26,7 @@
#ifndef JSHTMLAllCollection_h
#define JSHTMLAllCollection_h
#include "HTMLCollection.h"
#include "JSHTMLCollection.h"
namespace WebCore {
......@@ -39,8 +40,15 @@ 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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment